library Interpositioning 库(内插)干预技术
library Interpositioning 库(内插)干预技术:
- linux 链接器支持库内插干预技术,它允许使用者截获对共享库函数的调用取而代之执行自己的代码,使用库干预机制,可以追踪感兴趣库函数的调用次数,验证和追踪器输入输出值, 或者将其完全替换为一个不同的实现,这在嵌入式平台上非常常见
- 其基本思想是:对要干预的库函数,创建对应的包装函数wrapper function,其原型和目标函数一模一样,使用库干预技术,就可以欺骗系统调用包装函数而不是目标函数;
- Interpositioning 可以发生在compile,link,或者 load and run 的阶段,
下面结合具体实例进行分析:
1. 编译时干预
- linux> gcc -DCOMPILETIME -c mymalloc.c
- linux> gcc -I. -o test test.c mymalloc.o
由于有-I.参数,多以会启动编译时干预,C预处理器会优先在当前目录中查找malloc.h
注意,mymalloc.c 中的包装函数里面调用的系统函数,是使用库函数编译的;
malloc.h:
#ifndef _MYMALLOC_H
#define _MYMALLOC_H#define malloc(size) mymalloc(size)
#define free(size) myfree(size)void *mymalloc(size_t size);
void *myfree(void* ptr);#endif // _MYMALLOC_H
malloc.c:
#ifdef COMPILETIME
#include<stdio.h>
#include<malloc.h>/**< malloc wrapper function */
void *mymalloc(size_t size)
{void *ptr = malloc(size); ///< call libc.soprintf("malloc(%d) = %p\n", (int)size, ptr);return ptr;
}/**< free wrapper function */
void *myfree(void* ptr)
{free(ptr); ///< call libc.soprintf("free(%p)\n", ptr);return ptr;
}#endif
test.c
#include<stdio.h>
#include<malloc.h> int main()
{printf("in main......\n");int *p = malloc(32);free(p);return 0;
}
2. 链接时干预
linux静态链接器支持用–wrap func 标志进行链接时干预,这个标志告诉链接器把对符号func的引用解析成__wrap_func 的形式;还要把对符号__real_func的引用解析为func:
将源文件编译为可重定义目标文件:
- linux> gcc -DLINKTIME -c malloc
- linux> gcc -c test.c
把目标文件链接为可执行文件:
- linux> gcc -Wl,–wrap,malloc -Wl,–wrap,free -o test test.o malloc.o
Wl,operation 标志把option传递给链接器,option中的每个逗号要替换为一个空格,所以-Wl,–wrap,malloc 就把–wrap malloc 传递给链接器,类似的方式传递–wrap free
test.c 和 malloc.h 同上
malloc.c:
#ifdef LINKTIME
#include<stdio.h>void *__real_malloc(size_t size);
void __real_free(void* ptr);/**< malloc wrapper function */
void *__wrap_malloc(size_t size)
{void *ptr = __real_malloc(size); ///< call libc.so mallocprintf("malloc(%d) = %p\n", (int)size, ptr);return ptr;
}/**< free wrapper function */
void __wrap_free(void *ptr)
{__real_free(ptr); ///< call lic.so free printf("free(%p)\n", ptr);
} #endif
3. 加载执行时干预
编译时干预需要能访问程序的源码,链接时干预需要访问程序的可执行对象文件而运行时干预只需要程序的可执行目标文件,该机制基于动态链接器的LD_PRELOAD环境变量。如果LD_PRELOAD环境变量被设置为一个共享库路径的列表(以空格或分号隔开)当加载执行程序需要解析未定义引用时,动态链接器(ld-linux.so)优先搜索LD_PRELOAD库,基此可对共享库中的任何函数干预;
- linux> gcc -DRUNTIME -shared -fpic -o run_malloc.so malloc.c -ldl
- linux> gcc -o test test.c
- linux> LD_PRELOAD=./run_malloc.so ./test
test.c 和 malloc.h 同上
malloc.c:
#ifdef RUNTIME
#define _GNU_SOURCE#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>void *malloc(size_t size)
{void* (*real_malloc)(size_t) = NULL;real_malloc = dlsym(RTLD_NEXT, "malloc");if (NULL == real_malloc) {fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());exit(1);}void *p = NULL;fprintf(stderr, "malloc(%ld) = ", size);p = real_malloc(size);fprintf(stderr, "%p\n", p);return p;
}void free(void* ptr)
{ void (*real_free)(void* ptr)=NULL;real_free = dlsym(RTLD_NEXT, "free");if (NULL == real_free) {fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());exit(1);}fprintf(stderr, "free(%p)\n", ptr);real_free(ptr);
}#endif
参考文献《深入理解计算机系统.5th》
library Interpositioning 库(内插)干预技术相关推荐
- linux 环境变量文件_应急响应系列之Linux库文件劫持技术分析,有点硬核哟
0×01 菜逼阶段 Linux库文件劫持这种案例在今年的9月份遇到过相应的案例,当时的情况是有台服务器不断向个可疑IP发包,尝试建立连接,后续使用杀软杀出木马,重启后该服务器还是不断的发包,使用net ...
- C++library Sort库排序的实现算法(附完整源码)
C++library Sort库排序的实现算法 C++library Sort库排序的实现算法完整源码(定义,实现,main函数测试) C++library Sort库排序的实现算法完整源码(定义,实 ...
- 专业技术计算机应用能力考试题库,全国专业技术人员计算机应用能力考试题库-Excel,Word,XP...
全国专业技术人员计算机应用能力考试题库-Excel,Word,XP (57页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.9 积分 <博大考 ...
- 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )
文章目录 一.动态加载 二.第一代加壳技术 ( DEX 整体加固 ) 三.第二代加壳技术 ( 函数抽取 ) 四.第三代加壳技术 ( Java 函数 -> Native 函数 ) 五.so 动态库 ...
- Enterprise Library 企业库 V4.1
Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework ...
- ELF动态库加载技术
库用于将相似函数打包在一个单元中.Linux支持两种类型的库:静态库(在编译时静态绑定到程序)和动态库(在运行时绑定到程序).Linux系统使用的动态库是ELF格式,后缀名为so. 1 加载 动态库内 ...
- 最新版 Enterprise Library 企业库 V4.1 中文学习手册
Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework ...
- 计算机三级在线题库,计算机三级网络技术题库(附答案)
计算机三级网络技术题库(附答案) 一.选择题(每题1分,共60分) 下列各题A.B.C.D四个选项中,只有一个选择是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分. (1)全球多媒体网是 ...
- 95-分库分表技术之ShardingJDBC
分库分表技术之ShardingJDBC ShardingJDBC: 回顾上一章的分库分表方式: 分库分表的目的就是将我们的单库的数据控制在合理范围内,从而提高数据库的性能 垂直拆分(按照结构分): 垂 ...
最新文章
- POJ 1523 SPF
- 域名怎么绑定ip_服务器怎么绑定域名?
- js把日期字符串转换成时间戳
- .NET Core 2将Visual Basic带到了Linux和macOS平台
- 项目管理软件伙伴https://www.huobanyun.cn/
- matlab 数组名含变量,求助:如何将带有符号变量的运算结果储存到数组中
- 鼠标偏移量_不止颜值!活动鼠标使用评测
- MapXtreme实用技巧
- 图灵好书推荐——数学+物理+宇宙
- 计算机网络共享自动关,如果单击“打印”后共享打印机自动关闭,该怎么办?...
- wifi发射功率各国标准_智能插座背后的两种无线协议——WiFi与ZigBee
- qqkey获取原理_征途手机版电脑版安装使用教程【安卓+ios电脑版图文攻略】
- 数据挖掘(七) DBSCAN聚类算法
- [4G5G专题-49]:物理层-为什么从事计算机领域的人,学习无线通信那么难?从物理层信号处理看无线通信思维领域的切换与跨越。
- XSS进阶二 ——合天网安实验室学习笔记
- 20个网上赚钱你要知道的网站!
- 计算机图形学--实时光线追踪
- Hadoop,MapReduce,HDFS面试题
- emmc和ssd的区别【转】
- WireShark基本使用(1)第一章WireShark简介+练习题
热门文章
- db2和相关驱动的下载
- go语言 Golang官网被墙解决办法
- win10 系统禁用笔记本自带键盘的有效方法
- python中nomodulenamed怎么解决_python:ModuleNotFoundError:Nomodulenamed解决方法
- 关于公司要不要设立测试的讨论
- 基于C语言的8深度灰度BMP文件读写
- 集成Euraka的SpringBoot工程禁止输出日志:ConfigClusterResolver : Resolving eureka endpoints via configuration的方法
- html多行注释如何实现,html多行注释如何实现?
- 自媒体短视频怎么玩?0粉丝也可以变现,5种变现模式
- wps如何用循环函数_WPS版Excel中怎样使用函数进行运算