找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 109|回复: 0

App加固的那些事

[复制链接]

2万

主题

128

回帖

10万

积分

管理员

积分
100376
发表于 2022-11-23 11:04:16 | 显示全部楼层 |阅读模式 IP:山东省 移动/全省通用

登录后更精彩...O(∩_∩)O...

您需要 登录 才可以下载或查看,没有账号?立即注册

×
App加固的那些事1、前言

Android开发者经常面临的一个问题就是防破解、 防二次打包。现现在,安全问题愈来愈重要,愈来愈多 的Android开发者也开始寻求安全的保护方案。请看一下下面的几张图片:android

1.1



1.2

2、什么要加壳?

a.应用安全是产品质量的一个重要方面。

b.加固为APP提供专业安全的保护,从源头保护APP的数据安全和开发者利益。

c.防止应用被逆向分析、反编译和二次打包等等。

d.防止植入各类病毒、木马等恶意代码及低俗广告的马甲包。

3、加壳做用和分类

从App的加固技术来看:主流分为dex加密和so加密,目前来看保护dex文件更为重要,应为dex反编译后的java代码可读性更强。服务器

4、Android Dex文件加壳原理4.1.APK文件结构

每一个文件及文件夹的做用以下表所示。app

4.png

4.2DEX文件格式

4.2.1什么是DEX文件?

他是Android系统的可执行文件,包含应用程序的所有操做指令以及运行时数据dom

因为dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,因此dex文件与标准的class文件在结构设计上有着本质的区别

当java程序编译成class后,还须要使用dx工具将全部的class文件整合到一个dex文件,目的是其中各个类可以共享数据,在必定程度上下降了冗余,同时也是文件结构更加经凑,实验代表,dex文件是传统jar文件大小的50%左右


4.2.2dex文件结构

Dex文件总体结构以下:




Dex文件总体结构说明:

5.png

下面是DEX文件目录:




这里面,有3个成员咱们须要特别关注,这在后面加固里会用到,它们分别是checksum、signature和fileSize。

checksum字段

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


signature字段


signature是SHA-1签名字段,占20bytes,做用跟checksum同样,也是作完整性校验。之因此有两个完整性校验字段,是因为先使用checksum字段校验能够先快速检查出错的dex文件,而后才使用第二个计算量更大的校验码进行计算检查。


fileSize字段


占4bytes,保存classes.dex文件总长度。


这3个字段当咱们修改dex文件的时候,这3个字段的值是须要更新的,不然在加载到Dalvik虚拟机的时候会报错。


为何说咱们只须要关注这三个字段呢?


由于咱们须要将一个文件(加密以后的源Apk)写入到Dex中,那么咱们确定须要修改文件校验码(checksum).由于他是检查文件是否有错误。那么signature也是同样,也是惟一识别文件的算法。还有就是须要修改dex文件的大小。


不过这里还须要一个操做,就是标注一下咱们加密的Apk的大小,由于咱们在脱壳的时候,须要知道Apk的大小,才能正确的获得Apk。那么这个值放到哪呢?这个值直接放到文件的末尾就能够了。


因此总结一下咱们须要作:修改Dex的三个文件头,将源Apk的大小追加到壳dex的末尾就能够了。

4.3APK打包流程



上图中涉及到的工具及其做用以下:

6.png

4.4加固原理



Dex文件总体加固原理以下:


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

l 源程序

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

l 壳程序

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

l 加密程序


加密程序主要是对原dex文件进行加密,加密算法能够是简单的异或操做、反转、rc四、des、rsa等加密算法。


该加固过程能够分为以下4个阶段:


(1)加密阶段


(2)合成新的dex文件


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


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


4.4.1 加密阶段


加密阶段主要是讲把原apk文件中提取出来的classes.dex文件经过加密程序进行加密。加密的时候若是使用des对称加密算法,则须要注意处理好密钥的问题。一样的,若是采用非对称加密,也一样存在公钥保存的问题。



4.4.2 合成新的dex文件

这一阶段主要是讲上一步生成的加密的dex文件和咱们的壳dex文件合并,将加密的dex文件追加在壳dex文件后面,并在文件末尾追加加密dex文件的大小数值



在壳程序里面,有个重要的类:ProxyApplication类,该类继承Application类,也是应用程序最早运行的类。因此,咱们就是在这个类里面,在原程序运行以前,进行一些解密dex文件和加载原dex文件的操做。

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

在这一阶段,咱们首先将apk解压,会看到以下图的6个文件和目录。其中,咱们须要修改的只有2个文件,分别是classes.dex和AndroidManifest.xml文件,其余文件和文件加都不须要改动。

首先,咱们把解压后apk目录下原来的classes.dex文件替换成咱们在0x02上一步合成的新的classes.dex文件。而后,因为咱们程序运行的时候,首先加载的实际上是壳程序里的ProxyApplication类。因此,咱们须要修改AndroidManifest.xml文件,指定application为ProxyApplication,这样才能正常找到识别ProxyApplication类并运行壳程序。



4.4.4运行壳程序加载原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方法启动原程序

5、加壳及脱壳代码实现5.一、加壳程序项目:



5.二、核心代码



6、常见加固平台

梆梆加固,爱加密,360加固,腾讯加固

市面上常见的加固工具加固以后,他会把你的dex,so 加密存在apk中,而后运行过程会先运行壳的代码,壳的代码再把原来的这个dex、so 解出来加载,不一样的厂商有本身的方案,略有差距,但目前多数都是这个思路.

7、App加固的利弊

正面:

1.保护本身核心代码算法,提升破解/盗版/二次打包的难度

2.缓解代码注入/动态调试/内存注入攻击

负面:

1.影响兼容性

2.影响程序运行效率.

3.部分流氓、病毒也会使用加壳技术来保护本身

4.部分应用市场会拒绝加壳后的应用上架

8、App安全将来展望



一款app的流水线,从开发到内测到平台到消费者再到破解者再到平台再到消费者,因此每个环节都不可轻视!!!

9、App安全总结
7.png
8.png
8.1.png


来自: https://blog.csdn.net/weixin_38576356/article/details/121989479


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|IOTsec-Zone|在线工具|CTF WiKi|CTF平台汇总|CTF show|ctfhub|棱角安全|rutracker|攻防世界|php手册|peiqi文库|CyberChef|猫捉鱼铃|手机版|小黑屋|cn-sec|分享屋 ( 鲁ICP备2021028754号 )

GMT+8, 2024-4-20 15:37

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表