复制函数到某个内存地址

标签 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

现在,我想知道是否有任何单一的方法来更改这个函数,在这个地址上用 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/

相关文章:

c - main函数和其他函数局部变量的区别

c - 动态数组 : Separating Numbers into Even and Odd Using C

objective-c - 有放回加权随机抽样的高效算法

assembly - 如何在裸机 16 位 x86 程序集中休眠?

c - Vararg x86-64 ABI。寄存器中浮点参数的数量

c - 用户空间的汇编程序

c++ - 将数字求和到 N 的最快算法

c - 如何在 C 中将指针重新分配给较小的数组?

c - 如何在 C 中抛出异常?

c++ - 为什么我们用汇编语言编写操作系统的一部分,而用高级语言(如c)编写一部分操作系统?