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.