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

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

相关推荐
hikktn2 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
23zhgjx-NanKon4 小时前
华为eNSP:QinQ
网络·安全·华为
23zhgjx-NanKon4 小时前
华为eNSP:mux-vlan
网络·安全·华为
昔我往昔4 小时前
阿里云文本内容安全处理
安全·阿里云·云计算
帅得不敢出门5 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
棱角~~7 小时前
盘点和嗨格式一样好用的10款数据恢复!!
数据库·经验分享·安全·电脑·学习方法
我又来搬代码了7 小时前
【Android】使用productFlavors构建多个变体
android
NETFARMER运营坛8 小时前
如何优化 B2B 转化率?这些步骤你不可不知
大数据·安全·阿里云·ai·ai写作
安徽京准8 小时前
京准时钟:无人机卫星信号安全防护隔离装置
安全·无人机·信号安全防护装置·卫星安全隔离装置·北斗授时安全隔离·北斗对时防护隔离装置
mingzhi618 小时前
渗透测试-快速获取目标中存在的漏洞(小白版)
安全·web安全·面试·职场和发展