如何用函数b(C& winapi)覆盖函数a?

时间:2013-11-06 00:08:46

标签: c++ c winapi

假设我们有函数A和函数B,如下所示:

#include <stdio.h>
#include <stdlib.h>

void  a( )
{
    printf("Hello from function a!\n");

    return;
}

void  b( )
{
    printf("Hello from function b!\n");

    return;
}

int main( )
{

    printf( "a = %p, b = %p\n", a, b );
    a( );
    b( );

    return 0;
}

在这种情况下,输出为:

a = 00401334, b = 00401349
Hello from function a!
Hello from function b!

有没有办法以编程方式(使用C和winapi)切换来自外部程序的那两个函数调用来调用a()打印出b的消息而b()用一些钩子打印出一条消息类型?如果是这样,我将如何编写这样的程序,假设我的程序运行时间足以切换函数,并且函数没有内联。

2 个答案:

答案 0 :(得分:0)

听起来最好的事情就是在你的程序中根据当前的情况决定调用哪个函数。您需要在代码中构建一些内容,以便以某种受控方式响应外部程序。

暴露或操纵任何较低级别的内容(例如修改二进制文件中的调用指令)将非常难以安全/可靠地进行。

答案 1 :(得分:0)

如果你想了解钩子,自己试验所有,你必须意识到修补/挂钩是一个庞大而复杂的主题: - )

  1. 您想要在磁盘上修补,还是在应用程序运行时?
  2. 您是否控制目标应用的来源?
  3. 目标函数是位于EXE还是DLL中?
  4. 在DLL的情况下,是否导出了函数?
  5. 我推荐的是作为首发者:

    尝试在自己的EXE中修补一个函数,当它自己运行时(不涉及外部过程)

    1. 获取函数的地址(纯C / C ++)
    2. 通过VirtualAlloc分配可执行内存
    3. 在可执行内存中写入二进制操作码
    4. 通过跳转到新代码覆盖函数的开头(保存已覆盖的部分)
    5. 警告:您必须了解有关操作码,堆栈,调用约定等的一些基础知识...特别是,覆盖函数的开头必须保留其余部分的操作码完整性(如果您打算跳回来,这可能很棘手。

      一些链接:

      x86 API Hooking Demystified

      MinHook - The Minimalistic x86/x64 API Hooking Library

      EasyHook - The reinvention of Windows API Hooking