APK自我保护 - DEX/APK/证书校验

Android应用安全加固实战:Dex加密、SO库保护与签名校验全解析 在移动应用开发领域,代码安全与防护是保障知识产权和用户数据安全的核心议题。其基本原理在于通过混淆、加密和完整性验证等技术手段,提升应用对抗逆向工程和恶意篡改的能力。从技术价值看,一套有效的安全方案能显著增加攻击成本,保护核心业务逻辑与算法,尤其对金融、游戏等高价值应用至关重要。典型的应用场景包括防止APK反编译、抵御动态调试以及阻止重打包等。本文聚焦于Android平台,深入探讨了实现全栈防护的三大关键技术:Dex加密通过对字节码进行加密与动态加载,有效对抗静态分析;SO库保护结合代码混淆与反调试,守护Na 阅读详情

转载自: http://gnaixx.cc/2016/04/19/android-protect-dex_apk_cert_check/

0x00 DEX校验

classes.dex 是 Android 虚拟机的可执行文件,我们所写的 java 代码其实都在这里面,所有很多对应用程序的篡改都是针对 classes.dex 文件的。
可以找一个 APK 解压就可以看到 classes.dex 文件。APK 其实就是一个压缩包,通过将后缀名改为 zip 就可以直接解压,或者用 unzip 命令。

编写代码

代码比较简单,这里是通过建计算好的 crc 保存在 string.xml 文件里,当然我们事先可以随便拿一个值代替,等开发完成后替换掉。
校验代码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
      
/**
* 校验Dex CRC值
*/
private void verifyDex(){
//获取String.xml中的value
Long dexCrc = Long.parseLong( this.getString(R.string.crc_value));
String apkPath = this.getPackageCodePath();
try {
ZipFile zipFile = new ZipFile(apkPath);
ZipEntry dexEntry = zipFile.getEntry( "classes.dex");
//计算classes.dex的 crc
long dexEntryCrc = dexEntry.getCrc();
Log.d( "DEX", dexEntryCrc + "");
//对比
if(dexCrc == dexEntryCrc){
Log.d( "DEX", "dex hasn't been modified");
} else{
Log.d( "DEX", "dex has been modified");
}
} catch (IOException e) {
e.printStackTrace();
}
}

计算 CRC 值

这一步必须在应用开发完成的时候去计算,如果改动了代码就必须重新计算。

利用 unzip 解压

解压命令:

unzip -d output app-debug.apk  

output 文件夹:

      
1
2
3
4
5
6
7
8
9
      
total 2200
drwxr-xr-x 8 xiangqing staff 272B 4 20 22: 18 .
drwxr-xr-x 6 xiangqing staff 204B 4 20 22: 18 ..
-rw-r--r-- 1 xiangqing staff 3.1K 9 15 2015 AndroidManifest.xml
drwxr-xr-x 7 xiangqing staff 238B 4 20 22: 18 META-INF
-rw-r--r-- 1 xiangqing staff 1.1M 9 15 2015 classes.dex
drwxr-xr-x 3 xiangqing staff 102B 4 20 22: 18 org
drwxr-xr-x 10 xiangqing staff 340B 4 20 22: 18 res
-rw-r--r-- 1 xiangqing staff 4.4K 9 15 2015 resources.arsc
利用 crc32 命令获取 crc 值

mac系统自带 crc32 命令:

crc32 classes.dex

这里生成的 crc 值是16进制数我们可以转换成十进制。

保存到 string.xml 文件

因为 string.xml 文件是资源文件不会影响到 classes.dex 所以修改是没有关系的。

0x01 APK校验

与 DEX 校验不同 APK 检验必须把把计算好的 Hash 值放在网络服务端,因为对 APK 的任何改动都会影响到最后的 Hash 值。
校验代码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
      
