Android 静态分析实验记录——软件安全(二)
实验目的
- 理解安卓静态分析**概念
- 掌握安卓移动设备基础知识如:smali语法、逻辑判断
- 掌握安卓移动设备工具APKIDE的使用
实验环境
- 模拟器:夜神模拟器(OR 蓝叠模拟器)
- 使用工具:APKIDE
原理讲解
-
通过Dalvik的字节码我们不能直接看到原来的逻辑代码,这时需要借助如Apktool或dex2jar+jd-gui工具来帮助查看。最终我们修改APK需要操作的文件是.smali文件,而不是对导出来的Java文件进行处理。
-
安卓静态分析**的大致思路大致如下:
1、安装apk后进行一定程度的观察和使用;
2、使用工具反编译apk,然后找到之前使用的一些关键词,查看关键词的位置,然后找到对应的smali文件;
3、对smali文件进行观察,要点就是找逻辑判断语句及跳转,分析代码后手动修改逻辑,从而控制我们想要执行的语句。如果看不到smali可以使用工具中的java还原查看原生的java代码;
4、完成后保存,再编译,运行**后的app应用,查看是否**成功。
实验步骤
- 在Android模拟器安装好APK并尝试输入任意值点注册后,会提示:无效用户名或***。
- 将crackme02.apk文件导入到反编译APK工具中,这里使用的工具是APK改之理3.5.0.0。
- 使用工具反编译apk,然后找到之前使用的一些关键词,查看关键词的位置,尝试搜索 “无效”字段:
- 成功找到一条记录。点击该纪录查看,可以发现一个string标签,标签名unsuccessed:
- 搜索unsuccessed字段,成功找到相关记录:
- 可以看到第一条记录中的public标签,标签中有一个id:0x7f05000c。我们再尝试搜索此ID:
- 可以看到第二行中的语句 :
python const v1, 0x7f05000c
- 这时候我们就离成功很近了! 同样地,点击进入,发现前面有一个判断语句:
if-nez v0, :cond_0
- 查看Smali逻辑判断语法 :
if-nez vA, :cond_**
如果vA不等于0则跳转到:cond_** - 我们在本文件内查找一下cond_0,发现了这样一句,其中:Iget-object的含义是调用对象。
- 综上,这两段合起来的含义是如果v0不等于0,则跳转到调用v0;而我们之前注册失败的情况下调用的一直是v1,即
const v1,0x7f05000c
;因而我们需要跳过这一句。 - 可以令判断语句修改为:
if-eqz v0, :cond_0
,即如果vA等于0则跳转到:cond_0。 - 保存后,编译apk,重新导入新生成的apk到模拟器中,完成后保存,再编译,运行**后的app应用,**成功,显示程序已注册:
实验总结
静态分析大致步骤:
- 1、反编译;
- 2、代码逻辑分析;
- 3、代码逻辑绕过修改
- 4、重新编译打包。
对抗静态分析:
- 1、使用代码混淆技术,google提供了ProGuard代码混淆工具,开发人员可以对自己代码进行混淆;
- 2、加壳,目前市面上常见的如爱加密,360的壳。