二.判断壳的类型:
判断App是不是加壳很简单,使用jadx打开Apk以后,查看App的四大组件类,如果组件类找不到实现,那么就是整体加壳了。
比如这里只能看到qihoo相关的壳代码,App的代码被隐藏了:
判断是不是函数抽取型壳就是看函数体是不是有意义的代码,比如下面就是一个抽取型壳,可以看到函数体都是nop指令:
判断是不是dex2C/VMP壳,就是要看是不是有Java方法被native化了,至于到底是dex2C还是VMP则需要更一步的判断,比如native函数注册地址是否相同:
三. 加壳角度来看整体型壳
整体壳需要解决如下几个问题:
1.如何将原始的dex文件加密隐藏起来
2.壳代码如何在执行前获取控制权并可访问到被隐藏加密的dex从而可以解密dex文件
3.如何动态加载解密后的dex文件并且让虚拟机可以识别到dex文件中的四大组件
问题1:
可以将原始的dex文件加密添加到壳dex文件的末尾,并且更新壳dex文件的checksum,signature和file_size反映出这些变化,因为在dex文件的头部信息中会保留这些值来检查dex文件格式的正确性:
修改了这三个值以后,壳dex文件的末尾就可以添加一些和dex格式定义中无关的信息,比如原始dex文件的个数,大小以及加密以后原始dex文件的内容。然后将壳d
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
ex替换掉原始的dex文件对Apk进行重打包即可。
问题2:
壳代码会将自己的Application类替换掉原来的Application类,因此壳的Application类的onCreate()
和attachBaseContext()
会在App进程启动的时候率先执行拿到控制权。而访问被隐藏加密的dex可以通过getApplicationInfo().sourceDir
来获取apk的路径,解压apk得到壳dex文件从而解密出壳dex文件里边附带的原始dex文件。
问题3:
通过Android中的类加载器动态加载解密后的dex文件,为了让四大组件可以正常走生命周期函数,还需要对类加载器进行修正,修正的方式大概有两种方式,下面的内容中会详细的描述。
四. Android类加载器:
类加载器在dex整体加壳与脱壳中起到了重要的作用。
网上有很多的文章介绍Java中的类加载器,因此我这里就不写了,这里主要说的是Android里边关于dex加载的"类"加载器。
类加载器可以在运行的时候加载在编译时未知的类,对于c/c++来说也有类似的功能dlopen与dlsym,而Android里边的BaseDexClassLoader
可以实现在运行的时候加载在编译时未知的dex文件,经过此加载器的加载,ART虚拟机内存中会形成相应的数据结构,对应的dex文件也会由mmap映射到虚拟内存当中,通过此加载器的<