/**
* 校验APK MD5值
*/
private void verifyApk(){
//获取data/app/****/base.apk 路径
String apkPath = getPackageResourcePath();
Log.d( "APK", apkPath);
MessageDigest msgDigest;
try {
//获取apk并计算MD5值
msgDigest = MessageDigest.getInstance( "MD5");
byte[] bytes = new byte[ 4096];
int count;
FileInputStream fis;
fis = new FileInputStream( new File(apkPath));
while((count = fis.read(bytes)) > 0){
msgDigest.update(bytes, 0, count);
}
//计算出MD5值
BigInteger bInt = new BigInteger( 1, msgDigest.digest());
String md5 = bInt.toString( 16);
fis.close();
Log.d( "APK", md5);
/**
* 获取服务端的 MD5值进行对比
*/
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

计算 MD5 值

这一步必须在应用开发完成并且打包 release 版本的时候进行计算。
mac 系统为例:

md5 release.apk

0x02 证书校验

每个APK都会经过开发者独有的证书进行签名,如果破解者对APK进行二次打包一般会用自己的签名证书打包。这时候我们就可以通过校验签名证书的MD5值进行校验。
校验代码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
      
/**
* 获取签名证书
*/
public void verifySignature() {
String packageName = this.getPackageName();
PackageManager pm = this.getPackageManager();
PackageInfo pi;
String md5 = "";
try {
pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
Signature[] s = pi.signatures;
//计算出MD5值
MessageDigest msgDigest = MessageDigest.getInstance( "MD5");
msgDigest.reset();
msgDigest.update(s[ 0].toByteArray());
BigInteger bInt = new BigInteger( 1, msgDigest.digest());
md5 = bInt.toString( 16);
} catch (Exception e) {
e.printStackTrace();
}
Log.d( "Sign", md5);
/**
* 获取服务端的 签名证书对比
*/
}

获取签名证书 MD5

在release前我们可以获取证书的MD5值具体操作为:
解压apk
unzip -d output release.apk
解压后文件为

      
1
2
3
4
5
6
7
      
ll
total 5224
-rw-r--r-- 1 xiangqing staff 2.0K 6 5 11:42 AndroidManifest.xml
drwxr-xr-x 5 xiangqing staff 170B 6 5 11:56 META-INF
-rw-r--r-- 1 xiangqing staff 2.4M 6 5 11:42 classes.dex
drwxr-xr-x 22 xiangqing staff 748B 6 5 11:56 res
-rw-r--r-- 1 xiangqing staff 173K 6 5 11:28 resources.arsc

其中文件夹META-INF中的CERT.RSA文件就是签名文件,通过keytool工具就可以看到其中的MD5 等属性

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      
→ keytool -printcert -file CERT.RSA
所有者: CN=Android Debug, O=Android, C=US
发布者: CN=Android Debug, O=Android, C=US
序列号: 44bff7c9
有效期开始日期: Wed Feb 18 21:01:26 CST 2015, 截止日期: Fri Feb 10 21:01:26 CST 2045
证书指纹:
MD5: 05:F1:5D:AF:1D:EA:56:A8:1B:96:F9:37:06:04:FA:A1
SHA1: 4E:13:A8:8F:89:B1:92:89:10:9D:24:F4:9A:B5:E2:C1:22:CD:84:B4
SHA256: BA:4E:CF:72:93:F3:AA:1B:A5:31:6E:67:6D:AE:E7:A6:84:41:BC:7C:B3:29:7B:45:56:48:36:DF:CE:58:30:2B
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 25 CF E3 1E 4F 04 22 BA AA D8 41 6F BC 07 2D 5D %...O."...Ao..-]
0010: CB EE E3 84 ....
]
]

0x03总结

当然上述的保护方式容易被暴力破解, 完整性检查最终还是通过返回 true/false 来控制 后续代码逻辑的走向,如果攻击者直接修改代码逻辑,完整性检查始终返回 true,那这种方 法就无效了,所以类似文件完整性校验需要配合一些其他方法,或者有其他更为巧妙的方式 实现?

