Android应用一键反编译工具

41 sec read

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

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

  • Manifest文件:xml是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息[ , ],如要把apk上传到Google Market上,也要对这个xml做一些配置。注意:在apk中的xml文件是经过压缩的,不可以直接打开。
  • Res文件:res文件夹下为所有的资源文件。
  • arsc文件:为编译后的二进制资源文件,许多做汉化软件的人都是修改该文件内的资源以实现软件的汉化的。
  • META-INF目录:META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个api包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在手机安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。
  • dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。

反编译流程

1)XML文件的反编译

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

2)classes.dex文件反编译

classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。Android模拟器中提供了一个dex文件的反编译工具,dexdump。用法为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。但是这样得到的结果,其可读性是极差的。下面介绍一个可读性比较好的工具。

工具准备:

  • 把dex文件反编译为jar文件的工具。(dex2jar)
  • 把jar反编译为java的工具。(JD-GUI)

反编译的步骤

  1. 从APK中提取dex文件,对APK文件解压即可得到。 将其放到dex2jar的目录下,打开cmd,运行dex2jar.bat classes.dex,生成classes.dex.dex2jar.jar。
  2. 运行JD-GUI工具,打开上面的jar文件,即可看到源代码。

工具推荐

  • apktool 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看
  • dex2jar 作用:将apk反编译成java源码(dex转化成jar文件)
  • jd-gui 作用:查看APK中dex转化成出的jar文件,即源码文件

要使用上面的工具一步步的完成反编译无疑比较麻烦,所以有高手就将这几款工具进行了集合。onekey-decompile-apk集成apktool/dex2jar/jd-gui只需执行一步即可反编译出apk所有文件(资源文件和jar等等)。

使用方法

  • 解压缩下载的onekey-decompile-apk.zip
  • 将apk文件放到onekey-decompile-apk目录下
  • 将apk文件拖拽到_onekey-decompile-apk.bat上

执行完成后

  • 会在onekey-decompile-apk目录下生成和apk同名的目录(放置了apktools反编译出来的东西)
  • 会在onekey-decompile-apk目录下生成和apk同名的jar文件(dex2jar反编译出来的class)

单单会使用这些工具还不够,你还需要:

  • 具有一定的阅读JAVA代码的能力
  • 稍微有点Android基础,越多越好
  • 会用eclipse的一些Android调试的相关工具
  • 了解一下smali的语法规范和字段的自定范围
  • 有点应变能力思想转换能力
  • 足够的耐心

2016-10-30更新:

有些时候使用 JD-GUI 反编译的时候会有部分文件(Constants类即常量类)打开是 // INTERNAL ERROR // ,解决办法,使用其他工具替换:

Update:2016-12-16

今天在反编译的时候遇到如下问题:

查询得知是由于apktool版本过低导致的,于是去官网(https://ibotpeaches.github.io/Apktool/)下载了最新版本,替换了目录下的文件,然后发现还是报错。

原来最新版已将SmaliDebugging移除,下载2.0.9版本后再做替换即可。

其他链接:

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

C语言学习:size_t

在学习C语言的时候,遇到了一个新的数据类型size_t,截止目前也没有完全理清这个类似的具体场景及出现的原因。
44 sec read

C语言学习:main()函数的正确写法

C语言虽然是一门古老的语言,但是其标准一直在完善,所以很多以前支持的语法在到当前已经不能在使用了。 C语言的版
41 sec read

Scipy数学函数的Scala实现

最近在推进项目的时候,遇到需要将线下的Python代码转化成线上的集群代码,由于机器代码环境是Scala,所以
4 min read

发表评论

电子邮件地址不会被公开。 必填项已用*标注