让我们说我在某个内存地址中有这样的功能(例如0x643795):
mov ecx, [esp+4]
mov eax, [ecx+19Ch]
and byte ptr [eax+24h], 0
mov ecx, [ecx+60h]
mov [eax+2Ch], ecx
retn
现在,我想知道,如果有任何单一的方法,改变这个功能,在这个地址上用ex。这样的事情:
mov ecx, [esp+8]
mov ecx, [ecx+19Ch]
retn
因此,我能够使用自己的代码更改某个地址的功能(我主要对C解决方案感兴趣)。
答案 0 :(得分:0)
C解决方案,但要小心,不要忘记nop aligment:
#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;
}