Android逆向入门篇--java层静态分析
字数 1099 2025-08-22 18:37:22
Android逆向入门:Java层静态分析详解
一、工具准备
进行Android Java层静态分析需要以下工具:
- Apktool:反编译APK文件
- AndroidKiller:集成化逆向工具
- JEB/Jadx/GDA:Java反编译工具
- smali/baksmali:smali代码处理工具
二、基本逆向流程
-
反编译APK
java -jar apktool.jar d xxx.apk -o out -
定位关键代码
- 通过字符串搜索
- 通过Activity入口分析
- 使用注入+栈追踪技术
-
功能分析
- 分析关键类和方法
- 理解程序逻辑
-
smali修改
- 直接修改smali代码
- 添加/修改关键指令
-
重打包、签名、安装
- 修改完成后重新打包
- 签名并安装测试
三、实战案例:广告破解
1. 反编译目标APK
2. 定位广告相关代码
- 使用字符串搜索法查找"ad"相关字符串
- 使用注入工具批量注入日志打印:
python3 inject_log.py -r .\out\smali\com\youdo
3. 分析广告播放流程
- 观察日志,确定广告播放时调用的关键方法
- 最终定位到
parsead方法
4. 修改smali代码
在parsead方法返回处添加:
const/4 v0, 0x0
return-object v0
强制返回null,达到去广告效果
四、CTF CrackMe分析流程
1. 反编译目标APK
2. 定位关键代码
- 查看AndroidManifest.xml找到入口Activity:
<activity android:label="@h/a" android:name="ctf.bobbydylan.M"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
3. 分析入口Activity
- 查看
onCreate方法:public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.main); startService(new Intent(this, P.class)); ((Button) findViewById(R.id.button)).setOnClickListener(new a(this, (TextView) findViewById(R.id.et))); }
4. 分析按钮点击逻辑
- 找到
onClick方法:public void onClick(View view) { try { this.b.check(this.a.getText().toString()); new Builder(this.b).setMessage("正确").setNeutralButton("OK", null).create().show(); } catch (Exception e) { new Builder(this.b).setMessage("错误").setNeutralButton("OK", null).create().show(); } }
5. 关键check方法分析
public void check(String str) {
int i = 0;
// 条件1:输入字符串长度必须等于16
if (str.length() != 16) {
throw new RuntimeException();
}
String str2 = "";
try {
str2 = getKKey();
} catch (Exception e) {
str2 = getKey();
System.arraycopy(str2, 0, str, 5, 5);
}
int[] iArr = new int[16];
iArr[0] = 0;
iArr[12] = 14;
iArr[10] = 7;
iArr[14] = 15;
iArr[15] = 42;
try {
iArr[1] = 3;
iArr[5] = 5;
System.out.println();
} catch (Exception e2) {
iArr[5] = 37;
iArr[1] = 85;
}
iArr[6] = 15;
iArr[2] = 13;
iArr[3] = 19;
iArr[11] = 68;
iArr[4] = 85;
iArr[13] = 5;
iArr[9] = 7;
iArr[7] = 78;
iArr[8] = 22;
// 条件2:iArr数组&255必须和后面这串计算相等
while (i < str.length()) {
if ((iArr[i] & 255) != ((str.charAt(i) ^ str2.charAt(i % str2.length())) & 255)) {
throw new RuntimeException();
}
i++;
}
}
6. 解密算法实现
iArr = [0, 3, 13, 19, 85, 5, 15, 78, 22, 7, 7, 68, 14, 5, 15, 42]
chArr = ['b', 'o', 'b', 'd', 'y', 'l', 'a', 'n']
for i in range(len(iArr)):
number = 0
while True:
if iArr[i] == number ^ ord(chArr[i % len('bobdylan')]):
print(chr(number))
if i == len(iArr):
print("end")
exit(0)
break
number += 1
解密结果:blow,in the winD
五、病毒分析流程
-
初步检查
- 检查安装包内文件结构
- 重点关注res/raw、lib等目录
-
分析AndroidManifest.xml
- 查看注册的组件
- 重点关注Service和Receiver组件
-
从入口类开始分析
- 跟踪程序执行流程
- 分析关键行为
-
汇总分析结果
- 确定恶意行为
- 分析传播方式
六、关键技巧总结
-
当Java层代码无法给出正确答案时
- 阅读smali代码获取更准确的信息
- 注意方法名的Unicode混淆(如getKKey)
-
静态分析要点
- 从AndroidManifest.xml入手
- 跟踪程序执行流程
- 注意异常处理分支
-
逆向算法技巧
- 理清加密/验证逻辑
- 注意位运算和字符操作
- 实现逆向算法时考虑所有可能分支
七、参考资源
- Apktool官方文档
- smali/baksmali使用指南
- Jadx/GDA工具使用教程
- Android开发官方文档(理解正向开发有助于逆向分析)
通过以上方法和流程,可以系统地进行Android Java层的静态分析,无论是进行安全研究、漏洞挖掘还是CTF比赛,都能提供有效的技术支撑。