跨平台应用开发进阶(五十二):安全合规之Android APP完整性校验机制探究_uniapp apk文件完整性检测 签名是摘要与非对称密钥加密相相结合的产物,摘要就像内容的一个指纹信息,一旦内容被篡改,摘要就会改变,签名是摘要的加密结果,摘要改变,签名也会失效。Android APK签名也是这个道理,如果APK签名跟内容对应不起来,Android系统就认为APK内容被篡改了,从而拒绝安装,以保证系统的安全性。应用程序的作者使用自己的私钥签名APK文件,并将签名与公钥一起发布到APK中,这个过程称之为签名。当应用程序被安装时,用发布的公钥去解析签名,并与文件的hash进行比对,这个过程叫验签。 阅读详情

相关推荐

xiaoyo_release_2020_11_14_13-20_v2.7.7_201104_jiagu_signed_aligned.apk

xiaoyo_release_2020_11_14_13-20_v2.7.7_201104_jiagu_signed_aligned.apk

android代码获取当前apk md5,代码获取Android应用签名的MD5值

网上方法很多,但是网上很多代码不是到获取Signature就终止了,就是获取的MD5和实际值不一样。反编译了腾讯的一个工具apk,修改了下代码,获取的MD5值和实际应用值一样,可以直接用了。1.命令行获取keystore的签名值,和之后代码获取的值对比,看是否一样。keytool -list -v -keystore keystore.keystore2.根据包名获取签名Signature[],这...

weixin_39709979的博客 1061

从示波器波形看懂死区:手把手教你调ST MCU的PWM,避免三相桥直通炸管

本文详细解析了如何通过示波器波形判断PWM死区时间,并手把手教你调整STM32高级定时器寄存器,避免三相逆变桥直通炸管。文章涵盖死区时间的本质与风险、STM32配置详解、示波器调试技巧及FOC系统中的特殊考量,帮助工程师优化电机驱动性能与安全性。

weixin_30315723的博客 733

android技巧03:对APK进行重签名

1. 生成Android APK包签名证书 1). 在doc中切换到jdk的bin目录 cd C:\Program Files\Java\jdk1.6.0_18\bin 2). 运行下面的命令 keytool –genkey –alias android123.keystore –keyalg RSA –validity 20000 –keystore android123.k...

dowhathowtodo 256

从零到一:AIGC+Unity3D打造动态天空盒的实战指南

本文详细介绍了如何利用AIGC技术结合Unity3D打造动态天空盒的实战指南。通过AIGC生成360全景图,再集成到Unity3D中,实现高效、多样化的天空盒效果。文章涵盖了从AIGC全景图生成、工作流搭建到Unity场景集成的完整流程,并提供了代码示例和优化建议,帮助开发者快速掌握这一技术。

weixin_29021291的博客 603

机器视觉--线扫相机触发:从原理到选型,构建高效成像方案

本文深入解析线扫相机触发技术,从硬件编码器触发到软件触发方案,提供详细的性能对比和选型指南。通过实际案例展示如何构建高效成像方案,特别适合机器视觉领域需要精准控制的应用场景,如工业检测和自动化生产线。

weixin_42531886的博客 415

ApkProtect 技术文档

ApkProtect 技术文档 1. 安装指南 1.1 环境准备 在开始安装之前,请确保您的开发环境满足以下要求: 安装了Java开发工具包(JDK),版本建议为1.8或更高。 安装了Android开发工具包(Android SDK),版本建议为API 28或更高。 安装了Android Studio,用于项目管理和构建。 安装了Python 3.x,用于运行ElfParse项目中的脚本。 1...

gitblog_01271的博客 925

刚入职,软件测试岗,有点迷茫不知道下一步怎么提升自己

软件测试前景和发展都是不错,已经入了软件测试这行业就坚挺下去

大白的博客 2217

apk完整性校验-防反编译

apk完整性校验、文件校验、防反编译

GB1183710114的博客 2608

Cadence SpectreRF仿真避坑指南:PSS和Pnoise设置详解(附实战案例)

本文详细解析了Cadence SpectreRF中PSS(周期稳态分析)和Pnoise(周期噪声分析)的关键设置技巧,帮助模拟IC设计工程师避开常见仿真陷阱。通过实战案例分享,涵盖引擎选择、Beat Frequency计算、噪声类型配置等核心参数优化策略,提升仿真精度与效率。特别针对开关电容电路和振荡器等复杂场景提供专业解决方案。

