问题:
我正在注入一个程序并修补调用,但我想知道是否有任何方法可以逐行浏览应用程序并找到特定的调用。 _IE:假设程序'Foo.exe'在内存中的某个位置调用 MessageBox 。
如果我做了以下代码:(只是一个粗略的想法)
a = GetModuleHandle ( "<dll>" );
b = GetProcAddress ( a , "<name>" );
swap ( b , (DWORD)*fake_function );
- 一切正常,直到你开始调用实际的函数 - 这会创建一个永远存在的巨大循环(ouch)。
现在我不确定这个,我可能错了但是......上面的代码是否替换了内存中的'Foo.exe'调用,还是用'fake_function'替换了dll的函数?
我对一些事情感兴趣...
A)如何找到调用 MessageBox 的'Foo,exe'中的所有内存位置,并通过调用'fake_function'来替换内存位置?< / p>
B)如何绕路解决这个问题?
答案 0 :(得分:1)
您不需要找到调用MessageBox的所有实例,而是可以挂钩该函数。看起来你有一般的想法,但你想要做的是走PE问题的模块导入表。当你走路时,你会寻找你想要挂钩的功能然后进行交换。从那时起,每当模块调用MessageBox函数时,它将在导入表中查找对该函数的引用,并找到函数的地址,之前它将找到Microsoft的MessageBox实现的地址。在你的函数中,你可以做任何你想做的事情,你甚至可以调用MessageBox函数的原始地址,你必须在交换时保存它。