课 程 实 验 报 告
课程名称: 逆向工程分析技术
专业班级:
学 号:
姓 名:
指导教师:
报告日期:
网络空间安全学院
1
1. 实验准备
1.1. Java 开发环境配置
1.从 Java 官网上下载 JDK 并安装;
2.配置环境变量,在高级系统设置->系统变量中添加 JAVA_HOME 为 JDK 实际路
径,添加 CLASSPATH 为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
在 Path 中添加%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
3.验证安装,在任意目录下打开 cmd 控制台,输入 java、java -version、javac
命令均有响应则安装完成。
图 1.1 Java 环境配置
1.2. Android SDK 环境配置
在国内 Android 镜像网站下载安装即可。
1.3. Android Killer、Jeb
Android Killer、Jeb 等 Android 逆向软件,解压即用。
2
2. 实验内容
分析 Android APK:
[MAPS_AND_NAVIGATION][2067][100000][2.91]BlackVue.apk
3. 实验目标
(1)分析给定的 Android APK 中在加密函数调用中出现的常值字符串、数
组是否为密钥,如为密钥,确认被加密的数据内容是用以本地数据还是网络通信
数据,即加密结果是存储在本地还是通过网络传输到服务器。
(2)分析给定 APK 中是否调用了随机数生成函数。如果有,生成的结果是
否与密钥生成过程相关,如有,记录随机数种子的产生方式,并跟踪基于该随机
数生成的密钥是否用以网络传输数据的加密。
4. 分析方法和过程
4.1. 定位加密函数代码
用 Android KIller 打开要分析的 apk 文件,待软件分析文件结束后,可见
该程序的基本信息:
图 4.1 Android 程序基本信息
由图 4.1 可知,该 APP 名称是 BlackVue,包名是 comb.blackvuec,入口类为
comb.blackvuec.LoadingActivity,版本为 2.91,开发 SDK 版本为 17
2.在工程管理器中可以看到该 apk 的目录结构,可见这个 APP 的 Java 代码被封
装到 2 个 smali 文件中,在 lib 目录下引用了 C++封装的.so 文件
3
图 4.2 目录结构
AES 加密算法的发现
在工程搜索中搜索“AES”,搜索到大量名称含“AES”的函数调用,但有些
函数只是名字中含有“aes”3 个字母,并非是加解密函数,查询“RSA”、
“Cipher”等,结果类似。
图 4.3 查询结果
通过函数名能基本确认是否是加解密函数,在 jeb 中打开该文件,可以查看反
汇编之后的 Java 代码。
由于生成 apk 文件时开发者混淆了代码,导致很多类名,变量名都是无意
义的字符串,给理解代码带来了很大的难度。
第一处:
在 com.baidu.location.f.b.a 类中,有底层的 AES 加解密函数
4
图 4.4 底层 AES 加解密函数
这两个函数规定了加解密方式为 AES,加密模式选择 CBC 模式,密文填充选
择 PKSC5Padding 方式,初始向量,明密文,密钥均由外部传入。
通过查找对这 2 个函数的交叉引用,可以定位到它们的调用函数:在
com.baidu.location.f.a.b 类的 a 函数中发现了上文 AES 加密函数的调用
v3.write(com.baidu.location.f.b.b.a(com.baidu.location.f.b.a.AESEncry
pt_loc("30212102dicudiab", "30212102dicudiab",
v0.toString().getBytes()), "utf-8"));
这是一句写入密文的代码,AES 加密密钥和初始向量直接硬编码入代码中,可
见初始向量由"30212102dicudiab"生成,密钥是"30212102dicudiab"。
在 com.baidu.location.f.a.b 类的 a 函数中,发现了上文 AES 解密函数的
调用 String[] v1_2 = new
String(com.baidu.location.f.b.a.AESDecrypt_Loc("30212102dicudiab",
"30212102dicudiab",
com.baidu.location.f.b.b.a(v3.toString().getBytes()))).split("=");
这是一句提取明文的代码,AES 解密密钥和初始向量直接硬编码入代码中,可
见初始向量由"30212102dicudiab"生成,密钥是"30212102dicudiab"。
通过 Jeb 的交叉引用查询,最终得到了该函数的调用流程图:
5
图 4.5 CFG 图
6
从 CFG 可以看出,这个 AES 的底层加解密函数为文件加解密提供服务,加
密结果保存在本地。程序获取设备重要权限及设备重要参数时,会向文件系统
写入加密的日志信息。对日志进行加密以防止被用作不良用途,便于开发人员
对程序运行产生的错误进行排查分析。
第二处:
在 comb.android.etc. AESCrypto 类中,也发现了和 AES 加密有关的函数。
该类中包含 AES 加密的 public String encrypt(String arg2)函数,该函数返
回一个密文的 Hash 值,Hash 的明文是其重载函数加密的密文,即另一个重名
的 encrypt 函数。函数的原型为 private byte[] encrypt(byte[] arg3,
byte[] arg4),传入的第一个参数用于生成初始向量,第二个参数是字节形式
的明文。在上面的调用中,该 encrypt 函数接受 2 个参数,第一个参数为字符
串"kiwijuice"的 SHA1 值的字节数组,第二个参数为待加密的明文的字节数
组。
这个加密函数的密钥以静态变量的形式存于该类中
图 4.6 AES 底层加密的实现
通过 Jeb 的交叉引用查询,最终获得了该函数的调用流程图:
图 4.7 AES 密钥
7
图 4.8 CFG 图
8