http://blog.csdn.net/baiyuliang2013/article/details/40426681

很多开发者,不管是个人或是公司都不太注重自己开发的应用的安全性,即是 否会被不法分子篡改代码,插入恶意代码,发一些垃圾广告,甚至盗用用户信息。包括我在内,也并不太在意,直到前几天在市场上发布的一款应用被盗版并上传到 了某些应用市场才发现问题的严重性!期初我并不知道该市场上的应用是盗版的,还在沾沾自喜呢,并且下载了一个装在了手机里,后来发现手机通知栏莫名其妙的 出现许多垃圾广告,还有一些应用我并没有安装,但却出现在了我的手机上,我纳闷了,长按通知栏信息可以显示发布该通知的应用的信息,进去一看竟然来自我的 应用,妈呀!这是怎么回事,我并没有上广告啊!于是,我就将此安装包反编译了下,一看原包里竟然多出了一个包叫做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文件)的二次打包的更多相关文章

  1. cocos2d-x 编译 安卓(android)apk文件

    摘要: 一.下载Android环境 搭建Android环境需要用到Android SDK.NDK.Ant和JDK: 下载Android SDK  下载Android NDk  下载Android JD ...

  2. IIS配置安卓下载.apk文件

    前提:你的.apk文件所在路径正确,例如:www.grainnews.com.cn:8002/Attach/Images/201807/20180712091842127.apk 1.打开IIS 2. ...

  3. Android 自动编译、打包生成apk文件 4 - 多渠道批量打包

    相关文章列表: < Android 自动编译.打包生成apk文件 1 - 命令行方式> < Android 自动编译.打包生成apk文件 2 - 使用原生Ant方式 > < ...

  4. linux下安卓编译apk环境搭建

    ubuntu下linux安卓编译环境搭建. 配置好编译环境 (前提是已经安装了jdk,可以用java -verison 命令查看) 一.设置环境变量 用vi  ~/.bashrc  打开编译环境 JA ...

  5. 如何给apk文件签名

    1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...

  6. 使用Advanced Installer进行二次打包

    使用Advanced Installer进行二次打包 在上一篇使用InstallerShield打包VS程序中,我已经叙述过,为什么要进行二次打包的问题,在此我就不再赘述.本次长枪直入,说一说如何使用 ...

  7. HBuilder 云打包生成 .apk 文件所需的安卓证书如何获取以及文件打包前必须的设置

    在 HBuilder 云打包功能中,生在 .apk 文件虽然平台提供了免费的 安卓证书,但如果有其它需求,比如想发布,那么就需要自己去申请各种类型的证书了,这里介绍几个工具,方便在线生成证书并配置到打 ...

  8. 基于nginx实现二维码下载安装apk文件

    将apk文件置于nginx目录下 <!--进入nginx安装路径--> /usr/local/nginx <!--新建放apk的目录--> mkdir -p resources ...

  9. Mac 下安装安卓 apk 文件

    Mac 下安装安卓 apk 文件 在windows上有比较多的第三方软件可以使用,双击就可以将apk文件安装到手机上. 在Mac 上要实现这样还是挺难得,目前还没有像Windows那样的第三方软件可以 ...

随机推荐

  1. C#使用Word中的内置对话框实例

    本文实例讲述了C#使用Word中的内置对话框的方法,分享给大家供大家参考.具体实现方法如下: 使用 Microsoft Office Word 时,有时需要显示用户输入对话框.虽然可以创建自己的对话框 ...

  2. Mvc自定义分页控件

    MVC开发分页常常使用第三方控件,生成的分页HTML带有版权申明,虽然免费,但是总有的别扭.于是,某日,楼主闲来蛋疼,折腾了个自定义分页控件: 先来展示下效果图: 1>当分页不超过10页的时候, ...

  3. opencv+树莓PI的基于HOG特征的行人检测

    树莓PI远程控制摄像头请参考前文:http://www.cnblogs.com/yuliyang/p/3561209.html 参考:http://answers.opencv.org/questio ...

  4. nyoj 找球号三(除了一个数个数为基数,其他为偶数,编程之美上的)

    #include<iostream> #include<stdio.h> using namespace std; int main() { int len; while(ci ...

  5. Java笔记(二)……Hello world!

    编写源文件 将Java代码编写到扩展名为.java的文件中,此文件称为源文件. 1: class Hello 2: { 3: public static void main(String[] args ...

  6. 《HTML5与CSS3基础教程》笔记

    以下笔记摘要页码基于 人民邮电出版社 2013年1月第1版 英文书名:HMTL5 and CSS3 Visual Quickstart Guide (Seven Edition) 前言 P2: 渐进增 ...

  7. Timer和counter

    什么是Timer,什么是Counter 几乎每个嵌入式板都会有counter和timer,重要性比肩gpio.本质上来看timer和counter几乎是一样的东西,底层都是一个硬件counter,如果 ...

  8. C#调用VC dll输出参数

    最近做项目需要把以前Vc写的程序整合到VS2005来,用c#写的,以前VC的动态连接库写好了,重写比较麻烦,让C#调用VC dll就好了.但碰到了一个问题:VC中作为输出参数的char*类型的变量应该 ...

  9. [Windows Server] 在 Windows Server 2012 上安裝 .NET Framework 3.5 - 摘自网络

    官方: Applies To: Windows 8, Windows 8.1 For a Windows Server® 2012 core installation that is not conn ...

  10. NSDictionary或NSArray与JSON字符串相互转换

    在iOS 5 中,苹果引入了一个解析JSON串的NSJSONSerialization类.通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. 以前,我记得我用的是 ...