<APK>学习APK分析
1.APK目录结构
1.1 assets目录结构(只写一下我遇到的)
1.2 lib目录结构(只写一下我遇到的)
1.3 META-INF目录结构(只写一下我遇到的)
哈希值记录情况:
1.4 res目录结构(只写一下我遇到的)
2.APK的安装过程
- (1)将APK安装包复制到/data/app下,校验APK签名是否正确,检查APK结构是否正常;
- (2)解压并校验APK中的dex文件,确定dex文件没有被损坏,将dex优化成odex,使得应用程序启动时间加快;
- (3)在/data/data目录下建立与APK包名同名的文件夹;
- (4)若APK中存在lib库,系统会判断这些so库的名字,查看是否以lib开头,以.so结尾,根据CPU的架构解压对应so库到/data/data/packagename/lib下;
- 优化后的obex结构如下:
- odex文件头(添加了一些数据)
- dex文件
- 依赖库(新增)
- 辅助数据(新增)
3.APK的打包过程
- 除了assets和res/raw资源被原封不动打包进APK外,其他资源都被编译为二进制xml,所以解压apk后,无法直接打开xml文件;
- 除了asserts资源之外,其他资源都会被赋予一个资源ID;
- 打包工具负责编译和打包资源,编译完成后,会生成一个resources.arsc文件和一个R.java,前者为资源索引表,后者为各个资源ID常量,提供在代码中索引资源;
- 应用配置文件AndroidManifest.xml同样会被编译成二进制XML文件,在打包进APK;
- 应用程序在运行时通过AssetManager或资源ID或文件名访问资源;
- 直接解压后,会发现打不开xml文件,因为其已经变成二进制xml了;
3.Dex文件分析
- dex文件结构
- 文件头
- header:文件头
- 索引区
- string_ids:字符串索引
- type_ids:类型索引
- proto_ids:方法原型的索引
- field_ids:域的索引
- method_ids:方法的索引
- 数据区
- class_defs:类的定义区
- data:数据区
- link_data:链接数据区
- 文件头
4.APK脱壳、解密、分析技术
4.1 什么是加壳?
类似于气功师的EX念气罩:通过一系列数学计算,将可执行程序文件或动态链接库文件的编码进行改变,使得“”壳“”先于程序运行,拿到控制器,取得程序的控制权。
一方面:壳可以压缩、加密驱动程序,可以缩小程序体积或加密程序编码,可以保护软件不被非法修改或反编译。
另一方面:壳因为先于原始程序运行,可以将加密的代码还原成原始程序代码,当然也可以植入木马病毒,很多木马病毒都是基于此原理。
4.2 壳的种类和运行方式?
软件的壳大致可以分为:加密壳、压缩壳、伪装壳、多层壳等类。
(1)从技术的角度出发,壳是一段执行于原始程序之前的代码。
(2)原始程序的代码在加壳的过程中可能已经被压缩、加密(被修改)。
(3)当加壳的文件执行时,壳这段代码先于原始程序运行,它将压缩、加密后的代码还原成原始程序代码,然后在把执行权还给原始代码。
4.3 加壳的作用?
加壳的目的:为了隐藏程序真正的OEP(入口点,防止被破解)
可能的应用:
(1)将一些版权信息保护起来,不让别人随意改动,即为了保护软件不被破解,通常都是采用加壳来进行保护。(阻止反汇编)
(2)需要将程序搞小一点,从而方便使用,于是需要用到压缩壳。(压缩程序体积)
(3)在黑客界给木马等软件加壳脱壳以躲避杀毒软件(躲避杀毒软件)
4.4 壳的历史
第一代:整体型壳(Dex加密)——文件加载和内存加载
特点:采用Dex整体加密,动态加载运行的机制;
Dex字符串加密资源加密对抗反编译反调试自定义DexClassLoader
第二代:函数抽取型壳(Dex抽取与So加固)——在函数粒度完成代码保护
特点:粒度更细,将方法单独抽取出来,加密保存,解密执行;
对抗第一代壳常见的脱壳法Dex Method代码抽取到外部(通常企业版)Dex动态加载So加密
第三代:Dex2C壳(Dex动态解密与So混淆)——Java函数Native化
特点:独立虚拟机解释执行、语义等价语法迁移,强度最高。
Dex Method代码动态解密So代码膨胀混淆对抗之前出现的所有脱壳法
第三代:arm VMP
vmp壳的识别
4.5 加固厂商的特征
娜迦: libchaosvmp.so , libddog.solibfdog.so
爱加密:libexec.so, libexecmain.so
梆梆: libsecexe.so, libsecmain.so , libDexHelper.so
360:libprotectClass.so, libjiagu.so
通付盾:libegis.so
网秦:libnqshield.so
百度:libbaiduprotect.so
4.6 脱壳的方法
硬脱壳:指的找出加壳软件的加壳算法,写出逆向算法,像压缩和解压缩一样。目前很多壳均带有加密、变形的特点,每次加壳生成的代码都不一样,硬脱壳对此无能为力。(需要运用汇编语言,跟踪断点)
软脱壳:动态脱壳,加壳的程序需要在运行的时候还原成原始形态,加壳程序会在运行时自行脱掉马甲。目前,有一种脱壳方式是抓取内存中的镜像,在重构成标准的执行文件。相比硬脱壳方法,这种脱壳方法,对自行加密/变形的壳处理效果更好
脱壳的一般流程:查壳->寻找OEP->Dump->修复
4.7 虚拟机脱壳引擎(VUE)技术
给病毒构建一个仿真的环境,诱骗病毒自己脱掉“马甲”。并且“虚拟环境”和用户的计算机隔离,病毒在虚拟机的操作不会对用户计算机有任何影响。