gpt4 book ai didi

c++ - 如何使用函数 b( C 和 winapi )覆盖函数 a ?

转载 作者:行者123 更新时间:2023-11-30 19:48:13 24 4
gpt4 key购买 nike

假设我们有函数 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( ) 则通过一些钩子(Hook)打印出 a 的消息类型?如果是这样,假设我的程序运行了足够长的时间来切换函数,并且函数没有内联,我将如何编写这样的程序。

最佳答案

如果您想了解 hook,并亲自尝试,您必须意识到修补/hooking 是一个庞大而复杂的主题:-)

  1. 您想在磁盘上还是在应用程序运行时打补丁?
  2. 您是否控制目标应用程序的源?
  3. 目标函数位于 EXE 还是 DLL 中?
  4. 在 DLL 情况下,函数是否导出?

作为初学者,我会推荐什么:

尝试在您自己的 EXE 运行时从自身修补函数(不涉及外部进程)

  1. 获取函数的地址(纯C/C++)
  2. 通过 VirtualAlloc 分配可执行内存
  3. 在可执行内存中写入二进制操作码
  4. 通过跳转到新代码来覆盖函数的开头(保存被覆盖的部分)

警告:您必须了解有关操作码、堆栈、调用约定等的一些基础知识...特别是,函数开头的覆盖必须保留其余部分的操作码完整性(如果您打算跳回),这可能很棘手。

一些链接:

x86 API Hooking Demystified

MinHook - The Minimalistic x86/x64 API Hooking Library

EasyHook - The reinvention of Windows API Hooking

关于c++ - 如何使用函数 b( C 和 winapi )覆盖函数 a ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19801625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com