首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDA十六进制射线在自动化中不能分解函数

IDA十六进制射线在自动化中不能分解函数
EN

Stack Overflow用户
提问于 2021-12-09 14:38:43
回答 1查看 850关注 0票数 0

当我用IDA gui反转二进制文件时,所有函数都会被解压缩,而不会有任何问题。

但是当我在没有gui的ida上运行一个自动脚本时,总是有相同的功能,拒绝被解压缩。(当我打开自动化脚本所使用的同一个IDB时,函数就会被解压缩,而不会出现问题)

我正在使用bip。并使用BipFunc.can_decompile来检查一个函数是否可以被解压缩。

编辑:

根据下文的答复,我试图补充以下几点:

代码语言:javascript
复制
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上。

EN

回答 1

Stack Overflow用户

发布于 2021-12-29 13:49:23

您可以从IDA中获得反编译错误的原因有几个。如果它在某些情况下有效,而另一些情况则不起作用,那很可能是因为调用分析。在反编译函数时,IDA将尝试收集由此函数调用的函数的信息,但在某些情况下无法获得这些信息,这将导致反编译失败。但是,一旦该函数被反编译,由IDA获取的信息将被更新,因此调用方函数的反编译现在可以工作了。所以基本上,它意味着你必须按一个顺序解压缩函数,这是一个痛苦的问题,因为最简单的方法是对所有的东西进行两次反编译,但是如果在“大”二进制文件上这样做,可能需要相当长的时间。

我想我把它放在Bip存储库的某个地方,但是我找不到它,所以这里有一个小插件/代码,它应该允许这样做:

代码语言:javascript
复制
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),这主要是为了在使用一行代码时完成的,这与试图反编译时捕获异常是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70291771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档