实用

Android反编译流程和apk反编译重新打包签名

2019-07-28  本文已影响126人  安卓搬砖小曾

作为一名Android开发者,很多的时候需要去学习别人优秀的代码,原本在GitHub上就有很多开源的项目代码,但有的时候在使用软件时候遇到自己想要的功能时,想要学习实现的代码时,这时候就需要使用到反编译这项技术了。正常情况下,Android应用打包成apk之后,就无法再看到开发这个应用时使用的资源文件以及代码了。但是我们通过网上提供了一些工具,还是可以将apk进行反编译的,apk反编译之后,我们就可以看到开发这个应用使用的资源文件(图片)、layout、样式、相关的实现代码等,apk反编译也算是Android开发中一个比较实用的技巧吧,当我们对别人开发好的应用感兴趣时,我们就可以通过这种技术手段将别人打包好的apk进行反编译,继而可以看到我们感兴趣的内容。反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平。

一. 反编译使用工具

  1. apktool (资源文件获取) ,下载地址:https://ibotpeaches.github.io/Apktool/install
  2. dex2jar(源码文件获取),下载地址:https://github.com/pxb1988/dex2jar
  3. jd-gui (源码查看),下载地址:http://jd.benow.ca

这里同样分成两个部分,一个是代码的反编译工具,一个是资源的反编译工具。

代码反编译的工具:

反编译资源的工具:

二. 反编译的流程

  1. 首先需要拿到反编译的软件,拿到的软件一般是xxx.apk,但有的时候拿到的软件会是xxx.apk和xxx.odex,后者是平台优化过的产物,关于xxx.apk与xxx.odex的合并会在另一篇文章中讲到。拿到完整apk以后,手就可以着手反编译的工作了。

2. 反编译资源文件:

java -jar apktool_2.3.1.jar d -f KeyValueTest.apk -o KeyValueTest

3. 反编译代码文件:

4. 可以使用dex2jar,也可以使用jadx对classes.dex进行反编译,相对于dex2jar,jadx更加方便快捷,打开bin文件中的jadx-gui.bat然后直接选择APK即可,虽然jadx也可反编译资源文件,但有时候并不准确。


jadx jadx界面

5. 综上,反编译APK可以采用APKTool+JADX,也可以采用APKTool+dex2jar。推荐使用前者。有一个在线的反编译网站,采用的是JADX。
->由此去<-

6. 至此,可以得到结论在未加扰的情况下,基本可以得到和源代码一摸一样的代码,加扰的情况阅读起来会很费劲,在此不做演示。将得到的res和AndroidManifest.xml以及java文件整合在一起,便得到了一份内似于源代码的代码。

其中引用参考文章:https://www.cnblogs.com/cj5785/p/9892978.html

三. 重新打包签名(Mac环境)

重新编译就是在cmd里执行命令apktool b test

成功之后,test目录下会生成build和dist目录

build目录下存放的是打包后的dex文件和资源文件(和apk解压后一样一样的)

dist目录下存放的是重新打包后的apk文件

重新签名

复制签名文件到dist目录下方便操作

终端进入dist目录,执行命令jarsigner -verbose -keystore [your_key_store_path] -signedjar [signed_apk_name] [usigned_apk_name] [your_key_store_alias] -digestalg SHA1 -sigalg MD5withRSA 字段说明:

因为我们把秘钥和test.apk放在同一路径,所以密钥所在位置的绝对路径直接填testkey就好啦,macjenkinskey是我的秘钥别名,别误会(邪恶.jpg)

输一下密码,看不到输入的,开始签名

签完名后,在dist目录下就可以看到签完名后的apk了

后话

反编译的时候,也可以把test.apk的拓展名改成test.zip解压出来


把classes.dex复制到dex2jar-2.0路径下


终端进入dex2jar-2.0路径下,执行命令./d2j-dex2jar.sh classes.dex

同样可以得到classes-dex2jar.jar

反编译,再回编译,同样可以得到classes.dex,就在这个路径下

重新打包参考了 腾讯云社区的文章,大家可以作为参考,还是想想说一下,反编译是为了让开发者更好的向优秀技术学习,并不是破解别人的apk,加入一些非法的操作,然后再重新打包的。

上一篇 下一篇

猜你喜欢

热点阅读