假设我在某个内存地址(例如 0x643795)中有这样的函数:
mov ecx, [esp+4]
mov eax, [ecx+19Ch]
and byte ptr [eax+24h], 0
mov ecx, [ecx+60h]
mov [eax+2Ch], ecx
retn
现在,我想知道是否有任何单一的方法来更改这个函数,在这个地址上用 for ex。这样的事情:
mov ecx, [esp+8]
mov ecx, [ecx+19Ch]
retn
因此,我将能够使用我自己的代码更改某些地址中的函数(我主要对 C 解决方案感兴趣)。
最佳答案
C 解决方案,但要小心,不要忘记 nop 对齐:
#include <windows.h>
__declspec(naked) void code()
{
_asm
{
mov ecx, dword ptr [esp + 8]
mov ecx, dword ptr [ecx + 19Ch]
retn
}
}
__declspec(naked) void code_end()
{
_asm{nop}
}
int main()
{
LPVOID MesBox_addr = GetProcAddress(LoadLibraryA("user32.dll"), "MessageBoxA");
DWORD dwOld;
VirtualProtect(MesBox_addr, (DWORD)&code_end - (DWORD)&code, PAGE_EXECUTE_READWRITE, &dwOld);
CopyMemory(MesBox_addr, (LPVOID)&code, (DWORD)&code_end - (DWORD)&code);
MessageBoxA(0, 0, 0, 0);
return 0;
}
关于复制函数到某个内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35296709/