<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的打包过程

  1.  除了assets和res/raw资源被原封不动打包进APK外,其他资源都被编译为二进制xml,所以解压apk后,无法直接打开xml文件;
  2. 除了asserts资源之外,其他资源都会被赋予一个资源ID;
  3. 打包工具负责编译和打包资源,编译完成后,会生成一个resources.arsc文件和一个R.java,前者为资源索引表,后者为各个资源ID常量,提供在代码中索引资源;
  4. 应用配置文件AndroidManifest.xml同样会被编译成二进制XML文件,在打包进APK;
  5. 应用程序在运行时通过AssetManager或资源ID或文件名访问资源;
  6. 直接解压后,会发现打不开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)技术

给病毒构建一个仿真的环境,诱骗病毒自己脱掉“马甲”。并且“虚拟环境”和用户的计算机隔离,病毒在虚拟机的操作不会对用户计算机有任何影响。

原文地址:https://www.cnblogs.com/shuimohei/p/15423666.html