当前位置: 首页 > news >正文

安卓漏洞学习(十八):Android加固基本原理

APP加固技术发展历程

在这里插入图片描述

APK加固整体思路

在这里插入图片描述
加固整体思路:先解压apk文件,取出dex文件,对dex文件进行加密,然后组合壳中的dex文件(Android类加载机制),结合之前的apk资源(解压apk除dex以外的其他资源,如manifest、res等),打包新的apk文件,并对新的apk文件进行对齐、签名。

Android加固原理

在这里插入图片描述
Dex文件整体加固原理如下:
在这里插入图片描述
该过程涉及到三个对象,分别为:

1.源程序

源程序也就是我们的要加固的对象,这里面主要修改的是原apk文件中的classes.dex文件和AndroidManifest.xml文件。

2.壳程序

壳程序主要用于解密经过加密了的dex文件,并加载解密后的原dex文件,并正常启动原程序。

3. 加密程序

加密程序主要是对原dex文件进行加密,加密算法可以是简单的异或操作、反转、rc4、des、rsa等加密算法。
  该加固过程可以分为如下4个阶段:
  (1) 加密阶段
  (2)合成新的dex文件
  (3)修改原apk文件并重打包签名
  (4)运行壳程序加载原dex文件加密阶段

加密阶段

主要是将把原apk文件中提取出来的classes.dex文件通过加密程序进行加密。
在这里插入图片描述

合成新的dex文件

这一阶段主要是将上一步生成的加密的dex文件和我们的壳dex文件合并,将加密的dex文件追加在壳dex文件后面,并在文件末尾追加加密dex文件的大小数值。
 在这里插入图片描述
在壳程序里面,有个重要的类:ProxyApplication类,该类继承Application类,也是应用程序最先运行的类。所以,我们就是在这个类里面,在原程序运行之前,进行一些解密dex文件和加载原dex文件的操作。

修改原apk文件并重打包签名

在这一阶段,我们首先将apk解压,会看到如下图的6个文件和目录。其中,我们需要修改的只有2个文件,分别是classes.dex和AndroidManifest.xml文件,其他文件和文件加都不需要改动。
  首先,我们把解压后apk目录下原来的classes.dex文件替换成我们在上一步合成的新的classes.dex文件。然后,由于我们程序运行的时候,首先加载的其实是壳程序里的ProxyApplication类。所以,我们需要修改AndroidManifest.xml文件,指定application为ProxyApplication,这样才能正常找到识别ProxyApplication类并运行壳程序。
在这里插入图片描述

运行壳程序加载原dex文件

Dalvik虚拟机会加载我们经过修改的新的classes.dex文件,并最先运行ProxyApplication类。在这个类里面,有2个关键的方法:

attachBaseContext和onCreate方法

ProxyApplication先是运行attachBaseContext再运行onCreate方法。
  在attachBaseContext方法里,主要做两个工作:读取classes.dex文件末尾记录加密dex文件大小的数值,则加密dex文件在新classes.dex文件中的位置为:len(新classes.dex文件) – len(加密dex文件大小)。然后将加密的dex文件读取出来,解密并保存到资源目录下然后使用自定义的DexClassLoader加载解密后的原dex文件
  在onCreate方法中,主要做两个工作:通过反射修改ActivityThread类,并将Application指向原dex文件中的Application创建原Application对象,并调用原Application的onCreate方法启动原程序。
在这里插入图片描述

链接:https://www.zhihu.com/question/51585199/answer/3297302964
来源:知乎

http://www.lryc.cn/news/518059.html

相关文章:

  • Docker 使用Dockerfile创建镜像
  • 【Python运维】利用Python实现高效的持续集成与部署(CI/CD)流程
  • 成功!QT 5.15.2编译mysql驱动
  • 安卓NDK视觉开发——手机拍照文档边缘检测实现方法与库封装
  • 第二届 Sui 游戏峰会将于 3 月 18 日在旧金山举行
  • 自动驾驶相关知识学习笔记
  • uniapp - 基于uniapp+vue3实现自定义增强版table表格组件体验「兼容H5+小程序+App端」
  • 新时期下k8s 网络插件calico 安装
  • 【SQL】COUNT()函数 用法详解
  • 【HTML+CSS+JS+VUE】web前端教程-6-图片路径详解
  • C++中面向对象的三大特性是什么?
  • Centos 修改 yum 源为阿里云
  • Qt之Cannot create children for a parent that is in a different thread问题分析
  • 均值滤波从图像复原角度的解释
  • Tableau数据可视化与仪表盘搭建-数据连接
  • VsCode对Arduino的开发配置
  • 2024版idea 插件无法加载
  • VLMs之Agent之CogAgent:CogAgent的简介、安装和使用方法、案例应用之详细攻略
  • Unity3D仿星露谷物语开发19之库存栏丢弃及交互道具
  • Kafka优势剖析-消费者组、并行消费
  • Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台
  • Maven 详细配置:Maven settings 配置文件的详细说明
  • 【文本分类】bert二分类
  • 单例模式-如何保证全局唯一性?
  • 设计模式学习笔记——结构型模式
  • WEB攻防-通用漏洞_文件上传_黑白盒审计流程
  • RabbitMQ基本介绍及简单上手
  • 服务器证书不受信任是什么问题?
  • spring mvc源码学习笔记之十
  • Ubuntu 下载安装 elasticsearch7.17.9