apk反编译步骤

简介:

对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式,然后解压缩可以看到内部的文件结构,类似Sun JavaMe的Jar压缩格式一样,不过不同的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法来查看,当然这需要借助一些我们自己编写的跟踪程序。Google最然在Android Market上设置了权限保护app-private文件夹的安全,但是最终我们使用修改定值的系统仍然可以获取到需要的文件。

当然了,我们反编译的目的是为了学习。

1. Apk文件:自己准备apk文件。

2. 将xxx.apk扩展名修改为xxx.rar或者xxx.zip,用WinRar解压缩,你可以看到内部文件的结构,类似下图所示:

3. 直接打开AndroidManifest.xml会发现是乱码,这里面是二进制字符,需要用AXMLPrinter2.jar(http://code.google.com/p/android4me/downloads/list),下载AXMLPrinter2.jar文件,为了方便,这里我把它放到了Android SDK文件夹下面的tools文件夹中)

4. 逆向xml文件:把相应的AndroidManifest.xml放到AXMLPrinter2.jar同一目录,进入命令行模式,输入以下命令(注意空格):

java -jar AXMLPrinter2.jar AndroidManifest.xml ->AndroidManifest.txt

5. 然后,打开AndroidManifest.txt,你就可以看到相应内容了,但是对资源的引用:android:label="@7F080000" android:icon="@7F02002A"(这个是编译后对应资源R.java中的值),对一些属性值的设置:android:configChanges="0x000000A0",还有:android:textColor="?android:01010036" android:textColor="?android:01010212",这个还需要查SDK,看到有android字样,就知道是系统定义的常量,在android sdk Reference android.R.xxx 页面搜索01010036,找到"?android:01010036" 对应 "?android:attr/textColorSecondary","?android:01010212"对应 "?android:attr/textColorTertiary"

6. 在解压缩后的文件夹中,你会发现还有一个classes.dex文件,这是编译 后最终生成的dalvik字节码,还需要另外一个工具dex2jar(下载地址:http://code.google.com/p/dex2jar/downloads/list),将Android’s .dex format转换成Java’s .class format,下载后解压后有一个dex2jar.bat文件,把你的classes.dex文件拷贝到该目录中,命令行切换到该目录,运行命令dex2jar.bat classes.dex,将会在目录中生成classes.dex.dex2jar.jar文件。

7. 最后,还需要用工具去查看反编译的类,下载JD-GUI工具(绿色无须安装,下载地址:http://java.decompiler.free.fr/?q=jdgui),将jar文件拷贝到GUI文件夹下,运行JD-GUI,打开这个Jar文件,就能看到相应的类了,同样里面有许多很长的数字。

 然而,我们发现上述方法对资源文件(drawable、xml等),反编译的不够完美,在一些汉化工具中,用到了apktool,可以从http://code.google.com/p/android-apktool/下载(Windows下需要apktool1.x.x.tar.bz2和apktool-install-windows-r04-brut1.tar.bz2两个文件),下载后解压,为了以后方便使用,可以把得到的3个文件都复制到某个文件夹(比如D:\workspace\apktool)下,使用步骤如下:

打开命令行窗口,切换到你复制到的目录,或者直接把目录路径添加到环境变量中;

1)apktool d X.apk Y

反编译X.apk到文件夹Y

例如在命令行窗口输入"apktool d E:\game.apk E:\game_out"(不包含引号),就会启动apktool反编译E盘根目录下的game.apk文件,反编译得到的文件放在到E:\game_out\文件夹。

2)apktool b Y

从文件夹Y重建为APK,输出到Y\dist\out.apk

例如"apktool b E:\game_out",将E:\game_out文件夹下的文件编译成新的apk文件,新文件会放在E:\game_out\dist\目录下,文件名为out.apk。


其他参数,请输入apktool -help查看,经过反编译后,

classes.dex文件被反编译为smali文件夹下的文件;
resources.arsc被分解成若干xml文件,放在res文件夹下;
apk中原有的xml文件也变转换为可以直接用文本编辑器查看的形式。
其他的文件会被解压到相应的文件夹。










本文转自 breezy_yuan 51CTO博客,原文链接:http://blog.51cto.com/lbrant/499893,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
安全 Java 图形学
Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)
Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)
29 0
|
Java 数据安全/隐私保护 Windows
Mac下反编译apk
最近群里有人问如何在mac下进行apk反编译,我也没试过,以前都是在windows下进行反编译的,windows下很简单,有许多比较好的集成工具,如apkide(改之理),不过我猜mac下应该和windows下差不多,趁...
1473 0
|
4月前
|
安全 Java 图形学
Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)
对于辛辛苦苦完成的apk程序被人轻易的反编译了,那就得不偿失了,这篇文章就是解决Unity打包出来的包进行代码加固和混淆。
|
8月前
|
安全 Android开发
反编译之将脱壳后的dex文件重新打包成apk
反编译之将脱壳后的dex文件重新打包成apk
|
Java Android开发
安卓apk包反编译
拿到安卓的apk包如何,如何反编译呢。流程如下
359 0
安卓apk包反编译
|
XML Java 数据安全/隐私保护
反编译APK获取代码&资源
"反编译Apk",看上去好像好像很高端的样子,其实不然,就是通过某些反编译软件,对我们的APK进行反编译,从而获取程序的源代码,图片,XML资源等文件;不知道你有没有这样做过,看到一个别人的一个APP界面做得很精美,或者你看上别人的图片素材,简单点的,我们可以下载别人的APK,然后改下后缀名,改成xxx.zip,然后解压。
208 0
|
Java 开发工具 Android开发
Android反编译apk
总的来说就是先将apk文件解压,得到.dex文件,然后将.dex文件转为.jar文件,最后将.jar转为.java文件(就是将.jar文件中的.class文件转为.java文件)
161 0
Android反编译apk
|
安全 Java Android开发
安卓APK及framework代码反编译过程
本文仅是实验使用,并不支持商业用途! 最近想做一下反编译。
145 0
|
Java
反编译Apk之使用apktool、apktoolKit、jadx-gui
反编译Apk之使用apktool、apktoolKit、jadx-gui
574 0
反编译Apk之使用apktool、apktoolKit、jadx-gui
|
Android开发 Python
反编译及手机平板apk提取
反编译与手机平板apk提取 仅用于安卓设备
209 0
反编译及手机平板apk提取