linux下的动态库注入

前言

最近在维护公司的一个服务X,服务X因为协议设计的不够安全,存在被攻击的风险,所以修改协议提升安全性就显得势在必行了。然鹅,该项目涉及到多个版本,将改动合入到各个版本引起的开发及测试工作量颇大,最终讨论后决定通过动态库注入的方式进行修改。

何为动态库注入

动态库注入是指在程序启动或运行的时候,通过某种手段加载另一套接口库,替换原有依赖库中的函数。这样可以达到改变程序功能而又不对原有代码进行修改的目的。

如何做

linux下有一个环境变量叫LD_PRELOAD,动态链接器在载入一个程序所需的所有动态库之前,会先载入LD_PRELOAD环境变量所指定的动态库。运用这个机制,我们可以替换已有动态库中的方法,加入我们自己的逻辑,从而改变程序的执行行为。不过该方法只对动态链接的程序有效,对静态链接的程序无效。

看这样一个简单的例子,我写了一个main.c:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("%d\n", atoi("123"));
	return 0;
}

该main函数简单的调用libc库中的atoi()函数将字符串“123”转换为int型输出。直接gcc main.c得到a.out编译运行,显然我们可以猜到结果:

通过ldd命令可以查看该二进制依赖的库:ldd a.out

通过命令strings /lib/x86_64-linux-gnu/libc.so.6 | grep atoi可以看到atoi()函数的符号就在其中:

现在让我们重新实现一个自己的atoi(),myfun.c,让其固定的返回456的数值:

int atoi(const char *nptr)
{
	return 456;
}

然后将其编译成动态库:

在程序运行的命令前设置预加载库的路径为我们刚刚创建的动态库:

可以看到,我们已经成功的替换了libc中的atoi()函数,此时的库依赖顺序已经变成了这样的:

由于动态链接器是按照库的载入顺序进行符号解析的,当myfun.so首先载入之后,动态链接器已经找到了atoi()函数,所以会忽略libc库中的atoi()实现。

最后

我对服务X的改动也是通过LD_PRELOAD的方式预先载入新的库,在新的库中重新实现了recv()和send()函数,在判断是收发指定的协议包时,对其外层增加了一层封装。这样一来,只需一份代码,在多个环境下编译即可通用。

这种通过预加载的方式需要重启服务,其实还有另一种方式,可以不用重启服务就可以做到动态注入,其原理是修改了运行环境的上下文,具体实现还是比较复杂的,后面如果找到具体的实现再补上。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Linux中,"hook"是指通过修改或替换系统函数的方式来拦截和修改程序的行为。通过hook技术,我们可以在程序执行特定函数之前或之后注入自定义的代码,从而实现对程序的控制和修改。引用\[1\]中的代码示例展示了如何通过hook技术来劫持connect函数,实现对网络连接的修改。在这个示例中,通过修改connect函数的参数,将连接的目标端口修改为1235,并打印出连接的IP地址和修改后的端口号。这样,我们可以在程序中对网络连接进行自定义的操作。引用\[2\]中的代码展示了具体的hook实现方式,通过使用函数指针和动态链接库的方式来替换原有的connect函数。引用\[3\]中提到,在Linux内核中,采用了函数指针的形式来实现面向对象的特性,通过实现VFS提供的接口,可以实现自定义的堆栈式文件系统。这种方式可以拦截和修改文件的读写操作,实现对文件系统的控制。 #### 引用[.reference_title] - *1* *2* [Linux Hook方法](https://blog.csdn.net/vspiders/article/details/120266898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [linux系统下的各种hook方式\Linux内核hook系统调用](https://blog.csdn.net/inthat/article/details/119931358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fireplusplus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值