C语言_函数hook方案
背景
单体测试中测试一个函数时,该函数调用的其他函数,需要按照测试case,依赖其他函数进行调用参数检查,返回特定值。但是其他函数,不容易做到参数检查和返回特定值,这时需要将其他函数进行hook,hook函数用户自己实现,比较容易实现参数检查和返回值特定值。
本文主要介绍如何用测试函数对原函数的hook
//源代码
int my_add(int a, int b) {return a+b;
}void test_add()
{my_add(1,2);
}//测试代码
int c = 1000;
int hook_my_add(int a, int b) {printf("\t##%s():%d is call \n",__FUNCTION__, __LINE__); return c;
}
test_add() 调用my_add,强制修改成调用hook_my_add. 在不修改源码的基础上可以完成对test_add函数的测试。
设计
函数的hook可以理解为在调用原函数的地方,调用了测试函数。
设想
调用到原函数时,将函数跳转到测试函数,测试函数返回到原函数调用的地方。
1. 调用到原函数,程序调用到函数的地址
2. 跳转到测试函数,可以使用JMP指令
3. 测试函数会自动返回到原函数的调用处
主要考虑如何修改原函数的代码段,跳转到测试函数。
代码段是只读的,需要通过mprotect