一、前言
在之前已经介绍过了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入口类

具体api这里不多介绍了,就那么几个,没必要详细介绍,这里对系统的imei进行hook操作了。网上很多人都对系统颜色值进行了hook,这里也顺带操作一下:

第三步:配置xml信息

在AndroidManifest.xml中需要配置两个地方,一个是使用权限,一个是声明hook的入口类即可。

第四步:安装运行
代码编写完成之后,直接运行安装即可,前提是你需要正确安装Cydia框架apk,安装成功界面如下:

然后我们安装hook工程apk,会出现这个提示:

点击,进入框架界面,点击重启即可。然后我们查看系统界面颜色以及返回的imei值:

查看颜色的确变成骚气的粉色了,再看看imei值的修改:

imei值也成功的hook成功了。到这里我们就用Substrate框架hook了Java层功能。当然这些功能Xposed也是可以做到的哦。

四、Hook Native层功能
那么下面继续来看如何hook native层的功能,也是本文的重点哦。
第一步:创建一个Native工程

这里用Eclipse操作,简单便捷,有很多人问我为什么不用AS,我想说在我心中Eclipse最好用,AS真心好丑,不想用而已。

第二步:导入Substrate的native功能包
上图可以看到,需要导入一个substrate.h头文件,和两个so功能包。native层应用都是这么干的,提供一个头文件告诉你api,具体实现在so包中。

第三步:寻找hook的函数名
这里网上没有好的hook代码,这里我们为了更好的查看这个工具的牛逼之处,弄一个比较实际的案例就是hook系统加载dex的函数,这样我们就可以获取到每个应用的dex文件了,这种方式对于早期加固是一个比较好的脱壳方案。在之前介绍脱壳我们会使用IDA在指定函数处下个断点,那么我们这里如果要hook的话,就需要找到这个加载dex的函数名称,这里一定要记的是导出的函数名,首先我们导出设备的libdvm.so文件:system/lib/libdvm.so

然后使用IDA打开,寻找加载dex函数:

切换到Exports视图页面,然后搜索dexFileParse函数,点进去:

看到了,我们需要得到的是EXPORT的函数名,需要hook的是他,这个一定要注意,不然hook没效果的。找到函数之后还得获悉函数的参数类型和返回类型,这个也好办,因为我们有android源码,所以直接在源码中找这个函数参数说明已经返回值说明即可。因为Native层hook的其实是函数指针的替换,所以如果想hook原来的函数,必须新建一个和原来一样的函数功能,然后传递函数指针即可。这个函数的参数和返回值定义如下:
DexFile dexFileParse(const unsigned __int8 , unsigned int, int);
参数含义非常简单,第一个参数表示dex文件的起始地址,第二个参数是dex文件的长度,有这两个参数我们就可以写入文件了。这里我们需要获取DexFile类型,这个直接在Android源码目录下找到这个头文件DexFile.h即可。然后导入工程中。这样我们就找到了需要hook的函数已经说明了,下面就开始编写hook代码了。

第四步:编写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代码:

这里首先找到so中需要hook函数符号,然后直接调用MSHookFunction传入符号,新函数地址,旧函数地址即可。这里可以看到在C中指针是多么强大,实现了函数的回调机制,而且非常方便。然后继续来看新定义的hook函数功能:

这里先获取当前进程名称,然后构造dex文件名,保存dex文件,最后一定要记得返回原始的函数,不能影响正常的流程。这里还要记得过滤规则,不要对每个进程都进行操作,并不是每个进程都是有效的。而这些过滤规则是根据自己打印进程名来自行添加即可。

第五步:编写MK文件
上面代码已经编写完成了,下面来编写编译脚本吧,主要注意编译之后的文件名一定要有cy结尾,不然是hook失败的,然后就是需要导入substrate的so库文件:

第六步:安装并运行
和之前一样,运行之后,需要重启设备,然后先看看native层的log信息:

然后再去目录中查看保存的dex文件信息:

dex文件都保存成功了,这样会发现如果对于早期的加壳,可以采用这种方式进行脱壳操作的。也不需要用IDA进行调试dump出dex文件了。

五、说明
关于native层hook就介绍完了,这里还是需要说明几点:
第一点:hook之前需要分析so获取需要hook的函数名称,参数返回值定义,这个和hook Java层一样,必须先找到突破点才能进行下一步。
第二点:hook可能会有一些错误,因为是native层比java层错误信息难发现,所以最好是在某些地方加一些日志观察结果。
如果在使用过程中发现hook失败,注意检查这几个条件:
第一个:xml中是否配置了权限和入口
第二个:编译脚本MK中的后缀名是否为cy

