有人说这样做是为了避免扫描 WPM 调用:
__declspec(naked) BOOL WINAPI SafeWriteProcessMemory(HANDLE hProcess,
LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize,
SIZE_T *lpNumberOfBytesRead)
{
__asm
{
mov edi, edi
push ebp
mov ebp, esp
pop ebp
mov eax, WriteProcessMemory
add eax, 6
jmp eax
}
}
我把它放在一个程序中并在olly中调试它。我看着kernel32.WriteProcessMemory
。我们正在使用add eax, 6
从这里跳转:
MOV EDI,EDI ; BOOL kernel32.WriteProcessMemory(hProcess, ...)
PUSH EBP
MOV EBP,ESP
POP EBP
JMP <JMP.&API-MS-Win-Core-Memory-L1-1-0. ; Jump to KERNELBASE.WriteProcessMemory
到那里。有效地跳过两者之间的指令。我们在自己的调用中执行这些指令。但我不明白为什么要执行这些指令。我们正在推EBP
入堆栈,ESP
进入EBP
,然后EBP
从堆栈中恢复。那实际上不应该做任何事情。
我逐条指令调试它,但仍然无法弄清楚为什么要这样做。
是不是和windowsmov edi,edi
在函数开头的无用s允许跳转补丁有关系?