HOOK(劫持) API的思路就是修改原API的入口,使其跳转到我们的假API入口,
然后执行我们的假API函数,为什么说是假API函数呢?
因为我们的假API,除了函数名称和真实API的名称不一样之外,其它都是相同的,即
它们的函数参数和返回值和调用形式都是一样的。
下面举例说明如何hook系统调用或者c语言中的库函数。
#include <stdlib.h>
#include <stdio.h>
void *malloc(size_t size)
{
printf("hooked malloc \n");
return NULL;
}
int main()
{
malloc(1);
return 0;
}
以上代码hook了malloc函数,执行的实际上是我们自定义的函数。用nm命令可以看到malloc函数是自定义函数。
nm ./a.out | grep malloc
00000000004004e4 T malloc
如果是glibc的库函数,则会在函数后有glic字样。
nm a.out | grep malloc
U malloc@@GLIBC_2.2.5
为什么可以hook库函数呢?因为程序在运行时是动态加载库函数的,malloc在动态库中,所以在查找malloc函数,找到我们自定义的函数后,就会忽略glibc的库函数,最后执行的是自定义函数。