php so 扩展反编译,使用IDA反编译.so文件并修改

使用IDA反编译.so文件并修改

简述

之前一直在做应用层的开发很少接触底层,总感觉底层是一个很神秘的地方。最近各种原因之下有一些逆向的工作,但是好多应用的核心逻辑都是利用jni在c/c++层去实现的,这就给我们的逆向工作带来了很大的困难,所以了解底层知识还是比较重要的。逆向过程中java层面的逆向还是比较简单的,今天主要介绍一下如何逆向.so文件。

例子是我最近分析的一个项目,项目中数据是从.so库处理发出的。但是.so文件对手机的串号做了校验,也就是说只有固定的几部手机才能使用。

所以这篇博客最终的效果就是通过反编译.so文件,找到记录串号的Hex码修改为自己的串号,就可以绕过.so的串号校验了。

利用IDA反编译.so文件

IDA。是目前最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器。IDA功能及其复杂,今天只是简单的介绍一些基本功能。

IDA的安装略过不讲,安装好之后打开IDA(Version 7.0.170914 Windows x64)第一次使用,选择直接选择Go即可,进入界面后左上角File—>Open选择要打开的so文件,我选择的是一个

armeabi-v7a指令集的.so文件。打开之后如下图设置,然后点击OK

52b91733fec1

1.png

打开后如下图

52b91733fec1

2.png

在左侧的function name中寻找main入口函数。找到后现在IDA View中显示的反编译出来的汇编语言看起来比较费劲,可以按F5转成伪代码

52b91733fec1

3.png

到这就可以看到逻辑是调用sub_32E4位置的方法然后执行死循环打印日志qcd err ......,这正是我启动失败logcat上显示的日志。现在基本能断定关键逻辑在sub_32E4方法中。

sub_32E4值得应该是方法的Hex码的起始位置是32E4,不过在IDA中可以直接鼠标双击该方法直接进入,如图

52b91733fec1

4.png

大致逻辑就是现获取手机的imei码然后和一个常量数组off_9D24里的已有串码进行比对,如果对不上就跳出,也就是执行了main方法里的打印错误日志的死循环。

所以关键的串号数组也就知道了,双击off_9D24找到数组位置,选中数组中某个条目,按 Q 就可以显示Hex码的位置,然后记住这个位置。

52b91733fec1

5.png

使用010 Editor修改.so文件

.so文件本质上已经编译成了二进制文件,使用010 Editor可以更方便的修改。

现在已经知道了需要修改的数组的位置,用010 Editor打开刚才分析的.so文件。

52b91733fec1

6.png

根据左侧的行号找到63F0这一行,这个时候就可以看到63F0这一行的第6个Hex码是38正好对应ASCII码的8,根据右侧的ASCII码对照表,正好是设备码数组的第二个元素的第一个字符。

找到了位置就可以把数组里的数据修改成任何你想要的设备码了,修改Hex码不太方便可以直接修改ASCII对照码表里的ASCII码。

52b91733fec1

7.png

现在我将8改成了9(当然设备码国内应该是86开头,这只是做个示范),Hex码也自动改成了39。

好了现在就可以挑数组里的一个条目完全改成你自己的设备码,然后ctrl+S保存,将新的.so包放到工程里重新打包或者直接用adb放到手机的/data/user/0/com.xxx.xxx/lib下重启应用即可。经过尝试果然绕过了设备码限制,成功拿到数据。

后记

这次只是简单尝试,受困于不太熟悉汇编语言,只能修改静态资源值,如果熟悉汇编语言的话可以直接修改流程,比如修改if判断条件恒为true,或者置为相反条件即数组里的设备反而都不能用等,这是今后需要继续学习的地方。

Windows7及vista系统可用,但需要去掉UAC,或者用管理员权限运行主程序。 如无意外,黑刀Dezender 5.0 三套解密内核版 将会是最终版本,除非新的解密内核出现,否则今后也将不再更新,也请勿再加本人QQ咨询任何关于Zend解密的问题!感谢各位黑刀爱好者关注,敬请期待本人其他作品。谢谢! 反馈问题情况汇总: 1、有很多朋友说下载了最新版还是解不出来,是因为他们把程序放在了桌面上或者Program Files目录下。大家一定要记得,不要把黑刀Dezender的主程序以及需要解密的PHP文件放置在目录名包含空格的目录内,比如桌面、Program Files目录等,除了目录名不能包含空格以外,也不能包含英文的句号,以免程序将目录当做文件来处理,造成无法解密的情况。还有一种可能性,是因为被加密了的PHP文件采用了最新版的Zend来进行的加密,所以黑刀Dezender解不出来。 2、解密出来的文件有“乱码”:这种情况通常是因为PHP程序在加密时采用了混淆函数,而所使用的函数又是Dezender无法识别的,所以在函数的部分变成了“乱码”。目前唯一的解决办法只能是更新自己的混淆函数库来尝试解密,别无他法。 3、网友“李向阳”问:“我解开的文件能读,但是有很多很基本的语法问题。不知道是怎么事!” 对于这个典型问题,我只能答说,解密出来的文件不可能百分百还原为原始未加密的文件的。在遇到需要手工去修复代码的情况时,就要求Dezender的使用者具备相应的PHP程序编写知识。如果不具备?自己找书找资料看。呵呵。 4、如果出现如下的错误提示:“无法判断程序输入点于动态链接库php5ts.dll上”说明dezender和原有的PHP环境冲突,可考虑卸载原有PHP环境,或安装虚拟机,在虚拟机上使用dezender。实在不行,换台电脑试试看吧。呵呵。虚拟机的下载地址:http://tmd.me/2008/read.php?5 重要声明:   黑刀Dezender本身只是个集成工具而已,主程序实际上只是用Delphi开发的GUI界面的外壳程序,核心的解密功能部分来自互联网上的收集整理,我所做的外壳编程,仅是在原有的各个解密内核版本Dezender的功能上,开发基于windows的用户界面,以便于使用者对原有类似“DOS”环境下的各种应用功能的Windows实现。   关于加密保护自己的PHP程序的问题:   类似微盾加密的、可以混淆函数和变量的加密方式,官方名字叫做“PHPlockit”,微盾的php加密专家也有类似的功能,但似乎会造成程序无法正确运行。目前在我没有开发新版的解密工具之前,据我所知除我之外能手工解密“类微盾加密混淆函数及变量”的人并不多,大家可以试试。其他比较安全的加密方式比如Ioncube等也可以使用,只是国内支持该加密方式的虚拟主机不多,如果是独立服务器,可以考虑采用。   而Zend的混淆函数也是至今无法完全突破的问题,大家在开发自己的PHP程序时,可以采用较长的自定义函数名和变量名,这样Dezender就无法正确的识别出明文来了,就算解密掉程序本身,因为函数和变量都已经被混淆,自然也很难让程序正确运行了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值