指定所有函数的常量寄存器值

逆向工程 艾达 反编译 六线谱
2021-06-16 11:43:52

在固件中,我遇到过在启动时设置一些寄存器值的情况,然后它被隐式用作访问变量的基地址。

例如寄存器 r13 设置为 0x40000000,这是 RAM 的地址。然后在整个代码中,变量被访问为 r13 的偏移量。Hex Rays 根本不喜欢它,并且会生成许多VALUE MAY BE UNDEFINED的红色变量

有没有办法设置寄存器值,以便 Hex Rays 在每个函数中使用它?

编辑:实际上 IDA 在某些情况下会这样做。PowerPC 处理器模块在处理 ELF 文件时似乎知道 __init_registers() 函数,并使用 r13 值来计算相对于 r13 的全局变量偏移量。 在此处输入图片说明

而且我了解到在这种情况下它实际上会创建用户定义的偏移量。

在此处输入图片说明

但仍然不知道它是如何实现的以了解 r13 值。

1个回答

我不知道是否有您可以为此设置的选项,但这是编写 Hex-Rays 插件非常简单的类型。我敢打赌这将少于 25 行代码。如果您可以发送指向二进制文件的链接,我将编写一个脚本来演示。假设您正在编写 IDAPython(细节在 C++ 中只会略有不同),大纲将是:

  1. 从 派生一个类mop_visitor_t,其visit_mop方法: 要求is_target为假;将操作数与 进行比较mop_r如果是,则将.runion 元素与 的微寄存器编号进行比较r13如果找到,用您的常量替换操作数(即调用mop_t::make_number(0x40000000)操作数)。
  2. 派生一个名为R13ReplaceHooksoff 的ida_hexrays.Hexrays_Hooks
  3. 覆盖其microcode方法以mba_t::for_all_ops使用上述访问者的实例进行调用
  4. 在脚本的底部,有一些胶水代码可以轻松安装和移除钩子,如下所示:
try:
    r13replacehooks.unhook()
    del r13replacehooks
except NameError as e:
    pass
finally:
    r13replacehooks = R13ReplaceHooks()
    r13replacehooks.hook()
  1. 而已。

===== 编辑添加 =====

写完上面的答案后,我对这个问题有了一些进一步的想法。

在这种情况下,红色/橙色变量和有关未定义值的警告不是我所期望的。相反,我希望您会看到一堆具有参数__usercall原型,r13然后您会看到需要结构定义的典型代码的讨厌的指针算术,如*(QWORD *)((QWORD)x + 20). 所以我想另一种答案是你可以将这些参数添加到函数原型中,为所讨论的数据部分声明一个大结构,并将r13 __usercall参数定义为指向该结构的指针。

我倾向于认为另一个答案通常更容易使用,但这种方法确实有一个好处:您可以使用Hex-Rays 的“全局跳转到外部参照”功能来跟踪对数据成员的交叉引用。对于另一个答案中的寄存器替换方法,情况并非如此,因为代码中并不真正存在引用;在另一种方法中,这些引用将即时创建,而不是以可以通过普通交叉引用机制浏览的形式存储在数据库中。在这种方法中,引用将通过结构交叉引用永久可用。