5

我正在阅读一篇文章x86 API hooking demystified about x86 hooking,我遇到了这段代码:

if(*function_A == 0xe9) {
    printf("Hook detected in function A.\n");
}

看来这段代码是测试函数的操作码是否是跳转。我的问题是关于语法*function_A。这是什么语法?它是否返回 C 中函数的操作码?我做了很多研究,但我没有找到有关此功能的任何文档

编辑

我以为我添加了文章的链接,但我注意到我忘了添加它。添加链接以防万一。

4

2 回答 2

5

不,您不能取消引用函数指针来获取底层代码。

这可能是通过引入不同的指针并依靠特定平台“做正确的事”来完成的,其中“正确”的意思是“我想做的事”。

就像是:

const unsigned char *function_A = (unsigned char *) printf; /* Any function. */

这是不可移植的,并且会生成编译器警告,因为函数和数据指针不兼容。在例如 x86 上,它可能会“工作”。

于 2013-06-10T11:42:45.377 回答
3

如果你做这样的事情:

unsigned char *pf; 

pf = (unsigned char *)function_A;

if (*pf == 0xE9)
{ 
...
}

那么你会得到那种效果(假设架构通常允许读取代码,并且编译器会执行正确的未定义行为来实现这一点)。

但是,除非您扫描代码中的整个函数,否则可以通过将跳转指令(0xe9 是到相对地址的跳转)放在其他地方或使用不同形式的跳转指令(0x66 0xe9 , 和 16 或 32 位偏移量在 32 和 16 位架构中,例如)。当然,如果您只想在较长的函数中覆盖评分函数,那么修改该函数中的几个字节以更改score += 10score += 120不会太难。更改为score += 10000可能更难,因为加法和减法指令通常有“小数”和“大数”变体。

于 2013-06-10T11:54:24.970 回答