案例App:引力播
一、常见的壳
通常是看lib文件夹下so库特征,以下是市面上常见的不同厂商对APP的加固特征:
爱加密: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
三、如何查看有没有壳
用apktool
对apk进行反编译,或者修改apk的后缀为zip,进行解压。查看解压后的文件下的lib目录,
可以看到这两个是用了腾讯的乐加固,或者我们不确定的话可以用jadx打开apk,也是可以发现的
都是壳的代码。不过即使怎么加壳,它都会去调源apk的Application,打开AndroidManifest.xml
文件,
可以看到,上面一个是壳的,下面是源apk的Application。
逆向/脱壳方法
反编译/Hook技术和动态调试
Hook:先取得要Hook函数/方法的控制权,不用破坏程序
动态调试:反调试,汇编,计算内存地址
四、Hook技术
改变程序执行流程的一种技术 在函数被调用前,通过HOOK技术,先得到该函数的控制权,实现该函数的逻辑改写
Hook可以在在Java层、Native层(.so库)
在代码层 寻找要Hook的地方 进行Hook 改下代码逻辑
五、脱壳工具
脱壳原理:
在壳APK解密源APK后,源APK被加载前,拦截这个过程中的系统函数 把内存种Dex dump出来。
手动脱壳:
通过动态调试,跟踪计算Dex源文件的内存偏移地址,从内存中Dump出Dex文件 ,难度大,寄存器,汇编,反调试,反读写 IDA。
工具脱壳:
HOOK技术/内存特征寻找 简单易操作
基于xposed 脱壳工具:
Fdex2:Hook ClassLoader loadClass方法
通用脱壳 dumpDex:https://github.com/WrBug/dumpDex
逆向框架: 筑好底层 提供开发接口
xposed(Java 编译,只能在java层)
frida(Python Javascript 代码注入,可以hook住java层、Native层)
六、开始脱壳(用FDex2脱壳)
首先我们打开xposed,把FDex2打开,并选择我们要的app
接下来就可以运行app,然后我们去/data/user/0/com.iCitySuzhou.suzhou001
该目录下查看,多出来两个dex文件
把这两个文件拉到电脑用kadx打开,第一个是壳
打开第二个很明显看到这才是源apk的源码,而且可以发现它对源码进行混淆了
所以到这里我们的脱壳就成功了。
后面会用frida进行脱壳。。。