gpt4 book ai didi

c - 热补丁功能

转载 作者:太空狗 更新时间:2023-10-29 15:33:33 25 4
gpt4 key购买 nike

我正在尝试对内存中的 exe 进行热修补,源代码可用,但我这样做是为了学习目的。 (所以请不要评论建议我修改原始来源或使用弯路或任何其他库)

以下是我遇到问题的功能。

vm_t* VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *), vmInterpret_t interpret )
{
MessageBox(NULL, L"Oh snap! We hooked VM_Create!", L"Success!", MB_OK);
return NULL;
}

void Hook_VM_Create(void)
{

DWORD dwBackup;
VirtualProtect((void*)0x00477C3E, 7, PAGE_EXECUTE_READWRITE, &dwBackup);

//Patch the original VM_Create to jump to our detoured one.
BYTE *jmp = (BYTE*)malloc(5);
uint32_t offset = 0x00477C3E - (uint32_t)&VM_Create; //find the offset of the original function from our own
memset((void*)jmp, 0xE9, 1);
memcpy((void*)(jmp+1), &offset, sizeof(offset));
memcpy((void*)0x00477C3E, jmp, 5);

free(jmp);
}

我有一个函数 VM_Create,我想调用它来代替原来的函数。我还没有写蹦床所以它崩溃了(如预期的那样)。但是,不会弹出消息框,表明我已绕过我自己创建的原始 VM。我相信这是我覆盖原始说明的方式。

最佳答案

我可以看到一些问题。

我假设 0x00477C3E 是原始 VM_Create 函数的地址。你真的不应该硬编码这个。请改用 &VM_Create。当然,这意味着您需要为替换函数使用不同的名称。

偏移计算不正确。你的标志错了。更重要的是,偏移量应用于指令的结尾处的指令指针,而不是开头。所以你需要将它移动 5(指令的大小)。偏移量也应该是有符号整数。

理想情况下,如果您考虑到我的第一点,代码将如下所示:

int32_t offset = (int32_t)&New_VM_Create - ((int32_t)&VM_Create+5);

感谢 Hans Passant 修复了我在原始版本中的愚蠢符号错误!

如果您在 64 位机器上工作,您需要在 64 位中进行算术运算,并且在计算出偏移量后,将其截断为 32 位偏移量。

另一个细微差别是您应该在编写新的JMP 指令后将内存重置为只读,并调用FlushInstructionCache。 .

关于c - 热补丁功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com