【问题标题】:IDA Hex Rays can't decompile function in automationIDA Hex Rays 无法在自动化中反编译函数
【发布时间】:2022-01-14 09:27:20
【问题描述】:

当我使用 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 个打印件,即使在不同的二进制文件上也是如此

【问题讨论】:

    标签: reverse-engineering static-analysis decompiling ida


    【解决方案1】:

    在从 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://synacktiv.github.io/bip/build/html/base/func.html#bip.base.BipFunction.can_decompile)中指出的那样,它只会尝试反编译函数并查看是否发生错误。代码非常简单(https://github.com/synacktiv/bip/blob/master/bip/base/func.py#L372),这主要是为了在使用单行代码时完成,它与尝试反编译时捕获异常相同。

    【讨论】:

    • 它不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2022-08-04
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多