我不知道是否有您可以为此设置的选项,但这是编写 Hex-Rays 插件非常简单的类型。我敢打赌这将少于 25 行代码。如果您可以发送指向二进制文件的链接,我将编写一个脚本来演示。假设您正在编写 IDAPython(细节在 C++ 中只会略有不同),大纲将是:
- 从 派生一个类
mop_visitor_t
,其visit_mop
方法: 要求is_target
为假;将操作数与 进行比较mop_r
;如果是,则将.r
union 元素与 的微寄存器编号进行比较r13
。如果找到,用您的常量替换操作数(即调用mop_t::make_number(0x40000000)
操作数)。
- 派生一个名为
R13ReplaceHooks
off 的类ida_hexrays.Hexrays_Hooks
。
- 覆盖其
microcode
方法以mba_t::for_all_ops
使用上述访问者的实例进行调用。
- 在脚本的底部,有一些胶水代码可以轻松安装和移除钩子,如下所示:
try:
r13replacehooks.unhook()
del r13replacehooks
except NameError as e:
pass
finally:
r13replacehooks = R13ReplaceHooks()
r13replacehooks.hook()
- 而已。
===== 编辑添加 =====
写完上面的答案后,我对这个问题有了一些进一步的想法。
在这种情况下,红色/橙色变量和有关未定义值的警告不是我所期望的。相反,我希望您会看到一堆具有参数的__usercall
原型,r13
然后您会看到需要结构定义的典型代码的讨厌的指针算术,如*(QWORD *)((QWORD)x + 20)
. 所以我想另一种答案是你可以将这些参数添加到函数原型中,为所讨论的数据部分声明一个大结构,并将r13
__usercall
参数定义为指向该结构的指针。
我倾向于认为另一个答案通常更容易使用,但这种方法确实有一个好处:您可以使用Hex-Rays 的“全局跳转到外部参照”功能来跟踪对数据成员的交叉引用。对于另一个答案中的寄存器替换方法,情况并非如此,因为代码中并不真正存在引用;在另一种方法中,这些引用将即时创建,而不是以可以通过普通交叉引用机制浏览的形式存储在数据库中。在这种方法中,引用将通过结构交叉引用永久可用。