【问题标题】:C++ Patching Calls In Exe在 Exe 中的 C++ 修补调用
【发布时间】:2012-11-17 03:46:38
【问题描述】:

问题:

我正在注入程序并修补调用,但我想知道是否有任何方法可以逐行遍历应用程序并找到特定调用。 _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 是如何解决这个问题的?

【问题讨论】:

    标签: c++ windows api hook


    【解决方案1】:

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

    【讨论】:

    • 所以,在上面的代码中,我可以保存地址'a'(内存地址:MessageBox_function)。然后我可以用汇编来调用它吗? (没有其他变量的粗略想法) __asm { call a } 这不会进入无限循环并改为调用我的“fake_function”吗?
    • 我认为您的粗略想法代码可能已关闭。看起来您正在从它所在的任何 DLL 中获取 MessageBox 函数的导出地址。将指向 MessageBox 函数的指针与指向您的函数的指针交换实际上不会“挂钩” MessageBox 调用。它只会用指向 MessageBox 替换函数的指针替换包含指向 MessageBox (b) 的指针的变量的内存。您可以通过执行 b = fake_function 来简化您的粗略想法代码,因此它似乎不是您想要的。
    • 您的模块将地址导入到 MessageBox。您想要更改导入,使其指向您的 MessageBox 函数而不是 Microsoft 的。您拥有的代码仅从模块中检索要运行的地址。
    • 对不起,我的最后一条评论是假设为 'b' 而不是 'a'。我想我不想真正挂钩任何东西。我想要做的只是替换'Foo.exe'中对MessageBox的所有调用,而不是调用我的fake_function。但我也希望能够在 fake_function 中调用 MessageBox 而不会造成大循环。
    • 因此,如果您仅使用 LoadLibrary 和 GetProcAddress 来获取 MessageBox 的地址,以便您可以在整个可执行文件中进行搜索和替换,请确保您没有替换在导入表中找到的值.如果这样做,可能会导致您看到的循环。
    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多