最近尝试着反编译自己的apk,照着百度上的一些方法,文章都比较老了,总是报各种错,现在我总结一下如何反编译apk
一、首先确保电脑配置了java运行环境,如何配置java环境,我不在述说,可自行百度,为了反编译apk,我们需要下载3个工具
(1)apktool
作用:利用apktool查看apk的xml文件、AndroidManifest.xml和图片等。
进入官网https://ibotpeaches.github.io/Apktool/install/,不同的操作系统按不同的步骤来就可以了,我是window操作系统。
(2)dex2jar
作用:将apk反编译成java源码(classes.dex转化成jar文件)
下载地址:http://sourceforge.net/projects/dex2jar/files/
(3)jd-gui
作用:查看APK中classes.dex转化成出的jar文件,即源码文件
下载地址:http://jd.benow.ca/
将dex2jar、jd-gui解压,最好是将这三个工具放在同一个文件夹下,方便自己使用。
二、运行编译
将需要反编译的apk移动到这三个文件夹下,win+R,输入cmd调出命令行窗口,切换到apktool文件夹目录下:
(1)运行:apktool d test.apk,反编译时,出现了如下错误:
WARNING: Could not write to (/Users/xxx/Library/apktool/framework), using /var/folders/wr/svbl4qg12kq75hghq7nr4lch0000gn/T/ instead...
S: Please be aware this is a volatile directory and frameworks could go missing, please utilize --frame-path if the default storage directory is unavailable
看提示是无法写入到这个目录/Users/xxx/Library/apktool/framework
(xxx为电脑用户名),那就在/Users/xxx/Library
下新建apktool文件夹,并在apktool文件夹下再新建个framework文件夹,然后为了保险起见设置新建文件夹到权限,在终端输入:chmod -R 777 /Users/xxx/Library/apktool
接着再重新执行反编译命令就可以成功了
在test.apk相同目录下会出现反编译后的文件夹。
(2) 把apk后缀名改为zip,然后解压后,就会发现有个classes.dex,这里面就是java源码了。
(3) 把dex文件拷贝到dex2jar-2.0解压后的目录下,cmd窗口进入到dex2jar-2.0下,运行:d2j-dex2jar.bat classes.dex回车
完成后我们在F:\Android\apktools\dex2jar-2.0目录下就会多了个classes-dex2jar.jar文件,这个就是我们需要的jar文件。
(4) 如何查看java代码了,用工具jd-gui打开classes-dex2jar.jar就可以了,如果你的apk经过混淆,那么看到的都是a、b之类的。
三、重新打包
在终端输入编译命令: apktool b xxx
(xxx为刚才反编译的文件夹),成功后会在xxx文件夹下的dist文件夹下生成打包好后的apk文件。现在打包好后的apk是没有签名的,所以无法安装,现在给apk签名
(1) 在终端输入:
keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore /Users/xxx/Desktop/android.keystore
20000为时间,这个设置长点就好了,-keystore后面是签名文件保存路径。输入命令按回车键会让输入密码等信息,按提示输入,不要忘了密码,签名时要用。
(2)接着输入:
jarsigner -verbose -keystore /Users/xxx/Desktop/android.keystore -signedjar /Users/guyuechao/Desktop/signed.apk /Users/xxx/Desktop/unsigned.apk android.keystore
-keystore后面的为签名文件的路径,-signedjar后面为签名好后apk的存放路径,在这个后面的一个为需要签名的pak的路径,最后的android.keystore为证书的别名,如果不知道别名,可以在终端输入:keytool -list -v -keystore /Users/xxx/Desktop/android.keystore
查看具体信息,里面有别名。
这一步还要注意,签名文件和需要签名的apk要在同一目录下。