IDAPython – Fix Dump x86

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.

 

Compartir

Agregar un comentario