最近开始使用Cydia Substrate框架进行逆向分析。

Cydia是什么东东我就不多说了,自行百度,听说它可以越狱什么的,修改手机配置什么的,但这里只是通过一个例子,介绍如何使用Cydia Substrate框架进行hook Android java代码。

相比Xposed框架,Cydia是有一定的优势的,根据我目前使用的情况,暂时有如下两点:

一是,Cydia能hook除了第一个smali文件夹外的第二第三个smali文件夹(如下图)。

这话怎说?APKTool反编译一个APK时,有时会分割成好几个smali文件,Xposed只能hook第一个smali文件夹下的smali文件,有点坑,但Cydia却都可以hook。

二是,Cydia能hook本地方法,而Xposed不可以。

基于以上两个优点,个人认为Cydia比Xposed好用,Xposed局限性较大,起码目前是这么认为的~

但有个技巧的方法只能在Xposed上用,就是通过刻意抛异常,根据异常日志找方法调用路径,这个在逆向分析常用的技巧无法再Cydia上用,因为Cydia抛异常后貌似不会以日志的形式打印出来,反正我试了很多次都不行。。。

开始说说如何使用吧

-------------------------------------------------------

1.  首先,下载com.saurik.substrate.apk,然后安装,手机必须得root过。这个是Cydia Substrate框架,需要另写模块加载进去。

安装之后点击 “Link  Substrate  Files” 即可。

2.  确定需要hook的对象APK中的方法,编写模块代码。

这里,我将hook一个apk里被混淆过的方法,并说明注意点。

因为混淆过,所以类名和方法名都被改成a,b,c等

该方法所在类:com.dianping.h.f.a.o

方法名:b,

参数:com.dianping.nvnetwork.u 类

返回值 :com.dianping.nvnetwork.u 类

好,开始写模块,先在Android Studio里创建一个工程,该工程不需要Activity,在工程创建一个java文件,该文件就是模块代码,然后下载Cydia Substrate SDK,解压后将其放到libs文件夹下,并将jar包“Add as library”。

接下来,打开AndroidManifest,配置好一个meta-data和一个permission即可:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.samuelzhan.substratehook"><application><meta-data android:name="com.saurik.substrate.main"android:value=".Module"/></application><uses-permission android:name="cydia.permission.SUBSTRATE"/></manifest>

然后,编写模块代码:

