C++ exe 中的修补调用

C++ Patching Calls In Exe

本文关键字:修补 调用 exe C++      更新时间:2023-10-16

问题:

我正在注入程序并修补调用,但我想知道是否有任何方法可以逐行浏览应用程序并找到特定的调用。 _IE:假设程序"Foo.exe"在内存中的某个位置调用了 MessageBox

如果我做了以下代码:(只是一个粗略的想法)

a = GetModuleHandle ( "<dll>" ); 
b = GetProcAddress ( a , "<name>" );
swap ( b , (DWORD)*fake_function );
-

一切正常,直到你开始调用实际函数 - 这创造了一个永远持续的巨大循环(哎哟)。

现在我不确定这一点,我可能是错的,但是......上面的代码是替换内存中的"Foo.exe"调用,还是将 DLL 的函数替换为"fake_function"?

我对一些事情感兴趣...

A) 如何在"Foo,exe"中找到调用 MessageBox 的所有内存位置,并将内存位置替换为对"fake_function"的调用?

B) 绕道如何解决这个问题?

不需要找到调用 MessageBox 的所有实例,而是可以挂钩函数。似乎您已经大致了解了,但是您要做的是浏览相关模块的PE导入表。当你走它时,你寻找你想要挂钩的函数,然后你做交换。从那时起,每当模块调用 MessageBox 函数时,它都会在导入表中查找对该函数的引用,并查找函数的地址,该地址以前可以找到 Microsoft 的 MessageBox 实现的地址。在您的函数中,您可以做任何您想做的事情,您甚至可以调用交换时必须保存的 MessageBox 函数的原始地址。