x64下利用LD_PRELOAD动态连接,给软件增加自己需要的功能

作者:CQITer小编 时间:2018-03-26 01:05

字号

有一个以前用的软件,一直在用,非常稳定,现在由于业务需要,在显示结果后面,根据配置文件,再进行一次正则过滤。

给原来开发软件的公司打电话,打不通了……大家可以发挥想象力!总之就是没人管了。

技术选型

只是很小的改动,在重新开发一套,时间不允许,而且重新开发的也不一定稳定。所以最后决定在原文件上进行修改,这样时间最短,成本最低。

可行性方案

1. 在原来的文件上进行二进制修改,考虑到汇编语言开发效率太低,不可取。【放弃】

2. 修改原程序,在合适的地方,使用懒加载方式,调用自己写的so文件,然后在so文件中实现功能。【可以实现,但既要修改原文件,还要写so文件,可以当做备选方案】

3. 不修改原程序,LD_PRELOAD动态连接.so函数劫持,然后对需要进行修改的关键点进行补丁。【不修改原文件,只是利用so文件,进行补丁,新功能在so文件中完成,此方案可以考虑】

任务开始

运行环境:

[root@centos ~]# uname -a Linux centos 2.6.32-431.29.2.el6.x86_64 #1 SMP Tue Sep 9 21:36:05 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux [root@centos ~]# lsb_release -a LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch Distributor ID: CentOS Description:    CentOS release 6.4 (Final) Release:        6.4 Codename:       Final

关键点分析

升级关键点分析

.text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       mov     rdi, rbp        ; s1 .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       mov     esi, offset aVer3 ; "Ver3.0" .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       lea     rbp, [rbx+40h] .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       call    _strcasecmp    ====》我们就来欺骗这个函数 .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       test    eax, eax .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       jz      short goto_upgrade

解密算法关键点分析

.text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       mov     [rsp+338h+var_330], esi .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       mov     qword ptr [rsp+338h+var_338], rax ; int .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       mov     rsi, rbp        ; char * .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       call    decode_data ;      解密字符串 .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                        mov     rax, [rsp+338h+var_D8] ==>我patch的是这个地方 .text:XXXXXXXXXXXXXXXX 00 00 00 00 00 00                       cmp     [rsp+268h], rax ; rax=解密后的字符串 .text:XXXXXXXXXXXXXXXX 0F 84 44 02 00 00                       jz      loc_452910 选定方案

使用ida分析文件后发现原程序启动后会调用系统的**strcasecmp**函数,来比较版本号进行升级。

好,那么我们就模拟系统libc.so.6文件中的strcasecmp,决定使用【方案3】。

流程图

要写东西,总要先画个流程图吧,这样不至于偏离目标。

下图是原来程序的运行流程图:

程序运行后,会先调用比较函数比较版本号,然后就是一些内部的黑盒逻辑处理了,(由于一些原因,不便透露程序名称,所以隐去了,请大家谅解)如果解密成功,就会把解密出来的内容显示在屏幕上。

55487415.jpg

下图是【方案3】实现的流程图

我们使用LD_PRELOAD=myhook.so 原文件名称,提前加载so文件,当原程序准备比较版本的时候,这时就会调用红色框中的流程,这个流程中,我们做了二件事,第一读取配置文件,第二,修改原文件中关键点在解密成功后,在加一层判断代码,把这个代码指向我们so文件中的函数,也就是下图的蓝色框内部分。其他部分同上。

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接