关于安卓应用(APK文件)的二次打包
非常多开发人员,无论是个人或是公司都不太注重自己开发的应用的安全性,即是否会被不法分子篡改代码,插入恶意代码,发一些垃圾广告,甚至盗用用户信息。包含我在内。也并不太在意。直到前几天在市场上公布的一款应用被盗版并上传到了某些应用市场才发现问题的严重性。期初我并不知道该市场上的应用是盗版的,还在沾沾自喜呢,而且下载了一个装在了手机里,后来发现手机通知栏莫名其妙的出现很多垃圾广告,另一些应用我并没有安装,但却出如今了我的手机上,我纳闷了,长按通知栏信息能够显示公布该通知的应用的信息,进去一看居然来自我的应用,妈呀!
这是怎么回事。我并没有上广告啊。于是,我就将此安装包反编译了下,一看原包里居然多出了一个包叫做y6,而且清单文件里也加了很多代码包含Service,Receiver之类的。最郁闷的是包名居然被改了,最后我把植入的广告代码统统删除掉,包名也改回来后,又一次打包。居然又成功了。看到这里。大家有何感想??您在公布自己的应用时时候会考虑到这些??
啰嗦了这么多,那么此时我们看看那些坏银是怎样进行二次打包的!反编译大家应该都不陌生。apktool就能够了。可是怎样改动或者插入代码。最后再回编成apk呢?(注:对于此过程已经倒背如流的“大神”能够离开了)我们在用apktool反编译apk后生成的目录中包括了一个smali目录,如图:
这个即是该应用的精华所在。全部代码都在这里了,打开之后看到的全是后缀为.smali的文件。再打开某一文件看看其代码。好像没怎么见过。对了,它便是Dalvik虚拟机指令语言。改动代码也是在这里改动的,大家能够百度下。普及一下知识,好了。以下将举一个简单的样例,包含利用apktool反编译——改动代码——回编译并签名——安装改动后的应用以測试等一系列过程:
1.利用利用apktool反编译apk:
首先我写了一个简单的样例,用Eclipse生成了一个測试apk(签名后的),主代码及执行结果如图:
MainActivity.java
接下来開始反编译:
将測试文件放进apktool目录中,并改名为123.apk,执行APKTool.cmd:
选择1反编译后。生成一目录名字为APK。打开目录及可看到如第一张图片所显示的目录了,打开smali目录并找到MainActivity.smali文件打开。找到例如以下代码:
这些代码事实上和我们的源码是一一相应的,源码中有的。在这里都能够找到。仅仅是smali用的是汇编语言,所以。想进行复杂的改动还是要去学学smali语法了。
2.改动代码:
由于此例比較简单,所以不会进行太复制的改动,我们把"test my application"改动为"哈哈。你的应用被破解啦"測试一下就可以。
3.回编译:
改动完成后保存,回到apktool根文件夹,打开刚才的cmd,选择2或3開始运行回编译。运行成功后记得按一下回车进行签名,又一次签名的应用再安装的话是会报签名不一致错误的。所以须要把原来的卸载掉再又一次安装。运行如图:
到此,二次打包成功。我在写这篇文章之前,也对几个游戏进行了反编并又一次打包。里面所付费的什么金币了钻石了再找到对应代码后都是能够改动的,只是有时在使用时改动后的金币或钻石时可能会联网检測,并带有签名參数,又一次打包的签名肯定和原签名是不一致的,这个事实上要在再深入研究也是能够破解的!
看到这里,大家又有何感想呢?当我们公布一款应用时。一定要检查下我们的应用是否存在被二次打包的风险,能够用以上方法測试下,有问题的就要想办法加固了(注:仅仅进行代码混淆是不能防止被二次打包的)。不然被一些不法分子利用后。损失的不到是自己。公司也还包含用户的利益了。对自身的名誉也会造成一定的伤害!
回过头来,我们推測一下开头提到的我的应用被安插恶意广告是怎么实现的?个人认为,就是利用上面这样的方法反编译后。把已经写好并生成的smali文件放进了我的包里,然后在清单文件里进行一些配置,并改动了包名,最后又一次打包(得出这个结果是有根据的,我对二次打包的apk又进行了一次反编译,并将其安插的代码及配置代码所有删除。包名改回,第三次打包,安装后仍然没有不论什么问题,并且也去除了广告。除了签名不同外),最后再提一点就是二次打包是。清单文件里的版本号。版本号号,包名都是能够改动的,这个大家一定要注意了。
最后附上apktool工具下载地址:http://download.csdn.net/detail/baiyuliang2013/8077501
说明:若使用时出现故障。能够尝试将当中的aapt.exe换成自己Eclipse中的aapt.exe。