加固
1.加固apk的特征(各家.so文件名特征 使用软件检测)(腾讯乐加固 360加固 梆梆 爱加密 等等)
2.第三方加固/自己加固(一般在哪家应用市场发布 就要用哪家的加固方案)
3.为什么要加固(一定程度保护源代码)
4.加固方式(.dex加固 .so加固)
不同厂商对APP的加固特征(解压app后在lib文件中看到)
爱加密:libexec.so,libexecmain.so,ijiami.dat
梆梆: libsecexe.so,libsecmain.so , libDexHelper.so libSecShell.so
360:libprotectClass.so,libjiagu.so,libjiagu_art.so,libjiagu_x86.so
百度:libbaiduprotect.so
腾讯:libshellx-2.10.6.0.so,libBugly.so,libtup.so, libexec.so,libshell.so stub_tengxun
网易易盾:libnesec.so
原理:
壳dex 读取源dex文件,加密后,写进一个新的dex文件
**
新APK运行
先加载壳APP—->壳APP读Dex文件末尾的源APKD大小——>在内存中壳APP解密出源APP—->运行源APP
壳APK有自己的Application对象
源APK有自己的Application对象
壳APK启动时 在AndroidMenifest.xml里找源APK的Application 执行它的oncreate方法 启动源APK
Dex文件格式:
任何类型的文件都有文件格式,对应的软件按照文件格式来就能解析出类型,.xml .json .jpeg
| … checksum signature file_size … |
|---|
| 脱壳Dex |
| 加密的源程序APK |
| 加密的源程序APK的大小 |
脱壳的方法
反编译/Hook技术和动态调试
Hook:先取得要Hook函数/方法的控制权,不用破坏程序
动态调试:反调试,汇编,计算内存地址
脱壳原理:
在壳APK解密源APK后,源APK被加载前,拦截这个过程中的系统函数 把内存中Dex dump出来
手动脱壳:
通过动态调试,跟踪计算Dex源文件的内存偏移地址,从内存中Dump出Dex文件
难度大,寄存器,汇编,反调试,反读写
IDA
工具脱壳:
HOOK技术/内存特征寻找
简单易操作
基于xposed 脱壳工具:
Fdex2:Hook ClassLoader loadClass方法 通用脱壳
dumpDex:https://github.com/WrBug/dumpDex
重写底层函数:
DexExtractor:重写libdvm.so dexFileParse函数。脱梆梆 爱加密 libart.so 安卓7.0
逆向框架: 筑好底层 提供开发接口**
xposed(Java 编译)
frida(Python Javascript 代码注入)
主要系统函数都已HOOK/基于xposed frida开发脱壳工具/有大神已开发上层应用模块
开发工具要了解 APP启动 加载过程的原理,细节
使用已有工具,技术晚半代至一代
脱老版本APP
icity脱壳 icity signature实现
Java在线执行
http://www.dooccn.com/java/
HOOK技术
改变程序执行流程的一种技术 在函数被调用前,通过HOOK技术,先得到该函数的控制权,实现该函数的逻辑改写
Hook Java层
Hook Native层(.so库)
在代码层 寻找要Hook的地方
进行Hook 改下代码逻辑
Fdex2通用脱壳工具使用
- 首先安装xposed框架
- 安装Fdex2脱壳工具
- 进入xposed installer -> 模块-> Fdex2->选择需要hook的app

- adb pull /data/user/0/com.iCitySuzhou.suzhou001 ~/Desktop/ 拉回本地看dex文件
- 用jadx打开dex文件
- 抓包发现 请求都会带signature,因此使用jadx打开dex文件查看源码,搜索signature找到加密逻辑代码

- 使用jadx的反混淆工具使函数名和变量名好分辨点,知道加密签名的函数

- 拷贝出代码,删除package … 修改类名和文件名一直,保存为类名.java文件
- 编译java文件为.class文件 javac Mysig.java
- 把class做成jar包 jar cvf Mysig.jar Mysig.class
- 使用python代码实现逻辑

