如何将androidapk反编译为java源代码
更新时间:2012年12月06日 09:29:14 作者:
因为Android的代码是放置在dalvik虚拟机上的托管代码,所以可以很容易地反编译成我们可以识别的代码。 本文将对其进行详细介绍。 有需要的同学可以参考以下
由于Android的代码是放置在dalvik虚拟机上的托管代码,因此也可以很容易地反编译成我们可以识别的代码。
之前写过一篇文章,将Android apk包反编译成smali文件反编译apkjava源码,然后重新编译签名打包,实现篡改apk的功能。
最近有新的办法,可以直接从Android apk包中的classes.dex文件中反编译dex代码为java的.class补码,然后再从.class补码反编译为java源代码。 我不需要多说。
首先我们需要的工具是dex2jar和jd-gui
第一个工具dex2jar用于转换classex.dex文件,即dex二补码转换为java的标准.class二补码,然后jd-gui反编译标准.class二补码即可是java源代码。
首先从apk包中提取classes.dex
放到dex2jar目录下
然后在命令行执行
dex2jar.batclasses.dex
此时执行成功后会生成一个classes.dex.dex2jar.jar文件
然后用jd-gui打开这个文件,如右图
和我自己写的这个程序源码几乎一样
提供此反编译方法主要供大家学习研究。 如果有什么问题可以发邮件给我一起讨论。
希望您不要利用此方法进行恶意活动。 虽然别人通过努力写程序并不容易,但是这种方法可以大致学习别人写的程序的逻辑和结构。 希望对您有所帮助。
Android逆向apk程序的经验
本文主要介绍如何对Android APK应用程序进行逆向工程。 本文提供的方法仅供研究和学习之用。
本文所需的工具是
jdk用于搭建java运行环境
AXMLPrinter2.jar 这用于反转.xml 文件
baksmali.jar用于逆向classex.dex文件
因为Android的.apk文件实际上是一个zip文件,可以直接用winrar打开
如右图所示:
用rar打开后,我们可以看到该文件实际上是一个zip包,其中包含META-INF文件夹。 该文件夹用于保存签名文件,保证包的完整性。
res文件夹下是apk使用的资源文件。 它们都保存完好。 我们可以直接提取它们。 在进行汉化时,我们可以直接读取字符串文件并进行更改。
AndroidManifest.xml文件是编译后的配置文件,用于声明程序中包含的活动和服务以及程序的能力,即权限。 resources.arsc是编译后的资源描述文件反编译apkjava源码,我们主要关注classes.dex。 我们编译的Android程序中,源程序中的所有.java文件最终都会编译成这样一个.dex文件,在Android手机上的dalvik虚拟机上执行。
首先,我们介绍如何对.xml文件进行逆向工程
因为我们直接用记事本打开apk包中的xml文件,还是有一些乱码
所以我们需要恢复它才能看得更清楚
这里需要用到AXMLPrinter2.jar工具
具体来说,打开命令行。 我们以AndroidManifest.xml为例,输入以下命令
java-jarAXMLPrinter2.jarAndroidManifest.xml>AndroidManifest.txt
有兴趣的也可以写一个.bat脚本方便执行
我们可以看一下执行结果
执行前的AndroidManifest.xml文件
我们可以执行完之后再看一下
复制代码代码如下:
xmlns:android="http://schemas.android.com/apk/res/android"
安卓:版本代码=“322”
android:versionName="ver3.2.2"
包=“com.eoeandroid.wallpapers.christmas”
机器人:标签=“@7F040000”
安卓:图标=“@7F020004”
机器人:标签=“@7F040001”
android:name=".Main"
android:name="android.intent.action.MAIN"
android:name="android.intent.category.LAUNCHER"
android:name=".service.SyncDeviceInfosService"
android:name="com.mobclix.APPLICATION_ID"
android:value="30c0e2bb-a878-43cb-830b-a39fcae33b0c"
安卓:minSdkVersion =“3”
android:name="android.permission.INTERNET"
android:name="android.permission.SET_WALLPAPER"
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:name="android.permission.ACCESS_NETWORK_STATE"
android:name="android.permission.READ_PHONE_STATE"
android:name="android.permission.ACCESS_NETWORK_STATE"
基本上可以恢复的内容与源程序大致相同。
这里我以eoe制作的壁纸程序为例。
接下来大家一定更关心classes.dex的逆向工程
这一张似乎和上一张非常相似。
使用baksmali.jar这个工具,是美国一位对Android有深入研究的大佬做的。
执行代码
java-jarbaksmali.jar-oclassout/classes.dex
说说classes.dex可以倒转成文件夹
我可以在这里截图给你看。
单击其中一个文件,让我们继续查看它。
是不是感觉这段代码很友好,从中我们可以大致推算出源程序的一些结构流程? 本文仅供研究和学习之用。 欢迎与我讨论交流