我正在尝试修补 64 位 Windows DLL 中的函数以加载我插入到 DLL 资源表中的数据。我想插入这样的代码:
mov r8d, 0Ah ; lpType
mov edx, 0h ; lpName
xor ecx, ecx ; hModule
call cs:FindResourceW
mov [rsp+148h+var_B8], rax ; using existing var_B8 to store hResInfo
mov rdx, [rsp+148h+var_B8] ; hResInfo
xor ecx, ecx ; hModule
call cs:LoadResource
mov [rsp+148h+var_B0], rax ; using existing var_B0 to store hResData
mov rcx, [rsp+148h+var_B0] ; hResData
call cs:LockResource
; data is now in location referenced by RAX register
第一个问题似乎是 IDA pro 中的“组装”功能不处理 64 位操作数,因此诸如 mov r8d, 0Ah 之类的指令我必须手动组装并通过字节修补。
但是我不确定如何轻松生成调用 cs:FindResourceW 指令。当“汇编”功能生成代码时,反汇编将其显示为乱码,请在 00000272D0B83B4C 处调用“汇编”指令:
.text:00000272D0B83B3F mov r8d, 0Ah
.text:00000272D0B83B45 mov edx, 0
.text:00000272D0B83B4A xor ecx, ecx
.text:00000272D0B83B4A ; ---------------------------------------------------------------------------
.text:00000272D0B83B4C db 9Ah ; š
.text:00000272D0B83B4D db 40h ; @
.text:00000272D0B83B4E db 94h ; ”
.text:00000272D0B83B4F db 0BDh ; ½
.text:00000272D0B83B50 db 0D0h ; Ð
.text:00000272D0B83B51 db 6
.text:00000272D0B83B52 db 0
.text:00000272D0B83B53 db 89h ; ‰
.text:00000272D0B83B54 db 84h ; „
.text:00000272D0B83B55 ; ---------------------------------------------------------------------------
.text:00000272D0B83B55 and al, 89h
.text:00000272D0B83B55 ; ---------------------------------------------------------------------------
.text:00000272D0B83B57 db 45h ; E
.text:00000272D0B83B58 db 8
对于当前的组装,我从导入表中获取位置:
.idata:00000272D0BD9440 ; HRSRC __stdcall FindResourceW(HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType)
.idata:00000272D0BD9440 extrn FindResourceW:qword
减去我将插入代码的位置,然后减去 6。
272D0B83B4A (Code location)
-272D0BD9440 (Import table location)
-6
===========
00 05 58 F0
然后我用 FF 15 打补丁,然后按相反的顺序对结果进行修补,例如插入字节:
FF 15 F0 58 05 00
这有效但很耗时,是否有更好的修补选项可以快速插入调用指令。