loader在进行动态链接的时候,会将有相同符号名的符号覆盖成LD_PRELOAD指定的so文件中的符号。换句话说,可以用我们自己的so库中的函数替换原来库里有的函数,从而达到hook的目的。这和Windows下通过修改import table来hook API很类似。相比较之下,LD_PRELOAD更方便了,都不用自己写代码了,系统的loader会帮我们搞定。但是LD_PRELOAD有个限制:只能hook动态链接的库,对静态链接的库无效,因为静态链接的代码都写到可执行文件里了嘛,没有坑让你填。

先是受害者,我们的主程序main.c,通过strcmp比较字符串是否相等:

#include <stdio.h>
#include <string.h> int main(int argc, char *argv[])
{
if( strcmp(argv[1], "test") )
{
printf("Incorrect password\n");
}
else
{
printf("Correct password\n");
}
return 0;
}

  

然后是用来hook的库hook.c:

#include <stdio.h>
#include <string.h>
#include <dlfcn.h> typedef int(*STRCMP)(const char*, const char*); int strcmp(const char *s1, const char *s2)
{
static void *handle = NULL;
static STRCMP old_strcmp = NULL; if( !handle )
{
handle = dlopen("libc.so.6", RTLD_LAZY);
old_strcmp = (STRCMP)dlsym(handle, "strcmp");
}
printf("hack function invoked. s1=<%s> s2=<%s>\n", s1, s2);
return old_strcmp(s1, s2);
}

  

因为hook的目标是strcmp,所以typedef了一个STRCMP函数指针。由于hook的目的是要控制函数行为,所以需要从原库libc.so.6中拿到“正版”strcmp指针,保存成old_strcmp以备调用。

Makefile:

test: main.c hook.so
gcc -o test main.c hook.so: hook.c
gcc -fPIC -shared -o hook.so hook.c -ldl

  

执行:

$ LD_PRELOAD=./hook.so ./test 123
hack function invoked. s1=<123> s2=<test>
Incorrect password $ LD_PRELOAD=./hook.so ./test test
hack function invoked. s1=<test> s2=<test>
Correct password

  

使用PRE_LOAD劫持库函数的这种做法可以做很多事情,比如劫持随机函数random, random_r等,使得看起来是公平的摇号程序可以自如地由自己控制;比如实现一些高级功能,zlibc就是使用这个技术来做压缩,但是上层应用对其完全无感知;比如紧急fixbug,你可以preload一个函数库来使你的有bug的程序如期运行;比如访问应用程序的内存,做一些你想做的事 :)

参考:Reverse Engineering with LD_PRELOAD

转自:http://hbprotoss.github.io/posts/li-yong-ld_preloadjin-xing-hook.html

最新文章

  1. Kafka设计解析(三)- Kafka High Availability (下)
  2. Python黑帽编程2.6 模块
  3. 在Android中实现service动态更新UI界面
  4. 在64位Win7中使用Navicat Premium 和PL\SQL Developer连接Oracle数据库备忘
  5. ajax traditional
  6. PHP登陆Session验证
  7. 合并 hdfs 文件
  8. Form.ShowDialog和Form.DialogResult
  9. Android Studio下载安装及配置图文教程
  10. python代码中pass的用法
  11. IT只忍者龟Photoshop简单人像的头发抠图过程
  12. 标签(Tag)的各种设计方案
  13. zabbix 3.2 高可用实现方式一,亲测无坑
  14. VisualStudio2010配置OpenCV的一种一劳永逸的方法
  15. 项目Alpha冲剂(3/10)
  16. wifi rate vs mode
  17. 移动端解决悬浮层(悬浮header、footer)会遮挡住内容的方法
  18. HTTP 权威指南 第二章 URL 与资源
  19. Vs code 设置
  20. iOS 再谈 代理传值,block反向传值

热门文章

  1. 使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP .
  2. Mysql学习笔记之常用数据类型
  3. java判断一个字符串是否包含某个字符
  4. 【Kafka】Kafka-配置参数详解-参数调优
  5. 【R】函数-统计函数
  6. 数据结构 - 2-路插入排序 具体解释 及 代码(C++)
  7. powerdesigner 不显示表字段只显示表名
  8. Nginx 用log_format设置日志格式
  9. PHP的异常以及异常存在的意义
  10. ArcGIS读取dem格式数据