函数操作码在C中

时间:2013-06-10 11:40:47

标签: c hook

我正在阅读有关x86挂钩的文章x86 API hooking demystified,我遇到了这段代码:

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

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

修改

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

2 个答案:

答案 0 :(得分:5)

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

这可能是通过引入一个不同的指针,并依靠特定平台“做正确的事情”来实现的,其中“正确”意味着“我想做什么”。

类似的东西:

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

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

答案 1 :(得分:3)

如果您这样做:

unsigned char *pf; 

pf = (unsigned char *)function_A;

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

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

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