静态分析、动态调试与重打包:去除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就可以实现一键回编译和签名。

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

相关推荐
CYRUS_STUDIO43 分钟前
使用 AndroidNativeEmu 调用 JNI 函数
android·逆向·汇编语言
梦否1 小时前
【Android】类加载器&热修复-随记
android
徒步青云1 小时前
Java内存模型
android
今阳1 小时前
鸿蒙开发笔记-6-装饰器之@Require装饰器,@Reusable装饰器
android·app·harmonyos
坚定信念,勇往无前3 小时前
Spring Boot 如何保证接口安全
spring boot·后端·安全
数造科技4 小时前
紧随“可信数据空间”政策风潮,数造科技正式加入开放数据空间联盟
大数据·人工智能·科技·安全·敏捷开发
winfredzhang4 小时前
Python实战:Excel中文转拼音工具开发教程
python·安全·excel·汉字·pinyin·缩写
网安加云课堂5 小时前
课程分享 | 安全系统建设的挑战与解决方案
网络·安全·web安全
源码宝5 小时前
医院安全(不良)事件上报系统源码,基于Laravel8开发,依托其优雅的语法与强大的扩展能力
安全·不良事件上报·医院不良事件管理
海域云赵从友5 小时前
助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全
人工智能·安全