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记录器发现启动流程:
SplashAdActivity→MainActivity
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 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显示