Android APK加固原理

article/2025/10/6 15:45:05

一、前言

Android作为开源框架,开放之余,所要面临的就是安全问题,世间之事,有正就有邪,有攻就有守,作为开发者虽然不需要进入专业安全领域,但还是需要掌握基本的安全常识和原理。

二、加壳

加壳最初用于windows平台可执行程序,后被Andriod平台采用用于apk加固,可阻止对apk的反编译反调试等。

基本原理就是在程序中植入一段代码,在运行的时候取得控制权进行额外程序操作,跟病毒执行原理类似。

App的加固技术可分为:dex加密和so加密,其中dex加密更为重要,因为dex可反编译为java可读代码。


三、DEX文件

apk解压后可以从目录中看到classes.dex文件,它是运行在daivilk虚拟机上的Android可执行文件,包含应用程序的全部操作指令以及运行时数据。java程序编译成class后,使用dx工具将所有class文件整合到dex文件中,使各个类可以共享数据,文件结构更加紧凑且减少冗余,是传统jar文件大小的50%左右。

Dex文件整体结构图:

从宏观上来说 dex 的文件结果很简单,实际上是由多个不同结构的数据体以首尾相接的方式拼接而成,如图:

 ​​​​​​其中Header 的存储内容,如图:

​​​​​​​

这里主要关注3个字段:checksum、signature和fileSize。

checksum:校验码字段,占4bytes,主要用来检查从该字段(不包含checksum字段,也就是从12bytes开始算起)开始到文件末尾,这段数据是否完整,也就是完整性校验。它使用alder32算法校验。

signature:SHA-1签名字段,占20bytes,作用跟checksum一样,也是做完整性校验。之所以有两个完整性校验字段,是由于先使用checksum字段校验可以先快速检查出错的dex文件,然后才使用第二个计算量更大的校验码进行计算检查。

fileSize:文件长度字段,占4bytes,保存classes.dex文件总长度。

当加密后的程序写入Dex,需要修改checksum和signature确保两次文件检查通过,以及修改dex文件的大小,否则Dalvik虚拟机加载会报错。另外,脱壳的时候,需要拿到apk的大小,将源apk的大小追加到壳dex的末尾就可以了。

四、加固原理

加固apk运行流程:


Dex文件整体加固原理:

 

在该过程中涉及到三个对象,分别如下:

源程序:加固的对象,主要修改原apk文件中的classes.dex和AndroidManifest.xml文件。

壳程序:用于解密dex(加密)文件,并加载解密后的原dex文件,然后正常启动原程序。

加密程序:对原dex文件进行加密,加密算法可选:异或操作、反转、rc4、des、rsa等。

加固过程可分4个阶段:

(1) 加密dex文件

(2)合成新的dex文件

(3)修改原apk文件打包

(4)运行壳程序加载原dex文件

4.1 加密dex文件

加密阶段主要是讲把原apk文件中提取出来的classes.dex文件通过加密程序进行加密。加密的时候如果使用des对称加密或者非对称加密算法,则需要注意处理好密钥保存的问题。


4.2 合成新的dex文件

合成阶段主要是将上一步生成的加密的dex文件追加在壳dex文件后面,两个dex进行合并,然后在文件末尾追加加密dex文件的大小数值。

壳程序里面ProxyApplication(继承自Application)类,是应用程序最先运行的类,在原程序运行之前,可以在在这个类里面进行解密dex文件和加载原dex文件的操作。

4.3 修改原apk文件打包

1.解压apk,准备修改2个文件:classes.dex和AndroidManifest.xml。

2.将classes.dex替换为上一步加密合成的classes.dex。

3.修改AndroidManifest.xml文件,指定application为ProxyApplication。

4.打包签名。


4.4运行壳程序加载原dex文件

​​​​​​​执行步骤:

Dalvik虚拟机加载新classes.dex文件->运行ProxyApplication类->执行attachBaseContext方法->执行onCreate方法。

attachBaseContext方法任务:

1.获取加密dex文件的位置:len(新classes.dex文件) – len(加密dex文件大小:classes.dex文件末尾记录),读取加密的dex文件,将其解密并保存到资源目录下。

2.使用自定义的DexClassLoader加载解密后的原dex文件。

onCreate方法任务:

1.通过反射修改ActivityThread类,将Application指向原dex文件中的Application。

2.创建原Application对象,调用原Application的onCreate方法启动原程序。

欢迎关注微信公众号:android-tech


http://chatgpt.dhexx.cn/article/29qQAfU0.shtml

相关文章

APK加固原理详解

一、前言 之前使用的360加固,挺好用的,从2021年底的时候限制每天每个账号仅上传2次apk(免费的,不知道VIP的是不是这样)。通过这个事情,感觉技术还是掌握在自己手里稳妥点,不用受制于人&#xf…

Android中的Apk的加固(加壳)原理解析和实现

本文转载自:Android中的Apk的加固(加壳)原理解析和实现 - roccheung - 博客园 一、前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理。现阶段。我们知道Android中的反编译工作越来越让人操作熟…

浅谈安卓apk加固原理和实现

转载本文需注明出处:微信公众号EAWorld,违者必究。 引言: 在安卓开发中,打包发布是开发的最后一个环节,apk是整个项目的源码和资源的结合体;对于懂点反编译原理的人可以轻松编译出apk的源码资源&#xff0c…

安卓逆向笔记--apk加固

