Android逆向入门篇--java层静态分析
字数 1099 2025-08-22 18:37:22

Android逆向入门:Java层静态分析详解

一、工具准备

进行Android Java层静态分析需要以下工具:

  • Apktool:反编译APK文件
  • AndroidKiller:集成化逆向工具
  • JEB/Jadx/GDA:Java反编译工具
  • smali/baksmali:smali代码处理工具

二、基本逆向流程

  1. 反编译APK

    java -jar apktool.jar d xxx.apk -o out
    
  2. 定位关键代码

    • 通过字符串搜索
    • 通过Activity入口分析
    • 使用注入+栈追踪技术
  3. 功能分析

    • 分析关键类和方法
    • 理解程序逻辑
  4. smali修改

    • 直接修改smali代码
    • 添加/修改关键指令
  5. 重打包、签名、安装

    • 修改完成后重新打包
    • 签名并安装测试

三、实战案例:广告破解

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

五、病毒分析流程

  1. 初步检查

    • 检查安装包内文件结构
    • 重点关注res/raw、lib等目录
  2. 分析AndroidManifest.xml

    • 查看注册的组件
    • 重点关注Service和Receiver组件
  3. 从入口类开始分析

    • 跟踪程序执行流程
    • 分析关键行为
  4. 汇总分析结果

    • 确定恶意行为
    • 分析传播方式

六、关键技巧总结

  1. 当Java层代码无法给出正确答案时

    • 阅读smali代码获取更准确的信息
    • 注意方法名的Unicode混淆(如getKKey)
  2. 静态分析要点

    • 从AndroidManifest.xml入手
    • 跟踪程序执行流程
    • 注意异常处理分支
  3. 逆向算法技巧

    • 理清加密/验证逻辑
    • 注意位运算和字符操作
    • 实现逆向算法时考虑所有可能分支

七、参考资源

  • Apktool官方文档
  • smali/baksmali使用指南
  • Jadx/GDA工具使用教程
  • Android开发官方文档(理解正向开发有助于逆向分析)

通过以上方法和流程,可以系统地进行Android Java层的静态分析,无论是进行安全研究、漏洞挖掘还是CTF比赛,都能提供有效的技术支撑。

Android逆向入门:Java层静态分析详解 一、工具准备 进行Android Java层静态分析需要以下工具: Apktool :反编译APK文件 AndroidKiller :集成化逆向工具 JEB/Jadx/GDA :Java反编译工具 smali/baksmali :smali代码处理工具 二、基本逆向流程 反编译APK 定位关键代码 通过字符串搜索 通过Activity入口分析 使用注入+栈追踪技术 功能分析 分析关键类和方法 理解程序逻辑 smali修改 直接修改smali代码 添加/修改关键指令 重打包、签名、安装 修改完成后重新打包 签名并安装测试 三、实战案例:广告破解 1. 反编译目标APK 2. 定位广告相关代码 使用字符串搜索法查找"ad"相关字符串 使用注入工具批量注入日志打印: 3. 分析广告播放流程 观察日志,确定广告播放时调用的关键方法 最终定位到 parsead 方法 4. 修改smali代码 在 parsead 方法返回处添加: 强制返回null,达到去广告效果 四、CTF CrackMe分析流程 1. 反编译目标APK 2. 定位关键代码 查看AndroidManifest.xml找到入口Activity: 3. 分析入口Activity 查看 onCreate 方法: 4. 分析按钮点击逻辑 找到 onClick 方法: 5. 关键check方法分析 6. 解密算法实现 解密结果 : 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比赛,都能提供有效的技术支撑。