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