C++ C++;在Exe中修补调用

C++ C++;在Exe中修补调用,c++,windows,api,hook,C++,Windows,Api,Hook,问题: 我正在注入一个程序并修补调用,但我想知道是否有任何方法可以逐行遍历应用程序并找到特定的调用_IE:假设程序“Foo.exe”在内存中的某个位置调用了MessageBox 如果我执行以下代码:(只是一个粗略的想法) a=GetModuleHandle(“”); b=GetProcAddress(a,“”); 交换(b,(DWORD)*假函数); --一切都很顺利,直到你开始调用实际的函数——这会创建一个永远持续的巨大循环(哎哟) 现在我不确定这一点,我可能是错的,但。。。上面的代码是否替

问题:

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

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

a=GetModuleHandle(“”);
b=GetProcAddress(a,“”);
交换(b,(DWORD)*假函数);
--一切都很顺利,直到你开始调用实际的函数——这会创建一个永远持续的巨大循环(哎哟)

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

我对一些事情感兴趣

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


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

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

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

因此,在上面的代码中,我可以保存地址“a”(MessageBox_函数的内存地址)。然后我可以用汇编来调用它?(没有其他变量的粗略想法){call a}这不会进入一个无限循环并调用我的“fake函数”吗?我想你的粗略想法代码可能是错的。看起来您正在从MessageBox函数所在的DLL中获取该函数的导出地址。将指向MessageBox函数的指针与指向函数的指针交换实际上不会“钩住”MessageBox调用。它只会将包含指向MessageBox(b)指针的变量的内存替换为指向MessageBox替换函数的指针。您可以通过执行b=fake_函数来简化您的粗略想法代码,因此它似乎不是您想要的。您的模块将地址导入MessageBox。您希望更改导入,使其指向您的MessageBox函数,而不是Microsoft的。您的代码只从模块中检索要运行的地址。很抱歉,我的上一条注释假定为“b”而不是“a”。我想我真的不想钓任何东西。我想做的是替换'Foo.exe'中对MessageBox的所有调用,而不是调用我的fake_函数。但我也希望能够在fake_函数中调用MessageBox,而不会引起大循环。因此,如果您使用LoadLibrary和GetProcAddress仅获取MessageBox的地址,以便可以在整个可执行文件中执行搜索和替换,请确保您没有替换导入表中找到的值。如果你这样做,那可能会导致你看到的循环。因此,在上面的代码中,我可以保存地址'a'(MessageBox_函数的内存地址)。然后我可以用汇编来调用它?(没有其他变量的粗略想法){call a}这不会进入一个无限循环并调用我的“fake函数”吗?我想你的粗略想法代码可能是错的。看起来您正在从MessageBox函数所在的DLL中获取该函数的导出地址。将指向MessageBox函数的指针与指向函数的指针交换实际上不会“钩住”MessageBox调用。它只会将包含指向MessageBox(b)指针的变量的内存替换为指向MessageBox替换函数的指针。您可以通过执行b=fake_函数来简化您的粗略想法代码,因此它似乎不是您想要的。您的模块将地址导入MessageBox。您希望更改导入,使其指向您的MessageBox函数,而不是Microsoft的。您的代码只从模块中检索要运行的地址。很抱歉,我的上一条注释假定为“b”而不是“a”。我想我真的不想钓任何东西。我想做的是替换'Foo.exe'中对MessageBox的所有调用,而不是调用我的fake_函数。但我也希望能够在fake_函数中调用MessageBox,而不会引起大循环。因此,如果您使用LoadLibrary和GetProcAddress仅获取MessageBox的地址,以便可以在整个可执行文件中执行搜索和替换,请确保您没有替换导入表中找到的值。如果你这样做,那可能会导致你看到的循环。
a = GetModuleHandle ( "<dll>" ); 
b = GetProcAddress ( a , "<name>" );
swap ( b , (DWORD)*fake_function );