使用 IDA 在 amd64 上修补 jmp 指令

逆向工程 艾达 部件
2021-06-25 17:48:28

对于实验,在等待供应商修复错误的同时,希望尝试消除偶尔发生的崩溃。到目前为止,我只完成了替换现有代码的修补工作,没有尝试插入额外的代码。

原来的

.text:000000018000A260                 cmp     [rax], r12d <- RAX=0, crashes program
.text:000000018000A263                 jz      short loc_18000A271
.text:000000018000A265                 cmp     dword ptr [rax], 6
.text:000000018000A268                 jnz     short loc_18000A276
.text:000000018000A26A                 cmp     ecx, 40h

进一步:

.text:000000018000A21B                 mov     rcx, [rsp+388h+var_350]
.text:000000018000A220                 call    cs:WindowsDeleteString
.text:000000018000A226                 mov     [rsp+388h+var_350], r15
.text:000000018000A22B                 mov     rbx, [rsp+388h+var_348]

我想插入一些新指令,改为 jmp 以修补代码

.text:000000018000A260                 jmp     <patched code>

修补代码的想法 - 我找不到太多合适的地方来插入代码 - 所以想缩短 .rdata 部分中的一些非必要字符串以插入此代码 - 这有什么问题吗?基本上我想要做的是如果 RAX = 0 ,跳过使用 [rax]

cmp rax,0
jz .text:000000018000A21B ; The code point past using [rax]
cmp [rax], r12d
jmp .text:000000018000A263 ; Continue program execution normally

现在看来 IDA“组装”并不总是有效,例如 cmp rax,0 它说“无效操作数”所以我不得不修补字节

48 83 F8 00 = cmp rax,0

有没有办法让 IDA 中的“组装”引用我的跳转位置,使用 IDA 中的位置引用。或者是否有建议的方法来计算如何构建我的 jmp/jz 指令。

1个回答

修补代码的想法 - 我找不到太多合适的地方来插入代码 - 所以想缩短 .rdata 部分中的一些非必要字符串以插入此代码 - 这有什么问题吗?

您不应该使用 .rdata 部分,因为它通常不会被标记为执行代码。如果您忽略这一点,您将触发 DEP,并且显然也不建议更改段以允许代码执行。

我建议添加一个段,扩展当前段或在当前段中找到一些空白空间(也许最后有对齐字节)。

有没有办法让 IDA 中的“组装”引用我的跳转位置,使用 IDA 中的位置引用。或者是否有建议的方法来计算如何构建我的 jmp/jz 指令。

您可以仅取两个虚拟地址之间的差异并使用相对跳转(0xE9)。

现在看来 IDA“组装”并不总是有效,例如 cmp rax,0 它说“无效的操作数”

根据 Hex Rays,AMD64 不支持此功能:

只有少数处理器,只有少数指令支持汇编器命令。我们不打算扩展此功能,抱歉

其它你可能感兴趣的问题