Androd安全——反编译技术完全解析
0.前言
单纯从技术角度上来讲,掌握反编译功能确实是一项非常有用的技能。另外既然别人可以反编译程序,我们当然有理由应该对程序进行一定的保护,因此代码混淆也是我们必须要掌握的一项技术。看完此篇如果对代码混淆也感兴趣,可以参考Android安全——混淆技术完全解析。
1.反编译
Android的反编译主要又分为两个部分,一个是对代码反编译,一个是对资源反编译。
1.1 代码反编译
要想将APK文件中的代码反编译出来,我们需要用到以下两款工具:
(a)dex2jar:这个工具用于将dex文件转换成jar文件。
下载地址:http://sourceforge.net/projects/dex2jar/files/
(b)jd-gui:这个工具用于将jar文件转换成Java代码。
下载地址:http://jd.benow.ca/
(1)我们首先将APK文件进行解压,可以先将文件后缀名改成zip,然后用解压软件打开。解压之后你会发现里面有一个classes.dex文件。
(2)classes.dex就是存放所有Java代码的地方,我们将它拷贝到dex2jar解压后的目录下,并在cmd中也进入到同样的目录,然后执行:
d2j-dex2jar classes.dex
(3)如果没有报任何错误,这就说明我们已经转换成功了。现在观察dex2jar目录,你会发现多了classes-dex2jar.jar这个文件。但是对于我们而言,jar文件也不是可读的,因此这里还需要再借助一下jd-gui这个工具来将jar文件转换成Java代码。
(4)最后一步就是使用jd-gui工具打开classes-dex2jar.jar这个文件。我们便得到了Java代码。基本已经做到了90%以上的还原工作,像setContentView()方法传入的参数,反编译也就只能将相应的id值进行还原,而无法变成像R.layout.activity_main这样直观的代码展示。另外,除了MainActivity之外,引用的library也会作为代码的一部分被打包到classes.dex文件当中,因此反编译的时候这些代码也会一起被还原。
1.2 资源反编译
要想将APK文件中的资源反编译出来,又要用到另外一个工具了:
Apktool:用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。
下载地址:http://ibotpeaches.github.io/Apktool/install/
(1)下载该工具后目录下会存在apktool.bat和apktool.jar这两个文件。
(2)我们将APK文件拷贝到和这两个文件同样的目录下,然后cmd也进入到这个目录下,并在cmd中执行如下命令:
apktool d <APKName>.apk
(3)第二步成功后我们会发现在当前目录下多了一个<APKName>文件夹,这个文件夹中存放的就是反编译的结果了。我们可以打开AndroidManifest.xml、res/layout即可查看资源信息。
【拓展】
第二步命令中d是decode的意思,表示我们要对Demo.apk这个文件进行解码。那除了这个基本用法之外,我们还可以再加上一些附加参数来控制decode的更多行为:
-f //如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
-o //指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
-s //不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
-r //不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)。
2. 重新打包
首先我们来看一下通过apktool反编译后的包目录情况,如下图所示:
(1)其中,original文件夹下存放的是未经反编译过、原始的AndroidManifest.xml文件。
(2)res文件夹下存放的是反编译出来的所有资源。
(3)smali文件夹下存放的是反编译出来的所有代码。
(4)AndroidManifest.xml则是经过反编译还原后的manifest文件。
这里值得一提的是smali文件夹,如果你进入到这个文件夹中你会发现它的目录结构和我们源码中src的目录结构是几乎一样的,主要的区别就是所有的Java文件都变成了smali文件。smali文件其实也是真正的源代码,只不过它的语法和Java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言,如果你能够看得懂smali文件的话,那么你就可以做很恐怖的事情了——你可以随意修改应用程序内的逻辑,将其进行破解。我们可以稍微改变smali文件里的部分内容,并重新打包,只需要在cmd中执行如下命令:
apktool b Demo -o <New_APKName>.apk
其中b是build的意思,表示我们要将Demo文件夹打包成APK文件,-o用于指定新生成的APK文件名。成功后便在当前目录下生成了apk文件。
3. 重新签名
不过目前这个<New_APKName>.apk还是不能安装的,因为它还没有进行签名。我们显然没有办法拿到原作者的签名,因此我们只能拿自己的签名文件对这个APK文件重新进行签名,重新打包出来的软件也就是个盗版软件。使用Android Studio或者Eclipse都可以非常简单地生成一个签名文件。
有了签名文件之后在cmd中执行签名命令就可以进行签名了,命令格式如下:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名
(1)其中jarsigner命令文件是存放在jdk的bin目录下的,需配置系统的环境变量。下同。
(2)签名之后的APK文件现在已经可以安装到手机上了,不过在此之前为了使得我们的程序在Android系统中运行得更快,我们需要对签名后的APK文件进行一次对齐操作(使用的是zipalign工具,存放于<Android SDK>/build-tools/<version>目录下),命令格式如下:
zipalign 4 <New_APKName>.apk <New_APKName_aligned >.apk
(3)其中4是固定值不能改变,后面指定待对齐的APK文件名和对齐后的APK文件名。运行这段命令之后就会生成一个<New_APKName_aligned >.apk文件,便可以在手机上运行我们重新打包过后的APK了。
转载整理自郭大侠博客:http://blog.csdn.net/guolin_blog/article/details/49738023
Androd安全——反编译技术完全解析的更多相关文章
- android apk 防止反编译技术第二篇-运行时修改字节码
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- android apk 防止反编译技术第三篇-加密
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- android apk 防止反编译技术第四篇-对抗JD-GUI
又到周末一个人侘在家里无事可干,这就是程序员的悲哀啊.好了我们利用周末的时间继续介绍android apk防止反编译技术的另一种方法.前三篇我们讲了加壳技术(http://my.oschina.net ...
- 转: android apk 防止反编译技术(1~5连载)
转: android apk 防止反编译技术 做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习. ...
- android apk 防止反编译技术第一篇-加壳技术
做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成 ...
- APK防反编译技术
APK防反编译技术 下载地址:地址 我们的APK实际上就是一个ZIP压缩文件,里面包括有一个classes.dex.我们编译后生成的程序代码就所有在那里了, 通过apktool等工具能够轻松地将它们反 ...
- Android反编译技术总结
一.Apk反编译工具及其使用方法 1.原理 学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后的Apk里面都有什么文件,各种文件都是怎么生成的. 这里有两篇AndroidWeekly中推荐 ...
- Android反编译,apk反编译技术总结
1.谷歌提供的工具:android-classyshark 下载地址:https://github.com/google/android-classyshark/releases,下载下来之后是一个可 ...
随机推荐
- WPF OnApplyTemplate 不执行 或者执行滞后的疑惑
OnApplyTemplate 不执行 平时如何开发自定义控件的 在WPF自定义控件开发的过程中遇到了这样一个问题,属性更改事件在OnApplyTemplate之前执行.我在写自定义控件的时候,喜欢通 ...
- 面向对象(OOP)一
一.面向对象理论 1)面向对象概念 面向对象编程(object Oriented Programming,OOP),是一种计算机编程构架,OOP达到软件工程的三个目标重用.灵活和扩展性. 2)什么是对 ...
- js或者jq判断一段文字中是否有自己想要的那几个字,如果有就把那几个字变成红色
如何判断一段文字中是否有自己想要的那几个字,如果有就把那几个字变成红色(在html中)比如有body中有这么一串文字“驾驶的后视镜的华盛顿”,想要判断里面是否有“驾驶”这两个字,如果有就把这两个字变成 ...
- tf warning等级
from:http://blog.csdn.net/tsinghuahui/article/details/72938764 tf讨厌的warning 2017-08-03 10:02:52.0990 ...
- MySQL-5.6.30 (OpenLogic CentOS7.2)
平台: CentOS 类型: 虚拟机镜像 软件包: centos7.2 mysql5.6.30 basic software database linux open source 服务优惠价: 按服务 ...
- Windows系统HTTP身份验证方法
当Windows客户端尝试使用HTTP协议访问基于Web的资源时,会在客户端和服务器之间建立"对话".换句话说,服务器告诉客户端,访问资源之前进行身份验证 ,并且服务器还告诉客户端 ...
- Yii2 components api/controller
When we wrote API, those controllers need to implement the following feature: 1. return JSON format ...
- HBuilder发行App(Android和ios)
怎样将开发好的app测试和上架,此文包括Android和ios打包.测试和上架的大概过程.内容有些简陋,因为此过程踏坑无数,特此留念. 特此声明:内容不全仅供参考. 介绍两个参考网站: 1. http ...
- PMBOK(第六版) PMP笔记——第十章(项目沟通管理)
PM 大多数时间都用在与干系人的沟通上.第十章有三个过程: 规划沟通管理:根据干系人的需求,制定沟通管理计划管理沟通:根据沟通管理计划发布.收集.处理信息监督沟通:确保在正确时间将正确信息传递给正确的 ...
- SEO人士一定要了解的搜索引擎惩罚原则
SEO人士一定要了解的搜索引擎惩罚原则 SEO 的人一般都知道SEO分为白帽,黑帽,甚至还有灰帽.简单说,如果你熟读过谷歌网站质量指南,就可以了解,符合搜索引擎质量规范并且符合用户体验的SEO ...