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