IDA Hex Rays 无法在自动化中反编译函数

Posted

技术标签:

【中文标题】IDA Hex Rays 无法在自动化中反编译函数【英文标题】:IDA Hex Rays can't decompile function in automation 【发布时间】: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 0xfunc.ea:04x, trying again")
    decomp_all()
    if not func.can_decompile:
        print(f"can't decompile function 0xfunc.ea:04x, trying again")
        decomp_all_twice_cacheclear()
        if not func.can_decompile:
            print(f"can't decompile function 0xfunc.ea:04x, skipping...")
            return

很遗憾,它没有用,我每次都得到所有 3 个打印件,即使在不同的二进制文件上也是如此

【问题讨论】:

【参考方案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),这主要是为了在使用单行代码时完成,它与尝试反编译时捕获异常相同。

【讨论】:

它不起作用

以上是关于IDA Hex Rays 无法在自动化中反编译函数的主要内容,如果未能解决你的问题,请参考以下文章

IDA宏定义

IDA宏定义

IDA逆向常用宏定义

IDA逆向常用宏定义

Android 逆向IDA 工具使用 ( 同步指定的 IDA View 视图 | Hex View 数据格式 | 过滤设置 )

Android 逆向IDA 工具使用 ( 同步指定的 IDA View 视图 | Hex View 数据格式 | 过滤设置 )