Cydia Substrate原名为 Mobile Substrate,最早在IOS平台是一个越狱后Cydia 插件或者软件运行的一个基础依赖包,而后来也支持Android平台,在Android平台是一个代码修改框架,它可以修改任何主进程的代码,不管是用Java语言还是C/C++语言编写的,也就是不但支持Hook Java层,还可以Hook native层,遗憾的是该工具不是开源的,现在好像也不提供更新服务了,但是我们还可以使用现有版本,完成日常工作中遇到的问题。
应用场景:
在安卓平台恶意样本非常多,很多会在后台静默发送扣费短信或者发送远控指令短信,最早LBE安全大师可以实现动态监控短信,也就是在恶意样本发送短信时,会对发送短信的API进行Hook,提示用户正在发送短信,可以让用户自行选择允许或者禁止。其实我们利用Cydia Substrate框架就可以Hook sendTextMessage系统发送短信API,实现动态监控短信的效果。不止于此,还能Hook JNI函数,甚至可以制作脱壳机,如:开源项目DumpDex。
0x1 关键的API介绍
MS.hookClassLoad:该方法实现在用户感兴趣的类被加载时,触发该方法,这样满足用户进一步的操作。这个API需要实现一个简单的接口MS.ClassLoadHook,且只有一个方法classLoaded,当类被加载的时候该方法会被执行,加载的类以参数形式传入此方法。
void hookClassLoad(String name, MS.ClassLoadHook hook);
MS.hookMethod:该API允许开发者提供一个回调函数替换原来的方法,这个回调函数是一个实现了MS.MethodHook接口的对象,是一个典型的匿名内部类,它包含一个invoked函数。
0x2 Hook Java 层实例
步骤1: 安装框架Cydia Substrate;
下载地址:
http://www.cydiasubstrate.com/download/com.saurik.substrate.apk
步骤2:创建一个空的Android工程,由于创建的工程将以插件的形式被加载,不需要activity。将SDK中的substrate-api.jar复制到project/libs文件夹中;
SDK下载地址:
http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip
步骤3:配置Manifest文件
步骤4:创建一个类,类名为Main.类中包含一个static方法initialize,当插件被加载的时候,该方法中的代码就会运行,完成一些必要的初始化工作。
功能:实现短信的监控,Hook 系统函数sendTextMessage
步骤5:在 cydia app 界面中点击 Link Substrate Files 之后重启手机,即可启动Hook插件。
注意:上面案例是Hook 系统API函数,理论上是可以Hook任意函数的,特别是当工作中发现某些函数无法解密(采用非对称算法),可以考虑Hook指定函数,获取参数的值或者函数运行的结果等。
0x3 Hook Native函数
步骤1: 安装框架Cydia Substrate;
步骤2:新建Android工程,接下来在工程目录下新建jni文件夹,并将libsubstrate.so,libsubstrate-dvm.so,substrate.h三个文件拷贝至jni文件夹下,在AndroidManifest.xml中添加权限:
SDK:http://www.cydiasubstrate.com/id/73e45fe5-4525-4de7-ac14-6016652cc1b8
步骤4:编写hook模块
实现hook libc.so库中的fopen函数,这个函数在反调试时经常被调用。
步骤5:编写makefile
步骤6:通过ndk-build编译生成Hooknative.cy模块,再运行安装apk,在substrate中点击Link Substrate Files,最后,重启即可。
官网地址:http://www.cydiasubstrate.com/
另外,感兴趣的读者,可以进一步了解开源项目DumpDex,实现对libdvm.so库中的dvmDexFileOpenPartial或者dexFileParse进行了Hook,dvmDexFileOpenPartial函数的第一个参数是dex文件的起始地址,第二个参数是dex文件的长度,有了这两个参数,就可以从内存中将脱壳后的dex文件dump出来。
开源项目:https://github.com/CvvT/dumpDex
开源项目: https://github.com/WooyunDota/DumpDex
Frida是一个开源的跨平台挂钩框架,核心是用C编写的,可以使用python或JS快速的开发,也可以用来脱壳。
步骤1:搭建Frida的工作环境;
(1)下载安装Frida的Python运行环境;
(2)将对应版本的frida_server推送到手机,frida_server可以从Frida官网下载。
(3) 进入手机终端并切换到手机中的frida_server目录,修改权限,运行frida_server。
至此,Frida的运行环境基本搭建完成,具体的挂钩操作可以通过编写Python脚本和JavaScript脚本完成。
步骤2 :编写测试程序,实现hook libdvm.so库中的dvmDexFileOpenPartial 。
首先是loader模块,该模块由Python语言实现,作用是挂载设备指定进程,并且加载JavaScript脚本。
步骤3: 注入模块,由Javascript脚本实现,作用是注入目标模块、Hook关键函数、转储内存信息。
步骤4:取导出函数地址,这里选择的函数和IDA里选择的一样,都是libdvm.so中的dvmDexFileOpenPartial函数。findexportByName()函数的第一个参数可以指定具体路径,也可以只给出模块名称;第二个参数是函数的导出符号,不同版本的libdvm.so的符号可能不同。
这里介绍一套常用的Hook模板,读者可以根据自己不同的需求在模板上进行修改。
官方文档:https://frida.re/docs/android/
最后,大家可以根据不同的Hook框架,根据个人喜好,不同的应用场景,自由选择,只要能解决问题即可,好了,本专题就分享到此。
本文分享自微信公众号 - App安全红宝书(apphongbaoshu)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。