1

问题:

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

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

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

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

现在我不确定这一点,我可能错了,但是......上面的代码是否替换了内存中的“Foo.exe”调用,还是用“fake_function”替换了 dll 的函数?

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

A )我怎样才能在 'Foo,exe' 中找到所有调用MessageBox的内存位置,并用调用 'fake_function' 替换内存位置?

B) detours 是如何解决这个问题的?

4

1 回答 1

1

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

于 2012-11-17T04:34:00.807 回答