.Android hook——LD_PRELOAD
《移动互联网之智能终端安全揭秘》中提到了android hook的一种方法,可以通过设置LD_PRELOAD环境变量来改变函数的执行流程从而达到hook的目的。书中的示例代码与陈皓博客:http://www.zzzyk.com/kf/201212/178312.html中一样,博客对LD_PRELOAD的危害阐述的非常清楚。
示例代码
1. 以下是一段判断用户口令的程序,用到了标准c函数strcmp
root@bt:~/programe# cat verify.c
#include <stdio.h>
int main(int argc, char**argv)
{
char passwd[] = "password";
if(argc<2){
printf("usage: %s <password> \n", argv[0]);
return;
}
if(!strcmp(passwd, argv[1])){
printf("Correct ! \n");
return;
}
printf("Invalid! \n");
}
测试程序结果
root@bt:~/programe# ./verify dani
Invalid!
root@bt:~/programe# ./verify password
Correct !
2.以下程序重载了strcmp函数,永远返回0,即永远认为两个字符串是相等的
root@bt:~/programe# cat hack.c
#include <stdio.h>
#include <string.h>
int strcmp(const char*s1, const char*s2)
{
printf("hack invoked. s1=<%s> s2=<%s> \n", s1, s2);
return 0;
}
编译成so,然后设置LD_PRELOAD环境变量,观察运行后的结果
root@bt:~/programe# gcc -shared -o hack.so hack.c
root@bt:~/programe# export LD_PRELOAD="./hack.so"
root@bt:~/programe# ./verify dani
hack invoked. s1=<password> s2=<dani>
Correct !
从运行结果看,程序优先调用hack.so的strcmp,看来利用这种方式进行hook的原理就是通过设置LD_PRELOAD环境变量,在主程序调用其他动态链接库前,优先调用自己编写的动态链接库,覆盖正常的函数库,从而达到目的。
补充:移动开发 , Android ,