一、前言
在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点。需要逆向分析app即可。不了解Xposed框架的同学可以查看:Android中hook神器Xposed使用详解;关于hook使用以及原理不多解释了。今天我们再来看另外一个hook神器Cydia Substrate,关于这个神器网上也已经介绍了,应该有的同学已经使用过了,因为最近在破解一个游戏,奈何想hook他的一个so中的一个方法,Xposed几乎没法用,所以得操刀这个框架了,所以就单独抽出来介绍这个框架。他的一个优点就在于Hook底层方法非常方便,对so中的方法hook操作非常便捷。
二、环境搭建
下面就来介绍这个框架如何安装使用,本文会介绍这个框架如何hook Java层和Native层功能,首先我们来看一下如何安装这个框架,本人操作的环境:
设备系统:小米三+原生CM 4.4系统
框架版本:0.9.4010
是否root:必须root
关于这个环境,可能有的同学操作最大的问题就在于设备和系统,不同设备不同系统,这个框架或许安装会失败,具体问题可能需要你们自己去解决了。关于框架apk和功能jar包下载地址可以去官网:http://www.cydiasubstrate.com
三、Hook Java层功能
搭建好了环境,下面就直接操作了,首先来看看如何Hook Java层功能
第一步:导入jar包
第二步:编写hook入口类
第三步:配置xml信息
第四步:安装运行
代码编写完成之后,直接运行安装即可,前提是你需要正确安装Cydia框架apk,安装成功界面如下:
四、Hook Native层功能
那么下面继续来看如何hook native层的功能,也是本文的重点哦。
第一步:创建一个Native工程
第二步:导入Substrate的native功能包
上图可以看到,需要导入一个substrate.h头文件,和两个so功能包。native层应用都是这么干的,提供一个头文件告诉你api,具体实现在so包中。
第三步:寻找hook的函数名
这里网上没有好的hook代码,这里我们为了更好的查看这个工具的牛逼之处,弄一个比较实际的案例就是hook系统加载dex的函数,这样我们就可以获取到每个应用的dex文件了,这种方式对于早期加固是一个比较好的脱壳方案。在之前介绍脱壳我们会使用IDA在指定函数处下个断点,那么我们这里如果要hook的话,就需要找到这个加载dex的函数名称,这里一定要记的是导出的函数名,首先我们导出设备的libdvm.so文件:system/lib/libdvm.so
第四步:编写hook代码
在编写hook代码之前,我们需要考虑这几件事:
第一件事:我们hook之后的dex存在哪?怎么存?我们这里直接通过当前的pid值获取进程名,然后将其凭借作为dex的文件名,这样每个进程的dex文件就不会冲突了。这里要理解一点:一个进程对应一个DVM,加载一个dex文件。所以这里hook其实就是注入每个进程,在每个进程中在hook每个函数功能。
第二件事:需要过滤系统进程,并不是所有的进程都是我们想要hook的,而且这些进程未必有dex文件,比如鼻祖进程zygote,而这些进程过滤规则,需要我们自己打印看结果。然后构造。
下面开始写代码了,首先定义我们想要hook的so文件:
MSConfig(MSFilterLibrary, "/system/lib/libdvm.so");
主要是第二个参数,是需要hook的so路径。然后在入口处开始hook代码:
第五步:编写MK文件
上面代码已经编写完成了,下面来编写编译脚本吧,主要注意编译之后的文件名一定要有cy结尾,不然是hook失败的,然后就是需要导入substrate的so库文件:
第六步:安装并运行
和之前一样,运行之后,需要重启设备,然后先看看native层的log信息:
五、说明
关于native层hook就介绍完了,这里还是需要说明几点:
第一点:hook之前需要分析so获取需要hook的函数名称,参数返回值定义,这个和hook Java层一样,必须先找到突破点才能进行下一步。
第二点:hook可能会有一些错误,因为是native层比java层错误信息难发现,所以最好是在某些地方加一些日志观察结果。
如果在使用过程中发现hook失败,注意检查这几个条件:
第一个:xml中是否配置了权限和入口
第二个:编译脚本MK中的后缀名是否为cy
项目下载地址:https://github.com/fourbrother/CydiaSubstrateHook
六、总结
关于CydiaSubstrate框架就介绍到这里了,后面会分析如何hook游戏的so文件来进行破解工作,有了这个框架再也不怕hook难了,native层代码也可以一览无余了。