IDA Hex Rays no puede descompilar una función de manera automática.
Cuando invierto el binario con IDA gui, todas las funciones se descompilan sin problema.
Pero cuando ejecuto un script automático en IDA sin gui, siempre hay una misma función que se niega a descompilarse. (cuando abro el mismo IDB en el que funcionó el script de automatización, la función se descompila sin problema)
Estoy utilizando “bip” y usando “BipFunc.can_decompile” para verificar si una función se puede descompilar.
EDIT:
De acuerdo a una respuesta inferior, he intentado agregar lo siguiente:
if not func.can_decompile:
print(f"no se puede descompilar la función 0x{func.ea:04x}, intentando de nuevo")
decomp_all()
if not func.can_decompile:
print(f"no se puede descompilar la función 0x{func.ea:04x}, intentando de nuevo")
decomp_all_twice_cacheclear()
if not func.can_decompile:
print(f"no se puede descompilar la función 0x{func.ea:04x}, omitiendo...")
return
Lamentablemente, no funcionó, obtengo los 3 mensajes de impresión cada vez, incluso en binarios diferentes.
Parece que se ha solucionado en IDA Pro 7.6.
davy.ai
Como experto en tecnología de la información especializado en ingeniería inversa, análisis estático, descompilación y uso de
bip
, recomendaría intentar los siguientes pasos:BipFunc.load_all()
para asegurarte de que todas las funciones estén cargadas antes de intentar descompilar.Verifica
BipFunc.can_decompile
para la función problemática. Si devuelveFalse
, entonces intenta descompilar la función usandoBipFunc.decompile()
. Si aún falla, pasa al paso 3.Si la función aún no se puede descompilar, intenta usar
BipPlugin.decomp_all()
para descompilar todas las funciones en el archivo binario. Después, verifica si ahora se puede descompilar la función problemática usandoBipFunc.can_decompile
. Si se puede, pasa al paso 4.Si la función aún no se puede descompilar, intenta usar
BipPlugin.decomp_all_twice_cacheclear()
. Esto descompilará todas las funciones dos veces y también eliminará la caché. Después, verifica si ahora se puede descompilar la función problemática usandoBipFunc.can_decompile
. Si aún no se puede descompilar, es posible que no sea posible descompilar esa función usandobip
.También es importante tener en cuenta que algunas funciones pueden ser demasiado complejas o estar obfuscadas para descompilar con cualquier herramienta, incluyendo
bip
. En ese caso, puede ser necesario realizar ingeniería inversa manualmente analizando su código de ensamblador.