前些天为了排查我们程序中不知道是库里面还是我们自己调用了assert断言,导致我们程序死亡。想通过hook拦截到调用这个函数的调用者,偶然间想起proload(预加载),小试牛刀使用如下代码
#include <syscall.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void abort(void)
{
printf("****************my abort, getpid():%u\n", __FILE__, __LINE__, getpid());
int *a = NULL;
*a = 1;
while(1)
{
sleep(10000);
}
}
gcc --shared -fPIC preload.c -o libpreload.so 编译成so的形式
使用如下代码进行测试
#include <stdlib.h>
#include <stdio.h>
intmain ( int argc, char *argv[] )
{
printf("file:%s, line:%d, getpid():%u\n", __FILE__, __LINE__, getpid());
abort();
printf("file:%s, line:%d\n", __FILE__, __LINE__);
void *p = malloc(3);
return p == NULL;
return EXIT_SUCCESS;
}
gcc testpreload.c -o testpreload 编译可执行程序,默认链接到了glibc中的assert
启动方式,
将libpreload.so放到和可执行程序testpreload同级目录下
LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH" LD_PRELOAD="libpreload.so" ./testpreload
加入LD_LIBRARY_PATH 对当前目录的搜索,使用LD_PRELOAD 设定预加载的so,启动后输出如下结果
file:testpreload.c, line:31, getpid():9960
****************my abort, getpid():3086001460
./run.sh: line 1: 9960 段错误 LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH" LD_PRELOAD="libpreload.so" ./testpreload
我故意产生了一个SIGV错误,暂时弄不清楚为什么getpid()的系统调用返回值不对,printf却可以运行无误。
主要用途:
可以代替ptrace拦截系统调用,或者对函数的调用,可以用来分析一些比如内存泄露(malloc free是否成对调用)等等问题
分享到:
相关推荐
vlany是Linux LD_PRELOAD rootkit 。 正在安装 vlany的脚本是最快/最简单的安装方法。 root@vlany:~# wget ...
使用Go LD_PRELOAD libc挂钩 这是在共享库中使用Go封装libc函数并启动TCP服务器(“后门”)的实验,该服务器允许从客户端(如telnet或netcat)运行任意命令。 这是一款用于教育目的的玩具,可演示Go的某些功能。 ...
LD_PRELOAD=target/debug/libsrvshim.so \ curl _my-service._tcp.domain 您还可以在/etc/ld.so.conf创建一个条目,以使它被加载到系统上的所有进程中。 OSX: DYLD_INSERT_LIBRARIES=/abs/path/to/libsrvshim....
用法示例LD_PRELOAD='/usr/local/lib/libmemleak.so' ./a.out 可能还需要预加载libbfd和libdl,因此请使用LD_PRELOAD='/usr/local/lib/libmemleak.so /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/x86_64-linux-gnu...
linux 如何hook 任何一个目标文件中 使用的 第一层函数。在没有目标源码的情形下。对目标进行hook、 亲测,可以用
名称wrapalloc - 包装 glibc 的内存分配和释放 API 函数以简化动态跟踪概要 LD_PRELOAD=/path/to/wrapalloc/wrapalloc.so your_app描述大多数主流 Linux 发行版附带的 glibc 二进制文件通常会受到 gcc 在非常积极的...
该库在预加载到的任何游戏中都会产生“子弹时间”效果。 它的下面使函数clock_gettime重载,从而将其报告速度降低了4倍。 这是在《葡萄酒》中运行的《异形射击2》,... 我系统中的示例: LD_PRELOAD="/home/consta
linux tcp 心跳 适用加载与用户下所有的TCP连接环境变量:KEEPIDLE=180KEEPINTVL=60KEEPCNT=20LD_PRELOAD =/路径/libkeepalive.so
使木乃伊化这是尝试挂接inotify调用的实验,...例子make allLD_PRELOAD= $PWD /inotify_hook.so inotifywait -m -r -e modify,attrib,close_write,move,create,delete /tmp 然后在另一个外壳中: touch /tmp/llamas参考
This is a private rootkit, and thus this README will not adhere to public requirements or preferences. ... @Reiko: I changed how the user is prevented from removing the ld.so.preload file
最近使用树莓派安装opencv,发现安装opencv_python会有一个问题出现,每次就需要在python3前面加入LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1才可以正常import cv2,后来发现其实只要安装这个_contrib...
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这...
该资源解压后将detectface目录放到web服务根目录,启动时需要把调用so的语句包含进去(export LD_PRELOAD=./detectface/detect.so;),或者在linux中配置静态库的引用目录,调用函数为getface("*参数:图片路径*"),...
安装 $ make用法 LD_PRELOAD=/path/to/spotifywm.so /path/to/spotify/binary在Arch Linux下,请勿在/ usr / bin中运行包装程序脚本,它将覆盖LD_PRELOAD 。 请改用/usr/share/spotify/spotify 。
最近根据使用发现,在ubuntu下,安装sublime Text 3 后,无法使用中文输入的问题。...不必每次都输入LD_PRELOAD打开sublime text 3,需要修改sublime图标链接方式 首先将共享库复制到系统默认路径中
执行回调提取程序用法Linux / FreeBSD: DISCO_CONF=/path/to/discotech.conf.json \LD_PRELOAD=target/debug/libplumber.so \$PROGRAM OSX: DISCO_CONF=/path/to/discotech.conf.json \DYLD_INSERT_LIBRARIES=/...
bindp, Linux运行应用程序中特定IP和端口 bindp介绍使用LD_PRELOAD和 bindp,你可以执行以下操作:用于服务器应用程序为侦听指定ip和端口为现有应用程序添加 so_reuseaddr/so_reuseport用于套接字客户端为连接指派...
文件感染/后门-可以用作LD_PRELOAD rootkit的替代方法,但具有额外的隐身功能。 捍卫者与我联系以了解如何进行检测。 重要笔记 GLORYHook仅支持x64。 当前,仅导入支持钩子(例如libc函数)。 目前不支持与您的钩子...
它在Linux(带有LD_PRELOAD ),FreeBSD(也是LD_PRELOAD )和OSX(带有DYLD_INSERT_LIBRARIES )上受支持。 观看此以了解实际操作。安装克隆此存储库: $ git clone git://github.com/sickill/stderred.git$ cd ...
1.库名称格式: lib + the_name_of_library + .so ... 4.LD_PRELOAD预加载库。用于提前加载,紧急用途,或是特殊的测试情况 5.创建动态库 gcc -fPIC -shared -Wl,-soname, your_soname -o library_name fil