weixin_42613501的博客 602

SIwave:在 SIwave 中释放计算频率扫描的强大功能

AEDT 的电路工具允许注入正确的电压和电流。要使用电路工具,SIwave 必须首先使用 PI 求解器求解结构的 S 参数。

jkh920184196的博客 1476

【APK安全】APK签名校验安全测试指南

检查是否使用SHA-256及以上算法(如SHA-384、SHA-512)

水滴石穿 1280

VMware Workstation Pro 17 最新破解版安装教程(附永久激活密钥)

本文详细介绍了VMware Workstation Pro 17专业版的安装与配置指南,包括系统要求检查、官方版本安装流程、高级配置优化及常见问题排查。通过合规使用官方版本,开发者可以充分利用其强大的虚拟化能力,提升多平台开发与测试效率。

weixin_29327977的博客 3552

APK校验码校验规则

获取签名证书keystore的SHA1值和完整性校验获取的classes.dex的SHA-1哈希值字符串进行拼接,使用MD5加密参数传入后台做比对,根据返回结果是否进行下一步登录操作 1.签名证书文件校验码 获取签名证书的SHA1值   2.完整性校验 对签名文件中classes.dex哈希值的校验         Android工程代码经编译打包生成apk包后,开发者需要对其

平哥的专栏 3022

【毕设护航】从0构建YOLOv8犬类识别系统,120种犬类精准检测+可视化界面全流程指南

本文介绍了一个基于YOLOv8的120种犬类目标检测与可视化系统毕业设计项目。该项目使用Stanford Dogs数据集,将图像分类任务转化为目标检测任务。主要内容包括:数据预处理(XML标注转换为YOLO格式)、YOLOv8模型训练与测试(包含训练脚本编写和推理实现),以及基于Tkinter的图形界面开发。该项目技术链条完整,涵盖检测、分割等多任务支持,适合作为计算机视觉方向的毕业设计选题,兼具技术深度和展示效果。

LXY_LOVE36的博客 96

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用Dobby框架动态Hook实现Android APK证书校验绕过

在Android应用安全与逆向工程领域,Hook技术是一种核心的动态代码注入手段,它允许开发者在程序运行时拦截并修改函数执行流程,从而实现行为监控、逻辑修改或安全测试。其原理是通过修改目标函数在内存中的指令,将执行流重定向到自定义代码。这项技术的核心价值在于能够在不修改原始安装包的情况下,对应用进行实时、精准的干预,极大地提升了安全分析、漏洞挖掘和兼容性修复的效率。在移动安全、自动化测试和软件调试等场景中,Hook技术应用广泛。本文聚焦于利用轻量级Hook框架Dobby,针对Android APK中常见的证

weixin_30765577的博客 348

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

反编译验证器APK:拆解签名校验逻辑与安全边界

在Android应用安全体系中,APK签名校验是验证应用完整性与可信度的基础机制,而验证器类应用正是这一机制的执行者。理解APK内部结构、DEX字节码、v1/v2/v3签名方案等核心概念,是进行安全分析的前提。反编译并非攻击者专属技能,而是开发者评估第三方验证器可靠性的有效手段:通过静态分析,可以将黑盒的校验逻辑转为白盒,看清签名获取方式、指纹比较位置以及失败分支,从而判断其能否被绕过。这一技术广泛适用于应用安全自查、渠道包兼容性分析、SDK信任评估及上架审核场景。本文以模拟签名验证应用为例,演示从环境准备

weixin_34214500的博客 421

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android APK代码保护实战:从混淆到加固的完整方案

在移动应用开发中,代码安全是保障应用核心逻辑和商业利益的重要防线。Android应用以APK格式分发,其内部的DEX字节码文件容易被反编译工具还原为可读性高的Java代码,导致核心算法、API密钥等敏感信息泄露。代码混淆技术通过重命名类、方法和字段,使反编译后的代码难以理解,这是最基础的防护手段。ProGuard和R8作为Android开发中的标配混淆工具,通过压缩、优化和混淆三个步骤,有效增加了逆向工程的分析成本。在工程实践中,混淆规则的精确配置至关重要,需要保留Android组件、JNI方法、反射调用类

