将功能复制到某个存储器地址

时间:2016-02-09 16:08:49

标签: c assembly

让我们说我在某个内存地址中有这样的功能(例如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解决方案感兴趣)。

1 个答案:

答案 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;
}