Android逆向分析之Cydia
最近开始使用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相关推荐
- Android 逆向分析大全
转载:Android 逆向分析大全:https://www.jianshu.com/p/a12d04fc748f 1. 概述 1.1 分析步骤 通用逆向分析步骤 1. 了解该模块正向编程相关方法 2. ...
- android逆向分析概述_Android存储概述
android逆向分析概述 Storage is this thing we are all aware of, but always take for granted. Not long ago, ...
- android逆向分析之从smali到java
通过上一篇 android逆向分析之反编译,在dex2jar的前提下,我们获取到了源码,在apktool的前提下,我们可以获取到资源和smali文件,本篇主要讲述smali几个最基本的知识和smali ...
- Android逆向分析案例——某点评APP登陆请求数据解密
今天,七夕,单身23载的程序汪,默默地写着博客~ 上一次的逆向分析案例中讲了如何去分析某酒店的APP登陆请求,为了进一步学习如何逆向分析以及学习其他公司的网络传输加解密,本次案例将继续就登陆请求的数据 ...
- Android逆向分析工具ded的使用
今天使用了ded做逆向分析,瞬间比Apktool高大上了,功能太强大了,不过还有升级版,明天研究.吼吼~ 详细内容可以参考这篇论文:A Study of Android Application Sec ...
- android逆向笔记,Android逆向分析笔记(1)
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近在读<Android软件安全与逆向分析>,虽然不从事逆向研究的工作,但作为一名Android开发者,觉得 ...
- android逆向分析so,Android逆向——so反编译分析由浅入深(回帖奖励)
如果可以,请自己编写so文件库,然后进行反编译自行学习.这样的进步是最快的. 这篇分析仅此一份,心血付出. 0x00 前言 说明 1.之前学习Android逆向的时候跑的太快,很多东西没有咀嚼直接吞咽 ...
- Android逆向分析之Xposed的hook技术
转载自:http://blog.csdn.net/qq_18870023/article/details/51753587 Android逆向工程里常用到的工具除了的dex2jar,jd-gui, ...
- 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台
一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...
最新文章
- geany怎么创建文件夹_SAP事务码太多,记不住怎么办?
- LeetCode实战:字符串相乘
- python面试总结 博客园_python面试题总结
- 【算法设计与分析】10 差消法化简高阶递推方程
- python 字符串unicode编码_python的string与Unicode转换,gbk字符串编码
- 飞鸽传书2012是否发布了?
- java se环境变量_Windows 7中配置JDK(Java SE)环境变量
- WSO2 WSF/CPP 网络服务开发例子1--HELLO
- 适配器模式之桥梁模式
- Android Studio躲避小球小游戏(一界面布局)
- 如何防止输入同样的编号到数据库中(30分)
- python中grid是什么意思_python中网格Grid和列表List的认识
- 考研小作文真题、范文及讲解
- Zoommy for mac最新免费版(图片素材搜索下载软件)
- win10 休眠设置无效_windows10系统电脑点击睡眠没反应的解决方法
- 有哪些好用的在线电影影视导航网站
- 文章本天成 妙手偶得之 两句三年得 一吟双泪流
- 祖冲之究竟是如何算出圆周率的?
- 高品质的网页设计: 实例与技巧
- c++输出方块_数据科学 | OpenCV方块体识别解决方案