《移動互聯網之智能終端安全揭秘》中提到了android hook的一種方法,可以通過設置LD_PRELOAD環境變量來改變函數的執行流程從而達到hook的目的。書中的示例代碼與陳皓博客:/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環境變量,在主程序調用其他動態鏈接庫前,優先調用自己編寫的動態鏈接庫,覆蓋正常的函數庫,從而達到目的。