90%的安卓应用安全都依赖Java加密,而逆向分析的核心就是破解这些加密!本文将全面解析常见加密算法实现与安卓开发环境搭建,助你掌握逆向工程核心技能!
目录
一、Java加密算法全解析(附Python实现)
1.1 隐藏字节处理(反编译常见)
// Java实现
String v4 = new String(new byte[]{-26, -83, -90, -26, -78, -101});
// Python等效实现
byte_list = [-26, -83, -90, -26, -78, -101]
bs = bytearray()
for item in byte_list:
if item < 0: item += 256 # Java有符号转Python无符号
bs.append(item)
print(bs.decode('utf-8')) # 输出:吕伟强
关键点:Java字节范围(-128~127)与Python(0~255)的转换逻辑
1.2 UUID设备标识生成
// Java实现
String uid = UUID.randomUUID().toString(); // 29cd5f50-4b4c-457b-9a59-33a12e3edd10
// Python实现
import uuid
uid = str(uuid.uuid4())
逆向分析要点:
-
动态UUID:每次请求变化,可直接伪造
-
固定UUID:常存储在本地文件(xml),清除应用数据会重置
1.3 安全随机值生成
// Java实现(80位随机数)
BigInteger v4 = new BigInteger(80, new SecureRandom());
String res = v4.toString(16);
// Python等效
import random
res = ''.join(f"{b:02x}" for b in random.randbytes(10))
1.4 时间戳应用场景
类型 | Java实现 | Python实现 | 典型用途 |
---|---|---|---|
秒级时间戳 | System.currentTimeMillis()/1000 | int(time.time()) | 请求签名时效验证 |
毫秒级时间戳 | System.currentTimeMillis() | int(time.time()*1000) | 性能监控、日志记录 |
1.5 十六进制字符串处理
// Java字节转十六进制
StringBuilder sb = new StringBuilder();
for(byte b : nameBytes) {
int val = b & 0xFF;
if(val<16) sb.append("0");
sb.append(Integer.toHexString(val));
}
// Python单行实现
hex_str = ''.join(f'{b:02x}' for b in b'吕伟强')
1.6 MD5加密(90%应用使用)
// Java实现
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(salt.getBytes()); // 加盐处理
byte[] digest = md.digest(data.getBytes());
// Python等效
import hashlib
m = hashlib.md5(salt.encode())
m.update(data.encode())
print(m.hexdigest()) # 32位小写哈希
逆向特征:
-
32位十六进制字符串
-
常出现在sign/token参数
-
使用MessageDigest.getInstance("MD5")
1.7 SHA-256加密(更安全)
# Python实现
import hashlib
print(hashlib.sha256(data.encode()).hexdigest()) # 64位哈希
1.8 AES加密(请求体加密)
// Java实现(CBC模式)
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(data.getBytes());
# Python实现(需pycryptodome库)
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
ct_bytes = cipher.encrypt(pad(data.encode(), 16))
1.9 GZIP压缩(数据传输优化)
// Java压缩实现
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(data.getBytes());
gzip.close();
byte[] compressed = out.toByteArray();
# Python解压实现
import gzip
decompressed = gzip.decompress(compressed_data).decode()
1.10 Base64编码(二进制转文本)
// Java实现
String encoded = Base64.getEncoder().encodeToString(data.getBytes());
byte[] decoded = Base64.getDecoder().decode(encoded);
# Python单行实现
import base64
encoded = base64.b64encode(b'data').decode()
decoded = base64.b64decode(encoded)
二、安卓开发环境搭建指南
2.1 环境配置三件套
-
JDK:Java开发工具包(推荐JDK11+)
-
Android SDK:包含开发库和工具
-
Android Studio:官方IDE(下载地址)
2.2 关键路径配置
# Windows环境变量示例
ANDROID_HOME = C:\Users\YourName\AppData\Local\Android\Sdk
PATH添加:
%ANDROID_HOME%\tools
%ANDROID_HOME%\platform-tools
2.3 真机调试四步法
-
开启开发者模式:设置→关于手机→连续点击版本号7次
-
启用USB调试:开发者选项→USB调试
-
连接电脑授权:首次连接需允许计算机调试
-
验证连接:
adb devices
# 输出示例:PKT0220320004379 device
2.4 常见问题解决方案
问题类型 | 表现 | 解决方法 |
---|---|---|
设备未授权 | unauthorized | 重新插拔USB并确认授权 |
模拟器报错 | VT-x not supported | BIOS启用虚拟化或使用真机 |
SDK下载慢 | 卡在组件下载 | 配置国内镜像源 |
三、逆向工程实战技巧
3.1 加密定位四步法
-
抓包分析:定位加密参数(如sign、token)
-
反编译APK:使用Jadx/GDA查看Java代码
-
搜索特征:
// 关键搜索词
MessageDigest.getInstance
Cipher.getInstance
Base64.getEncoder
- 动态调试:使用Frida/Xposed hook加密方法
3.2 设备注册参数生成流程
四、逆向工程师必备工具集
工具类型 | 推荐工具 | 用途 |
---|---|---|
反编译 | Jadx/GDA/JEB | APK逆向分析 |
动态调试 | Frida/Xposed/ADB | 运行时Hook |
网络分析 | Charles/HttpCanary | 抓包分析 |
汇编分析 | IDA Pro/Ghidra | SO文件逆向 |
环境管理 | Android Studio/Genymotion | 开发调试环境 |
逆向心法:掌握Java加密只是起点,真正的逆向工程师需要:
理解加密算法数学原理
熟悉安卓系统运行机制
掌握动态调试技巧
具备密码学基础知识
建议从抖音、B站等开放API应用开始实战训练!