最近下了一款小众APP,功能实用,界面简洁,然而用了几分钟页面下方竟然弹出了小窗口广告!并且每分钟自动更新!!耗电、耗流量、占屏幕空间、闪烁吸引眼球、不小心还会误触,这种广告方式是本强迫症患者无法容忍的,相信大部分人也会反感,因此常用的那些APP中也几乎没有看到过。从学习的角度出发,本人尝试对这款应用进行破解,“屏蔽”其中的广告功能。
1. 解压
下载apk文件,修改后缀名为.zip,解压到文件夹中
apk解压文件夹.png
其中:
assets文件夹 -- 放原生资源文件
lib文件夹 -- 放引用库文件
META-INF文件夹 -- 放清单文件
res文件夹 -- 放资源文件
AndroidManifest.xml -- 安卓清单
resources.arsc -- 主资源文件
以上这些主要跟资源有关,如果需要提取一些图片或声音资源可以直接在文件夹中找,剩下的classes.dex文件就比较重要了,它是安卓中classes类的打包格式,代码都在这里面。
2.查看jar
查看代码需要将dex文件转换为jar文件,这里推荐一款软件“安卓逆向助手”
安卓逆向助手.png
里面集成了apktool、autosign、dex2jar、jd-gui等常用工具,十分方便。
这里选择其中的dex2jar功能,源文件浏览选中解压出来的classes.dex文件,点击操作按钮,即可自动生成classes_dex2jar.jar文件。
再选jd打开jar功能,就可以调用jd-gui查看jar文件了。
jd-gui查看代码.png
jd-gui中可以看到,大部分代码经过了混淆,而且经过编译器优化后的代码跟源码会有所不同,不过逻辑还是一样的,认真看还是能大致看懂。
3.寻找广告页面和代码
要找到广告页面的Activity,将手机连接电脑,在Android Studio或Eclipse的logcat中会输出日志,在日志搜索栏输入“ActivityManager”,这样启动广告页面时,log中就能看到Acitivty的全名,然后在jd-gui中找到这个Activity。
分析代码:
广告主要使用了adStream和adwo这两个view,它们分别在adInit_av() 和 adInit_aw()这两个方法中初始化和添加到页面。如果修改这两个方法,不让它们初始化和添加,那么就达到目的了,同时其他用到这两个view的地方要进行判断,防止引起程序崩溃,幸运的是原代码中已经对它们进行了空判断。
3.解包修改smali汇编代码
找到广告页面和方法后需要修改,直接改jar文件肯定是不行的,需要对原apk文件进行解包,解包后生成的smali文件可以直接用文本编辑器修改。解包使用apktool,将apk文件(如果刚才改成了.zip,就改回.apk)复制到apktool文件夹下,输入命令(xx.apk换成实际名字):
apktool d xx.apk
apktool解包.png
注意:apktool工具版本太老可能会解包失败,这时需要下载一个较新版本的
很快在相同文件夹下就能看到解包后的文件夹,与apk同名
解包.png
进入解包生成的目录中,看到文件夹基本与直接解压类似,不同的是生成了smali文件夹,生成的汇编代码都在里面,目录结构跟包名相同
解包后目录.png
很容易找到需要修改的页面代码XXXActivity.smali,用文本编辑器可以直接打开修改。
smali代码.png
搜索需要修改的方法adInit_av(),如下是方法的定义:
.method private adInit_av()V
.locals 2 .prologue
... return-void.end method
中间省略号部分是方法的主体,根据上面对代码的分析,删除方法主体就可以。然后找到另外一个方法adInit_aw(),同样删除方法主体,保存文件。
4.重新打包签名
修改好之后使用apktool重新打包。
输入命令(-o代表输出文件名):
apktool b xx -o xx_new.apk
重新打包.png
很快重新生成apk文件,不过这个apk文件不能直接安装的,因为没有签名。使用安卓逆向助手进行签名。
重新签名.png
因为使用的是非官方签名,与官方的APP是不兼容的,安装前先需要卸载官方的,安装后也是不能正常升级的。
运行一下,一切正常,广告没有了,世界清静了~~~
5.总结
现在有的apk使用了较好的加密机制,可能解压后classes.dex代码文件被封装进.so文件中,需要另行破解,难度会比较大,这里不作讨论;
据说jar文件里的class文件也能使用工具修改,修改后重新打包成jar,这样可能不用重新签名。本人没有试过,有兴趣的读者可以尝试看看是否有效;
smali是Dalvik虚拟机指令语言,语法跟Java不同。在短时间不熟悉的情况下,修改常量、删除方法内容等是比较简单的操作。如果需要其他操作,比如添加类、修改语句等,可以自己建立一个安卓工程,将相同逻辑的Java语句写进去,生成apk解包查看生成的smali语句,再参照这些生成语句修改;
破解成功主要因为这个应用功能较简单,逻辑比较清晰,没进行彻底的混淆,破解其他应用可能难度完全不同。