weixin_34168880的博客 402

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

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

低代码开发,数据,中间件,企业架构原创技术分享 3211

Android中apk文件的结构解析

APK文件实际是一个zip压缩包,可以通过解压缩工具解开。 下面是用解压缩工具解开的APK包的结构:

zengrun1992的专栏 1万+

ApkToolPlus核心功能解析:dex2jar、smali2dex等8大实用工具全攻略

ApkToolPlus是一款功能强大的APK逆向分析工具,集成了dex2jar、smali2dex等8大实用工具,为Android开发者和逆向工程师提供一站式解决方案。无论是APK反编译、代码转换还是签名加固,都能通过直观的图形界面轻松完成,极大提升逆向分析效率。 ## 一、APK反编译与回编译:逆向分析第一步 ✨ APK反编译是逆向分析的基础,ApkToolPlus提供了直观的操作界面,只需

gitblog_00012的博客 532

Android APK 加固--开发者角度(零)

Android APK 加固–开发者角度(零) 1.APK加固介绍 Android应用程序使用的开发语言是Java语言,由于蚕蛹的是这种解释性语言,所以代码可以被反编译。如果没有经过混淆或是加密,会非常让人容易读懂,换言之就是容易被破解。为了能够使我们的apk更好的保护起来,Android的开发以及安全人员对APK进行了一系列的加固措施。对APK加固从开发者的角度来看,以下是常用的手段和方式: 1...

weixin_44045581的博客 931

反编译Android验证器APK:定位签名校验与信任链路的实战方法

在Android应用安全分析中,反编译常被误解为破解手段,但真正核心在于还原验证器类APK的信任判断链路。所谓反编译,是通过解包工具将APK中的DEX字节码转换为可读的Java代码,进而剖析应用如何获取包名、签名证书、证书指纹、环境调试标志等输入,并据此决定是否放行请求。这种技术价值在于,开发者可以借此理解本地校验与服务端裁决的分工,识别仅靠包名或客户端签名比对带来的安全盲区。无论是排查SDK接入失败,还是对自有应用进行安全体检,基于jadx、apktool等工具的分析流程都能帮助工程师定位校验点、评估绕过

weixin_33858336的博客 287

手游反外挂实战:基于app_process的APK完整性校验方案与千款机型兼容性报告

本文深入探讨了手游反外挂实战中的APK完整性校验方案,基于app_process机制实现跨进程校验,确保游戏安全。通过上千款设备的实测数据,验证了该方案的高效性和兼容性,为开发者提供了可靠的技术路径。

weixin_29323365的博客 293

apk组成结构

Android的apk组成结构 APK 是 Android PacKage 的缩写,即 Android 安装包。将 APK 文件直接传到 Android 模拟器或 Android 手机中执行即可安装。 APK 文件其实是 zip 格式,但后缀名被修改为 apk ,在 windows 上可以通过 WinRar 等程序直接解压查看。 每个要安装到Android平台的应用都要被编...

酷狗直播-锦凡歆的博客 3596

安卓HTTPS证书校验原理与绕过技术详解

HTTPS作为互联网通信的基础安全协议,通过TLS/SSL实现数据加密和身份认证。其核心机制依赖证书链验证,包括检查CA签名、有效期和域名匹配等环节。在安卓开发中,系统默认会执行严格的证书校验流程,而高级安全实践如公钥固定(Pinning)能进一步防范中间人攻击。但随着安卓版本迭代,从7.0开始引入网络安全配置限制,开发者需要适配不同系统的证书处理差异。实际工程中常需处理代理调试、APK反编译修改和Frida动态Hook等证书绕过场景,特别是金融类APP常采用多层防御策略。理解这些证书校验机制对移动安全测试

weixin_30851867的博客 343
上一篇: Android中的ClassLoader与dex文件加密实现分析
下一篇: 手把手教你逆向分析 Android 程序
阿里安
博客等级 码龄13年 79粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值