首页 > 代码库 > 关于安卓应用(APK文件)的二次打包

关于安卓应用(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。


关于安卓应用(APK文件)的二次打包