public class Module {static void initialize(){MS.hookClassLoad("com.dianping.h.f.a.o",new MS.ClassLoadHook() {public void classLoaded(Class<?> resources) {Method method;try {
//                       不能使用本进程的ClassLoader,必须使用hook对象进程的ClassLoader
//                            Class<?> u=ClassLoader.getSystemClassLoader().loadClass("com.dianping.nvnetwork.u");
//                            Class<?> u = Class.forName("com.dianping.nvnetwork.u").getClass();Class<?> u= resources.getClassLoader().loadClass("com.dianping.nvnetwork.u");//                       getMethod只能获取public方法,getDeclareMethod能获取所有方法
//                            method = resources.getMethod("b", u);method = resources.getDeclaredMethod("b", u);} catch (Exception e) {Log.d("zz", "exception: "+e.toString());method = null;}if (method != null) {final MS.MethodPointer old = new MS.MethodPointer();MS.hookMethod(resources, method, new MS.MethodHook() {@Overridepublic Object invoked(Object o, Object... objects) throws Throwable {// before hookLog.d("zz", "hook 成功");Object result = old.invoke(o, objects);// after hookreturn result;}}, old);}}});}

经过一个下午的摸索,我这里提出三点注意的地方:

第一,模块和hook对象的进程是两个进程,所以使用ClassLoader加载 u 类时要从resources那里getClassLoader,这是获取hook对象的ClassLoader,不然你加载不了 u 类而抛异常ClassNotFound(当然,如果只是使用java原生的类,即不是自定义的类的话,那么直接  .class后缀就可以获取到 class<?>了)。

第二,获取该类下的方法时,使用getDeclaredMethod可以获取所有方法,包括public,private,protected,而getMethod只能获取public。

因为我hook的那个函数是protected的,但由于笔者之前一直用getMethod而导致没法hook到这方法。。。

Method method = resources.getDeclaredMethod("b", u);

第三, 在方法被hook时,回调invoked方法,在此方法内有一句

Object result = old.invoke(o, objects);
该行代码的上面和下面分别对应Xposed的beforeMethodHook和afterMethodHook两个回调方法,如下图:

3.  模块写好后,导出项目,然后安装到手机上,手机若安装了Cydia SubStrate,则会在通知栏提醒软重启。

重启手机后,我们运行我们的目标APK即可以被Cydia Substrate 模块识别到,并打印出相关日志。

------------------------------------------------

到此为止,Cydia Substrate的基本使用已到此为止。

附加内容(可以忽略):

我上面提到的参数和返回值都是 u类实例,我之所以要hook这个 u类,是因为该 u 类内有个变量 InputStream,混淆后以 g 字符命名。

为了看到这个InputStream的内容,我必须通过反射找到该类的字段g,所以模块的写法会有所变化,但变化不大,增加了Field变量的获取,直接代码:

public class Module {static void initialize(){MS.hookClassLoad("com.dianping.h.f.a.o",new MS.ClassLoadHook() {public void classLoaded(final Class<?> resources) {try {Class<?> u= resources.getClassLoader().loadClass("com.dianping.nvnetwork.u");final Method method = resources.getDeclaredMethod("b", u);final Field field=u.getDeclaredField("g");final MS.MethodPointer old = new MS.MethodPointer();MS.hookMethod(resources, method, new MS.MethodHook() {@Overridepublic Object invoked(Object o, Object... objects) throws Throwable{// before hookInputStream is1=(InputStream)field.get(objects[0]);String before=byte2HexString(inputStream2Byte(is1));Log.d("zz", "Before HexString:"+before);is1.reset();Object result = old.invoke(o, objects);// after hookInputStream is2=(InputStream)field.get(result);String after=byte2HexString(inputStream2Byte(is2));Log.d("zz", "After HexString:"+after);is2.reset();return result;}}, old);} catch (Exception e) {Log.d("zz", "exception: "+e.toString());}}});}public static byte[] inputStream2Byte(InputStream is) throws IOException {ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int n = 0;while ((n = is.read(buffer)) != -1) {baos.write(buffer, 0, n);}return baos.toByteArray();}public static byte[] hexString2Byte(String hex) {int len = (hex.length() / 2);hex=hex.toUpperCase();byte[] result = new byte[len];char[] achar = hex.toCharArray();for (int i = 0; i < len; i++) {int pos = i * 2;result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));}return result;}

运行结果:

好了,Cydia的介绍到此为止,其实还有其它功能的,比如hook C/C++的方法,这个日后再继续研究。

Android逆向分析之Cydia相关推荐

  1. Android 逆向分析大全

    转载:Android 逆向分析大全:https://www.jianshu.com/p/a12d04fc748f 1. 概述 1.1 分析步骤 通用逆向分析步骤 1. 了解该模块正向编程相关方法 2. ...

  2. android逆向分析概述_Android存储概述

    android逆向分析概述 Storage is this thing we are all aware of, but always take for granted. Not long ago, ...

  3. android逆向分析之从smali到java

    通过上一篇 android逆向分析之反编译,在dex2jar的前提下,我们获取到了源码,在apktool的前提下,我们可以获取到资源和smali文件,本篇主要讲述smali几个最基本的知识和smali ...

  4. Android逆向分析案例——某点评APP登陆请求数据解密

    今天,七夕,单身23载的程序汪,默默地写着博客~ 上一次的逆向分析案例中讲了如何去分析某酒店的APP登陆请求,为了进一步学习如何逆向分析以及学习其他公司的网络传输加解密,本次案例将继续就登陆请求的数据 ...

  5. Android逆向分析工具ded的使用

    今天使用了ded做逆向分析,瞬间比Apktool高大上了,功能太强大了,不过还有升级版,明天研究.吼吼~ 详细内容可以参考这篇论文:A Study of Android Application Sec ...

  6. android逆向笔记,Android逆向分析笔记(1)

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近在读<Android软件安全与逆向分析>,虽然不从事逆向研究的工作,但作为一名Android开发者,觉得 ...

  7. android逆向分析so,Android逆向——so反编译分析由浅入深(回帖奖励)

    如果可以,请自己编写so文件库,然后进行反编译自行学习.这样的进步是最快的. 这篇分析仅此一份,心血付出. 0x00 前言 说明 1.之前学习Android逆向的时候跑的太快,很多东西没有咀嚼直接吞咽 ...

  8. Android逆向分析之Xposed的hook技术

    转载自:http://blog.csdn.net/qq_18870023/article/details/51753587 Android逆向工程里常用到的工具除了的dex2jar,jd-gui,   ...

  9. 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台

    一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...

最新文章

  1. geany怎么创建文件夹_SAP事务码太多,记不住怎么办?
  2. LeetCode实战:字符串相乘
  3. python面试总结 博客园_python面试题总结
  4. 【算法设计与分析】10 差消法化简高阶递推方程
  5. python 字符串unicode编码_python的string与Unicode转换,gbk字符串编码
  6. 飞鸽传书2012是否发布了?
  7. java se环境变量_Windows 7中配置JDK(Java SE)环境变量
  8. WSO2 WSF/CPP 网络服务开发例子1--HELLO
  9. 适配器模式之桥梁模式
  10. Android Studio躲避小球小游戏(一界面布局)
  11. 如何防止输入同样的编号到数据库中(30分)
  12. python中grid是什么意思_python中网格Grid和列表List的认识
  13. 考研小作文真题、范文及讲解
  14. Zoommy for mac最新免费版(图片素材搜索下载软件)
  15. win10 休眠设置无效_windows10系统电脑点击睡眠没反应的解决方法
  16. 有哪些好用的在线电影影视导航网站
  17. 文章本天成 妙手偶得之 两句三年得 一吟双泪流
  18. 祖冲之究竟是如何算出圆周率的?
  19. 高品质的网页设计: 实例与技巧
  20. c++输出方块_数据科学 | OpenCV方块体识别解决方案

热门文章

  1. 【竞赛篇-电商竞赛】浙江省电子商务竞赛参赛经验
  2. 比隐私滥用更可怕的,是AI摄像头的黑灰产之困
  3. 为什么感觉人们一般都喜欢买1000块钱左右的手机?
  4. OpenCore Projects 网址
  5. 【物理应用】matlab计算油气井井底压力
  6. 996、8116、007,要命的工作,你干不干?
  7. streamstring用法介绍
  8. 计算机图形学 期末复习笔记
  9. x86架构电脑装linux系统,真正苹果X86操作系统安装版试用!
  10. 程序员英语语法学习(1)句子成分有八个,你却只知主谓宾?