把系统函数替换掉,就重新写一个与标准库相同的函数.

来源:互联网 发布:土地确权软件 编辑:程序博客网 时间:2024/06/11 18:59

由于调用系统的库不行,那么要调用自己写的函数库,有多种方法.
1,自己写一个sharelib
2,使用preload

我们写下面一段例程:
/* 文件名:verifypasswd.c */
/* 这是一段判断用户口令的程序,其中使用到了标准C函数strcmp*/
 

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. int main(int argc, char **argv)   
  4. {  
  5. char passwd[] = "password";  
  6. if (argc < 2) {  
  7. printf("usage: %s <password>\n", argv[0]);  
  8. return;  
  9. }  
  10. if (!strcmp(passwd, argv[1])) {  
  11. printf("Correct Password!\n");  
  12. return;  
  13. }  
  14. printf("Invalid Password!\n");  

在上面这段Unix操作系统程序中,我们使用了strcmp函数来判断两个字符串是否相等。下面,我们使用一个动态函数库来重载strcmp函数:
 

  1. /* 文件名:hack.c */  
  2. #include <stdio.h> 
  3. #include <string.h> 
  4. int strcmp(const char *s1, const char *s2)  
  5. {  
  6. printf("hack function invoked. s1=<%s> s2=<%s>\n", s1, s2);  
  7. /* 永远返回0,表示两个字符串相等 */  
  8. return 0;  

编译程序:
 

  1. $ gcc -o verifypasswd verifypasswd.c  
  2. $ gcc -shared -o hack.so hack.c 


测试一下程序:(得到正确结果)
 

  1. $ ./verifypasswd asdf  
  2. Invalid Password! 

设置LD_PRELOAD变量:(使我们重写过的strcmp函数的hack.so成为优先载入链接库)
 $ export LD_PRELOAD="./hack.so"

再次运行程序:
 

  1. $ ./verifypasswd  asdf  
  2. hack function invoked. s1=<password> s2=<asdf> 
  3. Correct Password! 

1)我们的hack.so中的strcmp被调用了。
2)主程序中运行结果被影响了。

system的代码直接照猫画虎了.

经过测试,preload不如直接写在代码里面效率高.
原创粉丝点击