当我用IDA gui反转二进制文件时,所有函数都会被解压缩,而不会有任何问题。
但是当我在没有gui的ida上运行一个自动脚本时,总是有相同的功能,拒绝被解压缩。(当我打开自动化脚本所使用的同一个IDB时,函数就会被解压缩,而不会出现问题)
我正在使用bip。并使用BipFunc.can_decompile来检查一个函数是否可以被解压缩。
编辑:
根据下文的答复,我试图补充以下几点:
if not func.can_decompile:
print(f"can't decompile function 0x{func.ea:04x}, trying again")
decomp_all()
if not func.can_decompile:
print(f"can't decompile function 0x{func.ea:04x}, trying again")
decomp_all_twice_cacheclear()
if not func.can_decompile:
print(f"can't decompile function 0x{func.ea:04x}, skipping...")
return遗憾的是,它没有工作,我每次都会得到所有3张打印,甚至在不同的二进制文件上。
它似乎是固定在IDA Pro 7.6上。
发布于 2021-12-29 13:49:23
您可以从IDA中获得反编译错误的原因有几个。如果它在某些情况下有效,而另一些情况则不起作用,那很可能是因为调用分析。在反编译函数时,IDA将尝试收集由此函数调用的函数的信息,但在某些情况下无法获得这些信息,这将导致反编译失败。但是,一旦该函数被反编译,由IDA获取的信息将被更新,因此调用方函数的反编译现在可以工作了。所以基本上,它意味着你必须按一个顺序解压缩函数,这是一个痛苦的问题,因为最简单的方法是对所有的东西进行两次反编译,但是如果在“大”二进制文件上这样做,可能需要相当长的时间。
我想我把它放在Bip存储库的某个地方,但是我找不到它,所以这里有一个小插件/代码,它应该允许这样做:
from bip import *
class DecompileAll(BipPlugin):
"""
Plugin for decompiling all the function in the binary.
"""
@menu("Bip/DecompileAll/", "Invalidate hexrays caches")
def clear_hxcCache(self):
HxCFunc.invalidate_all_caches()
@menu("Bip/DecompileAll/", "Decompile all func")
def decomp_all(self):
count = 0
for f in HxCFunc.iter_all():
count += 1
print("0x{:X} functions decompiled".format(count))
@menu("Bip/DecompileAll/", "Decompile twice with cache clear")
def decomp_all_twice_cacheclear(self):
HxCFunc.invalidate_all_caches()
self.decomp_all()
self.decomp_all()只是为了了解一下反编译错误的基本原因,这是因为它无法正确地翻译某些代码,因为它不理解程序集,如果分析过程中有问题,并且代码没有被正确检测到,这通常是正确的(如果您处理的是混淆,也会经常发生)。您通常可以通过在IDAPython控制台中告诉您“ADDR分析失败”的错误来查看这种情况,然后查看问题。可能不是你的案子但可能还能帮上忙。
很高兴听到你在用bip。关于BipFunc.can_decompile函数:就像文档(反堆)中指出的那样,它将尝试解压缩该函数,并查看是否发生错误。代码非常直接(https://github.com/synacktiv/bip/blob/master/bip/base/func.py#L372),这主要是为了在使用一行代码时完成的,这与试图反编译时捕获异常是一样的。
https://stackoverflow.com/questions/70291771
复制相似问题