一些关于加固的基本认识
- 第三方加固/app公司自己加固 (一般在哪家应用市场上发布,就用哪家的加固方案(也可以选择不加固))
- 加固方式(.dex加固、.so加固)
- 查看/确认加固:
不同厂商对APP的加固特征(可以先看lib,实在不知道可以拿so文件名到百度上搜搜看)
爱加密: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,libshella-2.10.6.0.so
网易易盾:libnesec.so
用jadx打开class.dex只能看到壳,看不到程序源码 - 加固后的AndroidManifest.xml<application>会先进入自己壳的类,进行解密脱壳操作,而不是直接启动被加固的程序
加固原理
系统执行时先加载没加密的壳的代码对加密了的源dex进行解密并执行
逆向/脱壳方法
- 反编译/Hook技术/动态调试
- Hook:先取得要Hook函数/方法的控制权。好处:不用破坏程序
- 动态调试(内存):反调试,汇编,计算内存地址
Hook技术(Java层/Native层(.so库))
改变程序执行流程的一种技术 在函数被调用前,通过HOOK技术,先得到该函数的控制权,实现该函数的逻辑改写
脱壳
脱壳原理:
在壳APK解密源APK后,源APK被加载前,拦截这个过程中的系统函数 把内存种Dex dump出来
脱壳方式:
1.基于xposed的现有的脱壳工具(Java层):
Fdex2:Hook ClassLoader loadClass方法 通用脱壳
dumpDex:https://github.com/WrBug/dumpDex
2.重写底层函数(Native层):
DexExtractor:重写Dalvik虚拟机(安卓6.0以前,现在用ART虚拟机)的libdvm.so里的读写dex的dexFileParse函数。(能脱壳脱梆梆、爱加密,安卓7.0后的无法脱)
3.逆向框架: 筑好底层 提供开发接口(主要系统函数都已HOOK/基于xposed frida开发脱壳工具/有大神已开发上层应用模块)
xposed(Java 编译)
frida(Python Javascript 代码注入)
如何看apk是否被加固
直接改成zip后缀解压进去看特征:
1.看lib文件夹里的so文件名有没有上述的命名特征,不确定的就拿怀疑的文件名拿去百度上搜索一波
2.用jadx看classes.dex是不是只看得到壳代码
加固后怎么分析xml文件