最近简单的学习了下APK的反编译,现记录一下。
APK反编译用到的工具可以在此下载:http://download.csdn.net/detail/fengshuiyue/9622980
其中包含的工具有:
1)apktool:反编译资源文件
2)dex2jar:将apk反编译成jar
3)jd-jui:jar文件查看工具,反编译class文件为java文件
1.反编译apk资源文件
将apk文件放到apktool目录下,如下图:
打开cmd,运行 apktool d -f 310.apk 反编译apk,如下图:
(apktool参数:d表示反编译;-f表示如果目标文件已存在,则强制替换)
反编译后目录如下图:
其中:
original文件夹:存放未经反编译过的原始的AndroidManifest.xml文件
res文件夹:存放反编译出来的所有资源文件,图片和xml等
smali文件夹:该文件夹下的子目录和apk源码中的src目录结构是一样的,但是其中的文件是smali文件;smali文件是Andorid虚拟机所使用的寄存器语言,其也是正在的源代码。
2.打包反编译文件夹到apk文件
打开cmd,运行 apktool b 310.apk 重新编译apk,如下图:
会在310目录下面生成 buliding和dist两个目录,dist目录下面即是我们需要的apk文件了,如下图:
重新打包的apk文件不能直接安装,安装时会报包解析错误,此时我们需要下面得操作—>apk重新签名
3.apk重新签名
任然在cmd中运行命令,命令如下:
1)使用jdk自带命令keytool生产签名文件
keytool -genkey -alias 310.keystore -keyalg RSA -validity 9999999 -keystore 310.keystore
其中:
-genkey 产生密钥
-alias demo.keystore 别名 310.keystore
-keyalg RSA 使用RSA算法对签名加密
-validity 有效期限4000天
-keystore 数字签名文件名称310.keystore
2)使用jdk自带命令jarsigner签名apk
jarsigner -verbose -keystore 310.keystore -signedjar 310_signed.apk 310.apk 310.keystore
其中:
-verbose 输出签名的详细信息-keystore 310.keystore 密钥库位置
-signedjar 310_signed.apk 310.apk 310.keystore 正式签名,三个参数中依次为签名后产生的文件310_signed,要签名的文件310.apk和密钥库310.keystore.
整个操作如下图:
一般apk的汉化通过1、2、3步,在配合上资源文件的修改即可完成,下面将是要介绍apk源码的反编译。
4.apk的JAVA源码反编译
apk的JAVA源码反编译我们就需要用到apk原始文件中的classes.dex文件了,将apk扩展名修改为zip后,解压,我们可以看到如下图的目录结构:
在cmd界面进入dex2jar目录,执行dex2jar.bat classess.dex 命令,如下图:
classes_dex2jar.jar即为反编译好的jar文件了,下面jd-jui将要出场了。
5.jar文件反编译
将4步中反编译的classes_dex2jar.jar拖入jd-jui中,我们即可看到项目中整体的包目录和源文件了,如下图:
选中file-sava all source即可将源码按目录结构保存到磁盘,如下图:
打开eclipse新建android工程,将步骤1中的资源文件、lib文件;步骤5反编译的源码文件按照android工程的目录结构复制到相应位置,下面就可以修改apk中的相应的功能了。
上述步骤4、5中反编译出来的源码是没有经过混淆的,如果apk是混淆过的那么我们仅仅只能大体阅读下该apk的相关的思路,无法原样拷贝到工程中使用,混淆过的apk反编译出来的目录结构如图: