​[AndroidAPP]APK反编译与重新打包

2017年12月02日 Android 暂无评论 阅读181次
[AndroidAPP]APK反编译与重新打包的那些事


一、工具 & 环境 准备

工于利其事,必先利其器。先上工具:

1、apktool

1、apktool

 作用:
 将apk文件解压,得到资源文件(AndroidManifest.xml清单文件、layout布局、string等xml资源文件)
 这个工具的解压,和一般电脑上的解压工具不一样,解压工具出来的APK得到的资源文件是二进制文件,我们是无法读懂的。
 
 下载地址:
 https://bitbucket.org/iBotPeaches/apktool/downloads/</span><br />   下载后得到apktool_2.3.0.jar文件(目前最新版本是2017年9月21日发布的2.3.0),并命名为apktool.jar(配合下面脚本使用)。另外还需要一个脚本执行文件
  https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/osx/apktool</span><br />   保存到文件apktool,并sudo chmod +x apktool 即可
  确保apktool文件和上面下载重命名为apktool.jar放到同一个目录下。
  apktool是否要放到环境变量这个就看个人需要了,再次不再敖述。

2、dex2jar
 作用:
 将apk中的classes.dex文件转换成jar文件。
 
 下载地址:
 https://sourceforge.net/projects/dex2jar/</span><br />
 下载后要对dex2jar.sh增加可执行权限。
 chmod +x dex2jar.sh

3、jd-gui
 作用:
 将jar包还原为java文件。
 说明下,非Android专用,只要是jar包,一般用这个均可以还原为java文件

 下载地址:
 http://jd.benow.ca</span><br />

二、Android 对APK进行反编译

工具准备好之后,接下来就是反编译的过程了。

0、原始APK文件:/Users/jileniao/Documents/decompile-apk/TestDemoDecompile.apk

1、使用apktool工具

cd /Users/jileniao/Documents/decompile-apk/
apktool d TestDemoDecompile.apk



更多使用方法,可以随时apktool -help查阅。

执行后,会在decompile-apk目录下,生成apk同名的文件夹TestDemoDecompile。

进入TestDemoDecompile文件夹:


decompile-apk-apktool b.png


这就是我们熟悉的Android源码工程目录结构了。
打开AndroidManifest.xml看看吧,已经不是二进制代码了,其他布局文件资源文件也是同样。

其中注意smali文件夹,里面目录和src文件夹下java源码目录相同,里面都是以.smali结尾的文件。
smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。

2、针对上面的smali文件,虽然有固定的语法格式,但读起来还是比较困难的,我们还是希望能直接读的java代码。
  
  使用dex2jar工具。执行下面命令

  cd /Users/jileniao/Documents/decompile-apk/
  d2j-dex2jar.sh TestDemoDecompile.apk



  执行后,会在d2j-dex2jar.sh目录下,生成apk同名+-dex2jar的jar文件。TestDemoDecompile-dex2jar.jar

  另外,属于步骤1的另外一种情况,有些apktool版本反编译出来的某个版本的apk文件含有的classes.dex的,或直接用解压工具解压apk也会得到classes.dex。
  这个classes.dex是Java代码编译得到的Dalvik VM能直接执行的文件。
  此时,针对classes.dex文件,也要执行dex2jar命令得到jar文件了

3、使用jd-gui还原java源码

有了jar文件,就是使用jd-gui了,如其名,这是个窗口工具,通过file open...便可以直接打包上面步骤2中生成的jar文件了。

  此时,终于有了守得云开见月明的感觉。完完整整清清楚楚的java文件已经呈现在眼前了。


三、Android 对APK进行反编译文件进行某些修改后,重新打包回APK,或叫二次打包

1、二次打包,还是使用apktool工具

 继续沿用上面步骤中的路径,我反编译后的目录是/Users/jileniao/Documents/decompile-apk/,一些修改也要在这里进行的。

 apktool b /Users/jileniao/Documents/decompile-apk



 命令执行结果,会在decompile-apk目录下生成dist和build文件夹
 其中build文件夹是编译过程中临时文件,dist中的apk就是本次打包后的apk了。

2、是不是迫不及待地想要安装apk试试了,此时直接安装apk后会有下面的错误。

 Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

见文知意,原来是没有经过签名的apk,此时就要对apk进行签名了。

签名,就要有签名文件,可以使用keystore命令生成一个签名文件

keytool -genkey -v -keystore decompile-apk -alias decompile-apk -keyalg RSA -validity 20000 -keystore ./decompile-apk.keystore 



该命令执行后,会有一系列诸如用户名、组织名、市、省、国家、密码等问题,按照提示回答后确认即可。

该命令将在当前文件夹下生成名为decompile-apk.keystore、别名decompile-apk、签名算法为RSA、有效期20000天的签名文件。


3、有了上一步的签名证书,可以给apk签名了。

jarsigner -verbose -keystore /Users/jileniao/Documents/decompile-apk/decompile-apk.keystore -signedjar /Users/jileniao/Documents/decompile-apk/TestDemoDecompile_signed.apk /Users/jileniao/Documents/decompile-apk/dist/TestDemoDecompile.apk decompile-apk




4、安装到手机确认

卸载之前的apk,重新安装二次打包后的apk,打开apk。命令如下:

adb uninstall net.jileniao.decompileapk
adb install /Users/jileniao/Documents/decompile-apk/decompile-apk.keystore -signedjar /Users/jileniao/Documents/decompile-apk/TestDemoDecompile_signed.apk
adb shell am start -n net.jileniao.decompileapk/net.jileniao.decompileapk.MainActivity





至此,已经完成了对APK从反编译,到重新打包回APK并签名,安装到手机的全过程。

反编译(逆向工程)仅限用于技术交流,禁止用户商业盈利目的。

分享本文至:

WRITTEN BY

avatar
本文标签:apk反编译
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

欢迎留言




用户登录

sitemap