Android 程序反编译

本文详细介绍了Android应用程序的反编译过程,包括Apk文件的结构、反编译工具的使用,如AXMLPrinter2.jar、dex2jar和JD-GUI。通过这些工具,可以解密AndroidManifest.xml、反编译classes.dex为Java源码,以及处理资源文件,为理解和学习Android应用提供了可能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Apk文件的格式

Android application package文件。每个要安装到android平台的应用都要被编译打包为一个单独的文件,后缀名为.apk其中包含了应用的二进制代码、资源、配置文件等

apk文件实际是一个zip压缩包,可以通过解压缩工具解开。可以用zip解开*.apk文件,下面是一个hellowordapk示例文件。

|– AndroidManifest.xml

|– META-INF

| |– CERT.RSA

| |– CERT.SF

| `– MANIFEST.MF

|– classes.dex

|– res

| |– drawable

| | `– icon.png

| `– layout

| `– main.xml

`– resources.arsc

Manifest文件:AndroidManifest.xml是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息[ ]如要把apk上传到Google Market上,也要对这个xml做一些配置。注意:在apk中的xml文件是经过压缩的,不可以直接打开。

Res文件:res文件夹下为所有的资源文件。

resources.arsc文件:为编译后的二进制资源文件,许多做汉化软件的人都是修改该文件内的资源以实现软件的汉化的。

META-INF目录:META-INF目录下存放的是签名信息用来保证apk包的完整性和系统的安全eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在OPhone平台上安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk.这就保证了apk包里的文件不能被随意替换.比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码,或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的.如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。

classes.dexjava源码编译后生成的java字节码文件但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。

XML文件的反编译

apk中的xml文件是经过压缩的,可以通过AXMLPrinter2工具解开,具体命令为:

java -jar AXMLPrinter2.jar AndroidManifest.xml

HelloAndroid程序中Manifest文件的实例:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:Android="http://schemas.android.com/apk/res/android

    package="name.feisky.Android.test

    Android:versionCode="1

    Android:versionName="1.0" >

    <application

        Android:icon="@7F020000

        Android:label="@7F040001" >

        <activity

            Android:name=".HelloAndroid

            Android:label="@7F040001" >

            <intent-filter>

                <action Android:name="android.intent.action.MAIN" >

                </action>

                <category Android:name="android.intent.category.LAUNCHER" >

                </category>

            </intent-filter>

        </activity>

    </application>

    <uses-sdk Android:minSdkVersion="6" >

    </uses-sdk>

</manifest>

而原文件为:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:Android="http://schemas.android.com/apk/res/android

    package="name.feisky.Android.test

    Android:versionCode="1

    Android:versionName="1.0" >

    <application

        Android:icon="@drawable/icon

        android:label="@string/app_name" >

        <activity

            Android:name=".HelloAndroid

            Android:label="@string/app_name" >

            <intent-filter>

                <action Android:name="android.intent.action.MAIN" />

                <category Android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

    <uses-sdk Android:minSdkVersion="6" />

</manifest>

classes.dex文件反编译

classes.dexjava源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。

Android模拟器中提供了一个dex文件的反编译工具dexdump

1.用法为首先启动Android模拟器把要查看的dex文件用adb push上传的模拟器中,

2.然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。但是这样得到的结果,其可读性是极差的。下面介绍一个可读性比较好的工具。

工具准备:

1、把dex文件反编译为jar文件的工具。(dex2jar

2、把jar反编译为java的工具。(JD-GUI

反编译的步骤

1、从APK中提取classes.dex文件,对APK文件解压即可得到。将其放到dex2jar的目录下,打开cmd,运行dex2jar.bat classes.dex,生成classes.dex.dex2jar.jar

2、运行JD-GUI工具,打开上面的jar文件,即可看到源代码。

HelloAndroid实例:

import Android.app.Activity;

import Android.os.Bundle;

public class HelloAndroid extends Activity {

public void onCreate(Bundle paramBundle) {

super.onCreate(paramBundle);

setContentView(2130903040);

}

}

其原程序为:

import Android.app.Activity;

import Android.os.Bundle;

public class HelloAndroid extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

}

Android反编译工具Apktool使用

Android反编译工具:Apktool,支持Linux Windows下工作。

安装步骤如下:

1.首先安装需要JAVA环境,先下载JDK/JRE,点击下载,已经有JAVA环境的可跳过此步。

2.code.google上下载apktool.jar以及相关文件:http://code.google.com/p/android-apktool/downloads/list

点击下载apktool-1.0.0.tar.bz2 apktool-install-windows-2.1_r01-1.zip

3.解压apktool.jar C:\Windows文件夹下。

解压apktool-install-windows.zip到任意文件夹。

4.点击开始菜单,运行,输入CMD回车,用cd命令转到刚刚解压apktool-install-windows所在的文件夹,输入apktool,出现一些命令说明即成功安装。

Apktool 命令

apktool d geek.apk test  反编译 geek.apk到文件夹test

apktool b  geek 从文件夹geek重建APK,输出到ABC\dist\out.apk

Android命令行编译方法,不用Eclipse IDE

想必大家都知道Google官方提供的Android开发环境是Eclipse,仅仅给出了ADT插件。但是在Android SDK Tool文件夹中我们可以找到一个名为activityCreator.bat的批处理文件,它调用的是tools\lib\activityCreator文件夹中的activityCreator.exe程序,其实为一个Python语言解释程序。activityCreatorActivity创建脚本全部参数使用方法如下:

Usage

activityCreator [--out outdir] [--ide intellij] your.package.name.ActivityName

Creates the structure of a minimal Android application.

The following will be created

- AndroidManifest.xmlThe application manifest file.

- build.xmlAn Ant script to build/package the application.

- res The resource directory.

- src The source directory.

- src/your/package/name/ActivityName.java the Activity java class. packageName

is a fully qualified java Package in the format . … with

at least two components.

- bin The output folder for the build script.

Options

--out specifies where to create the files/folders.

--ide intellijcreates project files for IntelliJ

比如:定位目录到Android SDKTools目录中,执行activityCreator -out ReleaseDir cn.com.android.www

其中 -out参数为设置输出文件夹为ReleaseDir,而最后的cn.com.android.www为我们的Package包名称。

注意:由于Android SDK对应开发平台不同,而对应编译文件也不同,Windows下为批处理activityCreator.bat,而Linux系统自带Python解释器,所以为activityCreator.py

Android反编译小结

总结反编译主要的目的在于学习。利用反编译进行相关的汉化或修改,都是不道德的!

大家都知道,将apk文件解压后有两部分文件需要处理,一种是xml文件,另一种一个dex文件(.dex),我们可以从.dex文件中得到.class,利用后者再得到大家垂涎已久的java文件。

下面分别针对这三种格式的文件进行反编译处理;

1.xml文件进行包的解析,一般有两种方式:apktool(推荐)和AXMLPrinter2.jar;

2.dexclass公认dex2jar.bat,实现反编译;公认的强者;

3.classjava的方式要更多样化一些,因为只是查看反编译后的代码:jd-gui(推荐),JodeclipseJodeEclipse插件),JadClipseJadEclipse插件)。

还是作个大致介绍吧:

1.首先把apk文件改名为.zip,然后解压缩其中的class.dex文件,它就是java文件编译再通过dx工具打包成的。

2.class.dex拷贝到dex2jar.bat所在目录。运行dex2jar.bat class.dex,生成classes.dex.dex2jar.jar

3.运行JD-GUI工具(绿色软件,好用的软件!),打开上面的jar文件,即可看到java源代码。

A1. apktool:

通常用于生成程序的源代码和图片、XML配置、语言资源等文件我们对图片和语言资源等文件修改后,可以再把它们编译打包成APK,签名后就是手机可以安装的本地化/修正版APK了。支持Linux Windows下工作。

安装步骤:

1.安装JAVA环境(官方推荐jdk 1.6);

2.下载apktool.jarhttp://code.google.com/p/android-apktool/downloads/list

点击下载apktool1.3.2.tar.bz2 apktool-install-windows-2.2_r01-3.tar.bz2 (不一定是这个,但最好选最新版本的吧!)

3.解压apktool1.3.2.tar.bz2得到apktool.jar

解压apktool-install-windows.zip到任意文件夹,将apktool.jar拷入此文件夹中(也有人说是直接全部拷入C:/Windows,一样的);

(目前此文件夹中有三个文件:apktool.jar/apktool.bat/aapt.exe

4.cmd命令行进入到解压apktool-install-windows-2.2_r01-3.tar.bz2所得的文件夹,输入apktool测试是否安装成功;

安装成功后,下面开始反编译过程:

1.apktool d (要反编译的文件) (输出文件夹)

如:

apktool d XXX.apk (目标文件夹)      反编译 geek.apk到文件夹test

2.apktool b (目标文件夹)

从目标文件夹中重建APK,生成的APK"目标文件夹"\dist文件夹里,叫out.apk

这个out.apk是没有签名的,所以不能直接装到手机里。签名工具和方法见http://www.hiapk.com/bbs/thread-21261-1-1.html,这里就不说了。签名后得到的APK,就是可以装到手机里的了。

A2. AXMLPrinter2.jar

将它放到android-sdk-windows-1.5_r3\tools文件夹中。运行cmd,进入tools目录,运行java -jar AXMLPrinter2.jar main.xml > main.txt

于是我们就得到了反编译后的XML文件。

经历了这么多,我们得到的只是部分布局文件和资源文件,但java文件还是"犹抱琵琶半遮面"

下面,让我们掀起她的红盖头来:

B. dex2jar

下载:http://code.google.com/p/dex2jar/downloads/list

方法:

1.首先找到Android软件安装包中的classes.dex (解压得到);

它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件。

2.classes.dex拷贝到dex2jar.bat所在目录;

在命令行模式下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex,生成classes.dex.dex2jar.jar,成功了一半!

C1. JD-GUI

下载:http://java.decompiler.free.fr/?q=jdgui

方便好用,直接解压得到JD-GUI,用它打开上面的jar文件,File-->Save JAR Source,即可看到梦寐以求的java源代码。

我们也可以解压B步骤得到的jar文件得到class文件,到这里,我们就要用到JodeclipseJadClipse了。

C2. Jodeclipse---JodeEclipse插件 C3. JadClipse---JadEclipse插件

关于这两个Eclipse插件的安装可见下面链接:

http://tgyd2006.javaeye.com/blog/553061

(C4. 还有朋友提到DJ Java Decompiler,没用过,可以一试!)

但也有人提出此问题:

自从eclipse升级到3.3以后jad插件就一直没有成功的安装上去,网上看了好多文章也是以前版本的安装方法,3.3目前通过eclipsesoftware update的插件安装方式已经不行了。

解决方法如下:

1.http://www.kpdus.com/jad.htmldownload地址下载最新的jad,我目前下载的是jadnt158.zip

2.http://nchc.dl.sourceforge.net/s ... jadclipse_3.3.0.jar地址下载jadclipse_3.3.0.jar,拷贝到eclipseplugins目录下。

3.启动或重起eclipse,修改window -> Preferences -> Java -> JadClipse 下的Path to decompiler 如:D:\eric\jadnt158\jad.exejadnt158.zip解压后的目录)。

4.Windows -> Perference -> General -> Editors -> File Associations中修改“*.class”默认关联的编辑器为“JadClipse Class File Viewer” 大功告成,之后在java类里按住ctrl点击类就可以看到它jad反编译后的源带码了。

如果发现安装了没有效果,可以删除eclipse主目录下的\configuration\org.eclipse.update后,再执行eclipse -clean试试。

最后,将得到的java文件和得到的xml文件组合可得一个android工程,即可得到相对比较完整的apk源码;但也有些额外加的包没被编译出来。


 

一.反编译Apk得到Java源代码 首先要下载两个工具:dex2jar和JD-GUI,前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工 具,可以直接查看Jar包的源代码。 以下是下载地址: dex2jar:http://laichao.googlecode.com/files /dex2jar-0.0.7-SNAPSHOT.zip JD-GUI:http://laichao.googlecode.com/files/jdgui.zip 具体步骤: 首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的; 解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex 生成classes.dex.dex2jar.jar 运行JD-GUI,打开上面生成的jar包,即可看到源代码了。 二.反编译apk生成程序的源代码和图片、XML配置、语言资源等文件 如果是只是汉化软件,这将特别有用。首先还是下载工具,这次用到的是apktool,下载地址: http://code.google.com/p/android-apktool/,apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip两个包都要下。 具体步骤: 将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe,apktool.bat,apktool.jar; 在命令行下定位到apktool.bat文件夹,输入以下命令: apktool d C:\***.apk C:\***文件夹 命令行解释:apktool d [要反编译的apk文件 ] [输出文件夹],特别注意:你要反编译的文件一定要放在C盘的根目录里; 将反编译完的文件重新打包成apk,很简单,输入apktool b c:\***文件夹(你编译出来文件夹)即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhwadezh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值