静态分析、动态调试与重打包:去除Android APK烦人广告

最近,一直使用的某款APP,广告越来越多,更令人发指的是,广告弹框最后都变成无法关闭的形式,不使用会员压根没法正常使用。应用市场广大用户的评论说出了我们的心声。

虽说充会员可以免广告,这点小钱,那都不是事,但是不吃馒头争口气,对于吃香难看的APP,作为消费者,我们要敢于维权。说不定通过维权手段,还能看些免费小视频。不开玩笑了,本次,就以这个APP为例,简要说明一下如何对Android APK进行逆向和重打包,实现免广告操作。免责声明:本文不针对任何特定APP,请各位看官遵纪守法,只做学习交流使用。

方案一

工作时,曾遇到一个视频APP。对于某个收费视频,会调用一个函数,用来判断用户是否是会员。基于此,我们只要找到判断会员的函数,修改返回值,即可实现付费绕过。

对于此APP,我一开始的想法也是如此。我们搜索vip,果然找到一个疑似函数isVipUser,大喜过望,显然这个函数就是用来判断用户是否是会员。

紧接着,将APK反编译,即拖到APK Easy Tool,修改对应的smali代码。将190改为0x1,那么isVipUser返回值永远为True。

再将修改后的文件,拖到APK Easy Tool的Compile上,即可实现回编译,并且会自动签名,实现一个透明的重打包。当我们把重打包后的APK,放到模拟器上安装以后,广告居然还在?这就有点尴尬了,显然这个APP的逻辑可能远比之前的判断要复杂,可能使用了其他判断方法。

方案二

退而求其次,只能找到每个广告组件弹窗的逻辑了。还没说完,广告就来了。单从如下卡片中,我们很难直接定位到相应代码。因为该卡片的内容是实时生成的,没有明显关键字。

点击x,喜出望外,"享免广告特权",这就是我们想要的关键词。

在Jadx中,通过搜索关键字,直接可以定位到字符串,根据字符串,查找相应的代码逻辑,这是一种最常见的逆向方法,可以帮助我们快速定位复杂逻辑。这里需要注意的是,字符串搜索时,一定要选择资源

紧接着通过层层引用,定位到相应的代码。因为原APK广告组件实在太多,通过逐个patch,再回编译(回编译很耗时),效率过于低下。因此要使用frida,进行调试。

最方便的就是,hook相应函数,不反回任何值,看看广告还在不在。这样就能知道这个函数到底是不是某个特定的广告组件。利用此方法,我们最终找到了6处不同的广告组件的代码,通过patch,还原一个干净整洁的APP,感谢以下工具!

在动态调试的过程中,可能一个函数会被多处调用,这时打印调用栈就显得十分重要。还好个人有个记笔记的习惯,虽然很久没有逆向Android代码,但是通过以前的文章,Frida-Android 进阶,我们实现了对此APP的快速动态调试。

js 复制代码
Java.perform(function(){
    send("print stack...");
    var Animal = Java.use("com.example.testfrida.Animal");

    Animal.getAge.implementation = function (){
    	//打印调用栈
        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
        //throw Java.use("java.lang.Exception").$new();
        return this.getAge();
    };
});

其实还有方案三,一些工具可能集成了通用屏蔽广告的功能,例如"MT管理器",号称能够自动去除一些APK的广告,大家感兴趣可以试一下。

杂谈

很久没有写博客了,其实逆向这个APP还是花了些时间,只是写得比较简单,是因为非虫大大的经典Android安全入门书籍《Android软件安全与逆向分析》早就提到相关内容。如果你觉得出版于2013年的此书比较老,那么后来的《Android软件安全权威指南》也是一个不错的阅读选择。

其实对于安全从业者来说,更多的是在各种博客、论坛学到的安全知识,在有一定安全背景之后,再阅读相关经典书籍,可能会有更好的结果。就拿我写的这篇博客为例,可能相关书籍上会告诉你,用apktool等工具进行反汇编,jd-gui反编译smali代码。这确实是常见的Android静态分析思路。

但是实际上,至少对于我而言,很多过程都省略了,我们要把最少的时间花在通用逆向上,而把更多精力放在代码逻辑上。例如,Jadx可以直接反编译APK,而且具有强大的交叉引用功能;如果你想对APK进行Patch,APK Easy Tool可以实现一键反编译,得到一个文件夹,直接修改文件夹里面的文件,比如smali、资源文件。然后将这个文件拖回APK Easy Tool就可以实现一键回编译和签名。

如果你是一个初出茅庐的小白,则需要多多实践和总结。光看理论是远远不够的,实际操作中会遇到各种问题和挑战,这些都是纸上谈兵无法涉及的。只有通过实际测试,才能真正理解和掌握安全测试的各种技术细节。安全这条路虽然不易,但只要脚踏实地,勤于动手实践,相信一定能够通过自己的努力,在这个领域有所突破和进步。

相关推荐
叶落阁主1 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
雨白1 天前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk1 天前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING1 天前
RN容器启动优化实践
android·react native
恋猫de小郭1 天前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker2 天前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴2 天前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭2 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab2 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe2 天前
Now in Android 架构模式全面分析
android·android jetpack