逆向工程

IT桔子逆向实战

使用 jadx 反编译

首先,我们到豌豆荚下载最新的 APK。然后执行 jadx-gui itjuzi.apk。很遗憾发现加壳了,应该是百度的壳,我们先跳过,去找一个老版本,看看有没有没加过壳的。

很遗憾,没有找到不带壳的版本,所以我们需要进行脱壳

脱壳

阅读了[这篇文章][1],我们知道凡是脱壳都会有两个步骤,一个是找到原始的 classes.dex 文件,一个是修复这个 dex 文件。

首先,我们知道动态加载的dex必然会调用dalvik/vm/DvmDex.cpp中以下两个函数任意一个:

  1. dvmDexFileOpenFromFd 从文件描述符获取DexFile结构体
  2. dvmDexFileOpenPartial 从内存获取DexFile结构体

通过编写函数可以把这个 dex 文件 dump 出来,但是这个函数运行在哪儿呢?

未完待续。。

[1] https://bbs.pediy.com/thread-218891.htm

unidbg 教程

介绍

unidbg 是一个基于 unicorn 的逆向工具,可以黑盒调用安卓和 iOS 中的 so 文件。unidbg 是一个标准的 java 项目。

由于现在的大多数 app 把签名算法已经放到了 so 文件中,所以要想破解签名算法,必须能够破解 so 文件。但是我们知道,C++ 的逆向远比 Java 的逆向要难得多了,所以好多时候是没法破解的,那么这个时候还可以采用 hook 的方法,直接读取程序中算出来的签名,但是这样的话,需要实际运行这个应用,需要模拟器或者真机,效率又不是很高。

unidbg 就是一个很巧妙地解决方案,他不需要直接运行 app,也无需逆向 so 文件,而是通过在 app 中找到对应的 JNI 接口,然后用 unicorn 引擎直接执行这个 so 文件,所以效率也比较高。

工具

逆向三剑客,unicorn,keystone,capstone,以及 unicorn_java

  1. capstone 反编译框架
  2. unicorn 基于 QEMU 的模拟器

Unicorn 介绍

基础介绍

比如我们单纯只是需要模拟代码的执行而非需要一个真的CPU去完成那些操作, 又或者想要更安全地分析恶意代码, 检测病毒特征, 或者想要在逆向过程中验证某些代码的含义. 使用CPU模拟器可以很好地帮助我们提供便捷.

Java 基础

由于好久没用 java了,一直都用 Python 比较多,先回忆一下需要用到的 java 知识。

java -D 用于指定参数。比如 -Djava.library.path=xxx.so

-cp 用于指定 classpath

Java 中加载 so 文件。

  1. 使用 System.load(String) 可以加载 so 文件
  2. 使用 java.library.path 指定路径
  3. java.library.path 会默认从 LD_LIBRARY_PATH 中读取

Unsatisfied linked error 的解决

一般是由于缺少库导致的,到作者的帖子中下载对应的

Maven 项目介绍

https://www.cnblogs.com/now-fighting/p/4858982.html

未完待续

参考

  1. 加载 jar 包中的动态库
  2. java 的 -D 选项
  3. java.library.path
  4. unidbg: 作者原贴
  5. unicorn 基础教程,强烈推荐 (https://bbs.pediy.com/thread-225018.htm)
  6. 包含 C 代码的 unicorn 教程英文, 中文
  7. Unicorn 教程 (https://ctf-wiki.github.io/ctf-wiki/reverse/unicorn/introduction/)
  8. unicorn 原理介绍,必读 (https://zhuanlan.zhihu.com/p/30612805)
  9. 逆向常用工具合集 (https://5alt.me/wiki/%E9%80%86%E5%90%91)
  10. unicorn 的流程图
  11. [https://o0xmuhe.github.io/2018/01/15/Unicorn-Engine%E5%88%9D%E4%BD%93%E9%AA%8C/]
  12. pwn tools http://docs.pwntools.com/en/stable/

Android 反汇编 APK

使用 jadx[1]

编译和安装 jadx

mkdir jadx
git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist   # you might need to wait on this

或者直接 brew install jadx

decompile apk

  1. change apk to zip file and unzip it
  2. copy out the class.dex file
  3. build/jadx/bin/jadx -d OUTDIR PATH_TO_CLASS.DEX or jadxgui PATH

工具

apk studio

如何 sign:https://www.nevermoe.com/?p=373

smali code tutorial: https://forum.xda-developers.com/showthread.php?t=2193735

一篇很好的pdf的文档,利用smali code:http://www.security-assessment.com/files/documents/whitepapers/Bypassing%20SSL%20Pinning%20on%20Android%20via%20Reverse%20Engineering.pdf

安卓中 pinning 的原理

使用自己的keystore实例化 TrustManagerFactory

关键语句

InputStream in = resources.openRawResource(certificateRawResource);//file name of res/raw keyStore = KeyStore.getInstance("BKS"); keyStore.load(resourceStream, password);

http://fdwills.github.io/diary/2014/06/13/ssl-pinning.html

一些现成的 工具

https://github.com/ac-pm/SSLUnpinning_Xposed xposed 插件,已测试不好用
https://github.com/iSECPartners/Android-SSL-TrustKiller 需要cydia

豌豆荚商店中有一个 xposed installer miui专版,使用这个可以很好地安装 xposed

之后安装

另一只种思路,找到,找到bks文件,替换掉,重新打包,签名

https://stackoverflow.com/questions/30708548/how-to-modify-the-data-in-the-assets-folder-in-existing-apk-programmatically

另外一些工具

https://github.com/ac-pm/Inspeckage

https://github.com/iSECPartners/Android-SSL-TrustKiller 需要cydia

https://github.com/iSECPartners/android-ssl-bypass 一个基础工具,通过替换trust manager实现

arm 汇编教程

https://mp.weixin.qq.com/s/DKeXqzE6bj5t0eWTkLLCBQ

[1] http://www.jianshu.com/p/65c2f447946e