logo资料库

华中科技大学网安学院逆向工程实验报告.pdf

第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
资料共15页,剩余部分请下载后查看
课 程 实 验 报 告 课程名称: 逆向工程分析技术 专业班级: 学 号: 姓 名: 指导教师: 报告日期: 网络空间安全学院 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
分享到:
收藏