如何使用 IDA Pro 在 amd64 Windows DLL 中插入对已导入函数的调用?

逆向工程 艾达 修补 amd64
2021-06-20 14:57:53

我正在尝试修补 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

这有效但很耗时,是否有更好的修补选项可以快速插入调用指令。

1个回答

Keypatch是 IDA 的一个插件,它使用 keystone 来组装补丁指令。它比 IDA 旧的内置汇编器工作得更好,并且应该能够处理 64 位操作数。