Descripción
Script en IDAPython para generar un dump en PE x86.
IDAPython Script
#!/usr/bin/env python # Binary Dump - PE x86 # by UND3R # 08/05/2018 def getSize(fileobject): fileobject.seek(0,2) size = fileobject.tell() return size info = idaapi.get_inf_structure() if(not info.is_32bit()): idc.Message('[Error] Arquitectura incorrecta.\n') sys.exit(1) segmento_actual = idc.FirstSeg() inicio_default = 0xFFFFFFFF fin_default = 0x0 while True: atributo = idc.GetSegmentAttr(segmento_actual,SEGATTR_FLAGS) if(atributo > 15): # flag L activado if(segmento_actual < inicio_default): inicio_default = segmento_actual if(segmento_actual > fin_default): fin_default = segmento_actual segmento_actual = idc.NextSeg(segmento_actual) if(segmento_actual == 0xFFFFFFFF): break fin_default = idc.SegEnd(fin_default) inicio = idc.AskAddr(inicio_default, 'Inicio dump:') fin = idc.AskAddr(fin_default, 'Fin dump:') if((inicio == None or fin == None) or (inicio == 0 or fin == 0)): idc.Message('[Error] Debes introducir el address de Inicio y Fin.\n') elif((inicio > fin) or (inicio == fin)): idc.Message('[Error] Rango incorrecto.\n') else: fix_dump = idc.AskYN(0, 'Reparar dump?') if(fix_dump == -1): idc.Message('[Error] Script cancelado.\n') sys.exit(1) elif(fix_dump == 1): idc.Message('[Info] Reparando dump en memoria...\n') offset_pe_signature = idc.DbgDword(inicio_default+0x3C) section = inicio_default+offset_pe_signature+0xF8 while True: virtual_size = section + 0x08 virtual_address = virtual_size + 0x04 size_of_raw_data = virtual_address + 0x04 pointer_to_raw_data = size_of_raw_data + 0x04 val_virtual_size = idc.DbgDword(virtual_size) val_virtual_address = idc.DbgDword(virtual_address) idc.PatchDword(size_of_raw_data, val_virtual_size) idc.PatchDword(pointer_to_raw_data, val_virtual_address) section += 0x28 if(idc.DbgByte(section) == 0x00): idc.Message('[Info] Dump reparado correctamente.\n') break file = idc.GetInputFile() newFileBytes = [] f = open(file[:-4] + '_dump.exe', 'wb') idc.Message('[Info] Generando dump...\n') for ea in range(inicio, fin): newFileBytes.append(idc.Byte(ea)) f.write(bytearray(newFileBytes)) idc.Message('[Info] Dump generado correctamente.\n') idc.Message('[Info] %d bytes escritos.\n' % (getSize(f))) f.close()
Características
- Detección automática de rango de secciones con el flag loader (L) activado.
- Reparación de la cabecera PE (similar a PEditor).
Requerimientos
- EIP debe estar posicionado en OEP.
Agregar un comentario
Debes iniciar sesión para comentar.