我正在阅读有关x86挂钩的文章x86 API hooking demystified,我遇到了这段代码:
if(*function_A == 0xe9) {
printf("Hook detected in function A.\n");
}
似乎这段代码测试函数的操作码是否是跳转。
我的问题是关于语法*function_A
。这是什么语法?它是否返回C中函数的操作码?我做了很多研究,但没有找到关于此功能的任何文档
修改
我以为我添加了文章的链接,但我注意到我忘了添加它。添加链接以防万一。
答案 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
可能更难,因为添加和减去指令通常有“少量”和“大量”变体。