安卓逆向笔记–apk加固 资料来源: 浅谈安卓apk加固原理和实现 Android中的Apk的加固(加壳)原理解析和实现 前两个太老了所以具体代码借鉴下面的 Android Apk加壳技术实战详解 一、apk常见加固方法 (1)代码层级加密–代码混淆 代码混淆是一种常见的加密方式。本质是把工程中原…

imx6ull uboot移植

以下内容来自:正点原子Linux驱动文档 一、简介 uboot移植主要是根据原厂的uboot移植:芯片厂商通常会做一块自己的评估板并发布BSP,当我们需要定制自己的开发板时可以根据自己的需求(硬件上的不同),对原厂…

全志V3S嵌入式驱动开发(uboot移植)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 安装了ubuntu操作系统,有了开发板,下面就可以进行我们的开发工作了。第一步,我们要面临的问题就是uboot移植。一般来说,嵌入式的基础环境就是uboot、linux和rootfs。uboot完成一…

2021-09-14 uboot移植开发

引言:最近要改动uboot,实现像微软PC上,u盘一键刷机或手机上安全模式下刷机的操作 专门去好好研究了点uboot的启动过程;以下为总结: 嵌入式系统 微软-PC ——…

iTOP4412 uboot移植教程

好多刚开始学习uboot移植的同学总是觉得uboot好难,但是再难的问题如果把它一步步拆开,一个个解决,问题也就将迎刃而解。做uboot移植,我们首先就得了解uboot的编译流程,这里以在iTOP4412精英版2G内存的板子上移植u-boot…

<Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分)

<Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分) 第一部分链接:系统移植-之-uboot移植第一部分 第一部分主要讲解了,uboot移植过程中使用的一些工具的安装,以及测试nxp远程uboot&a…

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植

前言 本文是介绍在uboot中如何移植DM9000的驱动,并不深入去讲解DM9000芯片的操作时序和内部寄存器,想要读懂驱动代码要仔细阅读DM9000芯片的数据手册。移植的基础是手里有DM9000芯片可以用的驱动代码,只需要根据开发板中DM9000芯片的接线方式…

嵌入式linux UBoot移植篇

如何在U-boot添加自己的linux板卡并启动呢? uboot 的移植并不是说我们完完全全的从零开始将 uboot 移植到我们现在所使用的开发板或者开发平台上。这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的, 半导体厂商负责将 uboot 移…

Uboot移植流程

linux-Bootloader(Uboot)移植流程 前言 最近在做ZigBee的温室大棚项目,将自己学习的过程和经验分享给大家。本文基于linux3.4.39内核版本,s5p6818开发板实现。 1、uboot启动简介 uboot启动的过程比较复杂,这里就只…

IMX6ULL Uboot 移植

使用的开发板:正点原子ALPHA V2.2 Uboot简介 在学习STM32的过程中使用过IAP在线升级就会知道,有引导程序APP程序,即bootloader程序APP。在学习嵌入式Linux的时候也一样,这个引导程序就是Uboot. uboot移植主要是根据原厂的uboot移…

二、uboot移植

二、uboot移植 版本作者时间备注V 1.0bug设计工程师2021/11/10创建文件软件网盘链接0交叉编译工具链接:https://pan.baidu.com/s/1yFO2NDMet9_b1E1q1rMwEA提取码:42kluboot源码同上linux源码同上文件系统工具同上tftp工具同上2.1 简单说明 uboot制作结束会生成 u-boot-etc44…

linux-uboot 移植四 uboot的移植

概述 前边的章节中介绍到如果要移植uboot的话,最好的参考就是由官方提供的demo。 1、移植 1.1 添加board对应的板级文件夹 uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。 NXP 的 I.MX 系列芯片的所有板级文件…

[uboot 移植]uboot 移植过程

文章目录 uboot 移植1 修改顶层 Makefile2 在 board 文件夹下添加开发板对应的板级文件2.1 imximage_lpddr2.cfg 和 imximage.cfg 文件2.2 plugin.S 文件2.3 Kconfig 文件2.4 igkboard.c 文件2.5 MAINTAINERS 文件2.6 Makefile 文件 3 添加 igkboard_defconfig 配置文件4 添加开…

UBoot 移植

1 NXP官方开发板uboot编译测试 1 查找 NXP 官方的开发板默认配置文件 因为我们的开发板是参考 NXP 官方的 I.MX6ULL EVK 开发板做的硬件,因此我们在移植 uboot 的时候就可以以 NXP 官方的 I.MX6ULL EVK 开发板为蓝本。 在 NXP 官方 I.MX6UL/6ULL 默认配置文件中找…

大话uboot 移植

结合作者多年的移植经验,尽量简单的为大家描述一个uboot 的移植过程。希望通过描述,给初入移植行道的你带来美好的希望。接下来,我们通过以下几个方面来描述。 1. arm soc 的启动方式 在描述soc 前,我们先看下一个简单的arm soc:…

uboot移植步骤

Uboot移植具体步骤(本例子为Samsung origen板) 第一步:准备源码 网上下载现成的uboot开源代码:https://ftp.denx.de/pub/u-boot/ 在该网站中选择与板子兼容的uboot源文件(公司中一般咨询硬件工程师) 在Linux系统下解压 tar xf 压缩包名 第二步:修改源码 1.抄板:将和你板子兼容…

(二)uboot移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>

目录 一、前言 二、F1C200s上电启动顺序 三、前期准备 四、新建用户 五、交叉编译环境配置 六、uboot简介 七、uboot移植 🍏 uboot下载 🍏 uboot默认配置 🍏 uboot图形界面配置 🍏 uboot编译 🍏 烧录bin…