APK逆向分析-以某GIF工具为例
字数 1383 2025-08-18 11:36:48

APK逆向分析教学 - 以某GIF工具为例

1. 准备工作

1.1 工具准备

  • MT管理器:用于查看APK信息
  • Activity记录器:用于追踪Activity跳转
  • Frida:用于动态Hook和调试
  • NP管理器:用于修改smali代码
  • JD-GUI/JADX:用于反编译查看Java/Kotlin代码

1.2 目标应用分析

  • 目标应用:某GIF处理工具
  • 主要功能:MP4转GIF、文字GIF等功能
  • 限制:部分功能需要VIP会员

2. 去除启动广告

2.1 定位启动Activity

  • 使用Activity记录器发现启动流程:
    SplashAdActivityMainActivity

2.2 分析广告逻辑

  • 发现使用了TopOn广告SDK:
    private final com.ad.topon.kt.g topOnSplash = new com.ad.topon.kt.g();

2.3 关键判断逻辑

  • 广告显示条件判断:
    if (repository.p() && repository.j())
    

2.4 使用Frida Hook验证

  • Frida脚本示例:
    function carhook3(){
      let Repository = Java.use("com.didikee.gifparser.data.Repository");
      Repository["p"].implementation = function () {
        console.log('p is called');
        let ret = this.p();
        console.log('p ret value is ' + ret);
        return ret;
      };
    };
    
    function carhook4(){
      let Repository = Java.use("com.didikee.gifparser.data.Repository");
      Repository["j"].implementation = function () {
        console.log('j is called');
        let ret = this.j();
        console.log('j ret value is ' + ret);
        return ret;
      };
    };
    

2.5 修改smali代码绕过广告

  • 修改p()j()的判断条件:
    • if-eqz改为if-nez
    • 或在判断前直接赋值0x1

3. 绕过会员限制

3.1 定位VIP判断逻辑

  • 关键Activity:com.didikee.gifparser.ui.animation.LottieAnimationActivity2
  • 关键函数:repository.j()用于VIP判断

3.2 分析VIP判断函数

public final boolean j() {
    Object obj;
    o.c value = f24491d.getValue();
    if (value == null) {
        try {
            obj = com.blankj.utilcode.util.f0.h(g().decodeString(a.f24521c), o.c.class);
        } catch (Exception unused) {
            obj = null;
        }
        value = (o.c) obj;
        if (value == null) {
            return false;
        }
    }
    if (f0.g(value.l0(), Boolean.TRUE)) {
        return true;
    }
    Long b02 = value.b0();
    if (b02 == null) {
        return false;
    }
    if (System.currentTimeMillis() > b02.longValue() * 1000) {
        return false;
    }
    return true;
}

3.3 修改VIP判断

  • 修改所有return falsereturn true
  • 或修改判断条件使函数始终返回true

4. 去除应用内广告

4.1 定位广告Activity

  • 目标Activity:com.didikee.gifparser.ui.ResultShareActivity

4.2 分析广告初始化

  • 关键函数:initAds()
  • 调用位置:startFlow()函数中

4.3 修改广告初始化

  • initAds()函数开头添加return-void
  • 这将跳过所有广告初始化代码

5. 总结与关键点

5.1 关键修改点

  1. 启动广告

    • 修改SplashAdActivity中的repository.p()repository.j()判断
  2. VIP功能

    • 修改repository.j()函数使其始终返回true
  3. 应用内广告

    • initAds()函数开头添加return-void

5.2 技术要点

  • Activity跳转分析:使用Activity记录器追踪应用流程
  • Frida动态Hook:验证函数返回值和行为
  • smali代码修改
    • 条件判断修改(if-eqzif-nez)
    • 函数返回值修改
    • 添加提前返回指令(return-void)

5.3 注意事项

  1. 修改后需要重新签名APK才能安装
  2. 对于Kotlin编写的应用,smali代码可能较为复杂
  3. 不同版本的应用可能需要调整修改点
  4. 本文内容仅供学习研究使用

5.4 扩展思路

  • 可以进一步分析网络请求,找到VIP验证的API并模拟响应
  • 对于更复杂的广告SDK,可能需要分析广告加载和显示的全部流程
  • 可以尝试修改资源文件来改变UI显示
APK逆向分析教学 - 以某GIF工具为例 1. 准备工作 1.1 工具准备 MT管理器:用于查看APK信息 Activity记录器:用于追踪Activity跳转 Frida:用于动态Hook和调试 NP管理器:用于修改smali代码 JD-GUI/JADX:用于反编译查看Java/Kotlin代码 1.2 目标应用分析 目标应用:某GIF处理工具 主要功能:MP4转GIF、文字GIF等功能 限制:部分功能需要VIP会员 2. 去除启动广告 2.1 定位启动Activity 使用Activity记录器发现启动流程: SplashAdActivity → MainActivity 2.2 分析广告逻辑 发现使用了TopOn广告SDK: private final com.ad.topon.kt.g topOnSplash = new com.ad.topon.kt.g(); 2.3 关键判断逻辑 广告显示条件判断: 2.4 使用Frida Hook验证 Frida脚本示例: 2.5 修改smali代码绕过广告 修改 p() 和 j() 的判断条件: 将 if-eqz 改为 if-nez 或在判断前直接赋值 0x1 3. 绕过会员限制 3.1 定位VIP判断逻辑 关键Activity: com.didikee.gifparser.ui.animation.LottieAnimationActivity2 关键函数: repository.j() 用于VIP判断 3.2 分析VIP判断函数 3.3 修改VIP判断 修改所有 return false 为 return true 或修改判断条件使函数始终返回 true 4. 去除应用内广告 4.1 定位广告Activity 目标Activity: com.didikee.gifparser.ui.ResultShareActivity 4.2 分析广告初始化 关键函数: initAds() 调用位置: startFlow() 函数中 4.3 修改广告初始化 在 initAds() 函数开头添加 return-void 这将跳过所有广告初始化代码 5. 总结与关键点 5.1 关键修改点 启动广告 : 修改 SplashAdActivity 中的 repository.p() 和 repository.j() 判断 VIP功能 : 修改 repository.j() 函数使其始终返回 true 应用内广告 : 在 initAds() 函数开头添加 return-void 5.2 技术要点 Activity跳转分析 :使用Activity记录器追踪应用流程 Frida动态Hook :验证函数返回值和行为 smali代码修改 : 条件判断修改( if-eqz → if-nez ) 函数返回值修改 添加提前返回指令( return-void ) 5.3 注意事项 修改后需要重新签名APK才能安装 对于Kotlin编写的应用,smali代码可能较为复杂 不同版本的应用可能需要调整修改点 本文内容仅供学习研究使用 5.4 扩展思路 可以进一步分析网络请求,找到VIP验证的API并模拟响应 对于更复杂的广告SDK,可能需要分析广告加载和显示的全部流程 可以尝试修改资源文件来改变UI显示