项目下载地址:https://github.com/fourbrother/CydiaSubstrateHook

六、总结
关于CydiaSubstrate框架就介绍到这里了,后面会分析如何hook游戏的so文件来进行破解工作,有了这个框架再也不怕hook难了,native层代码也可以一览无余了。

作者:JiangWei_App
链接:http://www.jianshu.com/p/a9cd686a158d
來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解相关推荐

  1. Android逆向之旅—Hook神器Cydia Substrate使用详解

    一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...

  2. 5、frida进阶-Android逆向之旅---Hook神器家族的Frida工具使用详解

    本文转载自:https://www.cnblogs.com/qwangxiao/p/9255328.html 一.前言 在逆向过程中有一个Hook神器是必不可少的工具,之前已经介绍了Xposed和Su ...

  3. Android基础架构:Native层 Looper、Handler、Message 研究

    Android基础架构:Native层 Looper.Handler.Message 研究1,参考: https://www.cnblogs.com/roger-yu/p/15099541.html ...

  4. Android逆向之旅---爆破开启快手App的长视频拍摄权限功能

    一.功能说明 在前几天有人问我快手发布了内侧发布长视频的功能,他找快手小助手申请了但是没有回复,所以我就有空通过代码层面让他有这个功能看看效果如何,这个其实网上已经有很多人在说这个功能了,我们百度一下 ...

  5. Android基础入门教程——8.3.1 三个绘图工具类详解

    Android基础入门教程--8.3.1 三个绘图工具类详解 标签(空格分隔): Android基础入门教程 本节引言: 上两小节我们学习了Drawable以及Bitmap,都是加载好图片的,而本节我 ...

  6. 【Android语音合成TTS】百度语音接入方法,和使用技巧详解

    请尊重他人的劳动成果,转载请注明出处:[Android语音合成TTS]百度语音接入方法,和使用技巧详解 Ps. 依托于百度开放云,百度语音为合作伙伴提供了业界领先.永久免费的语音技术服务,目前已上线的 ...

  7. 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!

     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigame.com/android-game/327.html 很多童鞋说 ...

  8. android 6.0 存储卡,Android 6.0区别U盘和SD卡设备的方法详解

    如下所示: public static boolean isSdcardExists(Context context) { StorageManager storageManager = Storag ...

  9. Android逆向之旅---破解某应用加密算法(动态调试so和frida hook so代码)

    一.样本静态分析 最近有位同学发了一个样本给我,主要是有一个解密方法,把字符串加密了,加解密方法都放在so中,所以之前也没怎么去给大家介绍arm指令和解密算法等知识,正好借助这个样本给大家介绍一些so ...

最新文章

  1. System.Transactions深入了解
  2. UVa11300 Spreading the Wealth(数学问题)
  3. 0207.Domino R8.0.x群集配置手册
  4. 大咖来信 | 轮值董事长徐直军,复盘华为AI战略出台始末
  5. 推送技术 Push Notification
  6. zabbix agent类型的所有key 值
  7. java 异常总结_Java异常的十大问题总结
  8. Bailian2945 导弹拦截【最长上升子序列+DP】
  9. sql 基本操作语句笔记
  10. 比赛计分软件部分界面抓图
  11. 踩过的坑:__file__、__package__和__name__
  12. excel做地图热力图_我做了一个傻瓜式热力图生成工具
  13. tomcat启动startup出现闪退问题
  14. 窃听信道模型中的保密通信性能研究
  15. 插上U盘没反应/U盘不显示/显示U盘图标但是不显示盘符
  16. 轨道交通通信施工学习总结(四)漏泄同轴电缆安装
  17. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)
  18. 微信小程序:enablePullDownRefresh、onReachBottomDistance 、动态设置窗口的背景色、动态设置下拉背景字体
  19. 一起来捉妖找不到服务器,一起来捉妖妖怪分布大全 所有妖灵不同地点位置详解...
  20. 如何在本地进行一个IP访问多个域名

热门文章

  1. 转 -- 推荐几本云计算的经典书籍
  2. 【tool】测试用例检查表范例
  3. stack与queue
  4. [RM HA 1] Cloudera CDH5 RM HA功能验证
  5. 简单实例讲解linux的module模块编译步骤
  6. 一个可以在github上搜代码段的网站
  7. 通信工程专业的一些小知识点
  8. 【云炬大学生创业基础笔记】第1章第3节 什么是创业的讨论
  9. 从零开始带你一步一步使用 YOLOv3 测试自己的数据
  10. VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)