gpt4 book ai didi

c++ - 替换汇编指令会改变其他指令

转载 作者:行者123 更新时间:2023-11-30 03:56:38 27 4
gpt4 key购买 nike

我试图在一个函数中放置一个调用指令来模拟一个钩子(Hook),所以我应该替换函数开头的 6 个字节来放置我的调用,其中 2 个字节用于操作码,一个双字用于地址。然而,这是我 Hook 之前函数的反汇编

void realFunction()
{
00B533C0 push ebp
00B533C1 mov ebp,esp
00B533C3 sub esp,0C0h
00B533C9 push ebx
00B533CA push esi
00B533CB push edi
00B533CC lea edi,[ebp-0C0h]
00B533D2 mov ecx,30h
00B533D7 mov eax,0CCCCCCCCh
00B533DC rep stos dword ptr es:[edi]
MessageBox(NULL, "realFunction()", "Trace", MB_OK);
00B533DE mov esi,esp
00B533E0 push 0
00B533E2 push 0B56488h
00B533E7 push 0B56490h
00B533EC push 0
00B533EE call dword ptr ds:[0B5613Ch]
00B533F4 cmp esi,esp
00B533F6 call _RTC_CheckEsp (0B53A10h)
}

奇怪的是,这是我刚替换 6 个字节后的结果

void realFunction()
{
00B533C0 call fakeFunction (0B52EF0h)
00B533C5 rol byte ptr [eax],0 <--
00B533C8 add byte ptr [ebx+56h],dl <--
00B533CB push edi <--
00B533CC lea edi,[ebp-0C0h] <--
00B533D2 mov ecx,30h
00B533D7 mov eax,0CCCCCCCCh
00B533DC rep stos dword ptr es:[edi]
MessageBox(NULL, "realFunction()", "Trace", MB_OK);
00B533DE mov esi,esp
00B533E0 push 0
00B533E2 push 0B56488h
00B533E7 push 0B56490h
00B533EC push 0
00B533EE call dword ptr ds:[0B5613Ch]
00B533F4 cmp esi,esp
00B533F6 call _RTC_CheckEsp (0B53A10h)
}

钩子(Hook)代码

#include <iostream>
#include <windows.h>

using namespace std;

void realFunction()
{
MessageBox(NULL, "realFunction()", "Trace", MB_OK);
}

__declspec(naked) void fakeFunction()
{
__asm {
pushad;
pushfd;
}

MessageBox(NULL, "fakeFunction()", "Trace", MB_OK);

__asm{
popfd;
popad;
ret; //This should return back and resumes the execution of the original function;
}
}

void main()
{
DWORD size = sizeof(double);
DWORD oldProtection;
DWORD realFunctionAddr = (DWORD)realFunction;
DWORD fakeFunctionAddr = (DWORD)fakeFunction;

VirtualProtect((LPVOID)realFunctionAddr, size, PAGE_EXECUTE_READWRITE, &oldProtection);
*((PBYTE)(realFunctionAddr)) = 0xE8;
*((PDWORD)(realFunctionAddr + 1)) = fakeFunctionAddr - realFunctionAddr - 5;
VirtualProtect((LPVOID)fakeFunctionAddr, size, oldProtection, &oldProtection);

realFunction();

while (true){
cin.get();
}
}

我想了解为什么会发生这种情况,为什么不只更改我替换的 6 个字节?

最佳答案

如您所见,sub esp,0C0h 指令从地址 00B533C3 开始,但下一条指令 push ebx 从地址 00B533C9 开始。您已经覆盖了从 00B533C0 到 00B533C5 的地址,因此在您的 6 个字节之后您立即位于 sub esp,0C0h 指令的中间。

反汇编器无法知道某个字节是垃圾而不是指令,因此它会尽可能将字节解释为指令,而您看到的当然是无意义的指令。一段时间后,(巧合的是)一个无意义的指令的结尾与曾经存在的实际指令的结尾重合,所以从那时起反汇编器成功地解释了指令,这就是为什么你的函数的其余部分看起来不错。

如果您查看实际字节,而不是这些字节的汇编语言助记符解释,您会发现没有发生任何奇怪的事情。

(除了,也许,因为你似乎已经替换了 5 个字节,而不是 6 个字节。)

关于c++ - 替换汇编指令会改变其他指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28376719/

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