您现在的位置是:首页 > 文章详情

Android反编译

日期:2018-04-16点击:526

一.尝试对demo进行反编译

应用打包成APK之后,把后缀名改成zip然后进行解压得到以下目录


img_a76f2ccf65f4b04327b97f6fe5f91f7a.png

这个就是APK的目录
META-INF里面的是签名文件,res里面是资源文件,classes.dex就是我们的java代码编译后的文件

1.查看JAVA代码

既然能拿到classes.dex文件之后,我们就能有办法看到java的代码,这边需要两个工具:

(1)dex2jar 这个工具能将dex文件转换成jar文件
http://sourceforge.net/projects/dex2jar/files/

下载dex2jar的解压包后解压,然后将classes.dex文件拷贝到解压后的目录下,命令行输入d2j-dex2jar classes.dex,比如我这里


img_8e88878cf1e2bd6f07ac2b985a17e5f0.png

然后得到相应的jar文件


img_6286684fd2a0c53f1f99f9095fc0f31d.png

(2)jd-gui这个工具能查看jar文件
官网我下不了,我是在网盘下的。

下载完之后打开exe文件,然后找到路径打开之前转换好的jar文件

img_2b856fa8b0d7ecaa05d974b9fccc73dd.png

这里就能找到我们在AS中写的java代码,当然并不会完全相同,但至少能看得懂。

2.apktool

上面的方法只是为了方便浏览APK中java的代码,但反编译中最主要的工具还是apktool ,它不仅可以帮助浏览资源文件,还能给之前的代码加点料。

下载apktool 工具
https://ibotpeaches.github.io/Apktool/install/

这个工具下载有些麻烦,首先要下载两个文件


img_ed5cab58659e19c70eb78ea3d3e0a2de.png

第一个.bat文件

img_75d09342ec6f1d1f215174b5c4562650.png

它提示是让你点右键保存那个连接就是下载了。
然后是.jar文件,这个要下最新的,我下的时候点到死都点不开,我还以为是要翻墙才能下,这个连接是不太好弄,点开另一个连接
https://ibotpeaches.github.io/Apktool/
然后
img_e2bc45ad0d9922ae8a3b054266a7d709.png

点detalis,在里面再点下载,反正我点Download是死都点不开,如果你像我一样的话点detalis在里面下就行了。注意,这个jar包的名字无论下载下来是什么,都要改成apktool.jar

下好这两个文件之后在命令窗口输入apktool看看能否正常使用,出现个版本号这些信息就说明是能正常使用了。


img_01a537e1b3c1b31de00d378a5357515a.png

然后我照了别人的写法用命令apktool d app-release.apk反编译apk,就能得到一个文件,比如我这边

img_1e1eca2017ae2df9a093afd3515a4a32.png

这个文件里面res就能够查看之前项目中的资源文件,比如我的布局文件


img_83ca0482367ef30b7d5eb8316c1bf923.png

图中的original就是我们之前解压后的签名文件,打开可以看到


img_eaedcd438fbbf7dab7f1b7893449412d.png
smali

需要讲一下的是这里会得到一个smali文件夹,里面就是我们的代码,只不过是.smali格式的而不是.java格式的


img_f9374001f45ef82767cb16b6d9500761.png

什么是smali?smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。

重新打包

我这里修改了xml中一个textview的信息后重新打包看看会有怎么样的结果。

运行命令apktool b app-release -o newtest.apk
然后就会在文件夹下得到一个新的apk文件

img_35dfae1d4a6da8c78f2213e7fa499b23.png

然后把apk传到手机安装,发现会出现这样的效果

img_afe3c78334514ca71ab73cce4fa568df.png

很明显能看出安装失败的原因是没有证书,我特意展示这一步就是为了说明我们打包时的证书其实是有用的,就算别人能拿到我们的apk,没有签名证书,它也做不了什么。

好了,假如它通过某种方法拿到了证书(我这里直接对这个apk进行证书签名)
关于对apk进行签名,我记得好像我以前整理过,但是我不是写在简书,忘记写哪了,所以就只能重新看看了。

把签名文件拷贝到当前文件夹,然后输入以下命令
jarsgner-verbose-keystore[keystorePath]-singnedjar [apkOut] [apkln] [alias]

比如我这里的


img_886007a4f029a097e0b07027ce0a37a6.png

img_e86bee4b54ba547461ef44506c08d809.png

我就输入
jarsgner -verbose -keystore onestore.jks -singnedjar new.apk newtest.apk KylinReverse

这样就能给未签名的apk进行签名,然后我们在安装这个apk,打开后对比结果

img_eb676dd871561441b46d14a2e2307ba9.png
img_f5617353443608169412e0c81e8bc9ba.png

发现对比之前的textview,目前显示的内容是我用apktool改过之后的内容。

二.尝试对别人的APP进行反编译

从上面也能看出就算你能正常反编译到别人的项目,你没有签名文件,还是没有办法进行重新打包,那我们反编译的目的是为了什么,既然不能往别人的代码里加点料,那么看看别人的代码总能提高一下自己的水平吧,比如(反编译别人的APK是不对了,这里我先道歉)

目录就不展示了,直接浏览java代码看看会是怎样的情况

img_b1857ca12a794d1800e0789b3e1c2952.png

我试了几次发现这里还是没办法打开文件,不知道他那边是有做加固的原因还是我这边操作出了什么问题,本来还想看一下混淆之后是什么样子的,现在只能到讲混淆的时候再看效果了。

三.总结

探索反编译的整个过程最主要的是为了之后总结混淆和加固的时候方便些,那么至于反编译有什么意义,我也不太清楚,没怎么接触到。如果你说是为了恶意改别人的代码,对不起,道不同不相为谋。如果说是为了看别人的代码,其实也不太有必要,比如一些大厂的技术别人都写好文章公开出来给你了,比如阿里、美团这些,再则一些写得好的项目别人肯定会放到gayhub上,还附上说明给你,所以说反编译是为了去看代码,有时候可能确实需要但是也很绕弯子。所以我觉得这东西没啥好深入去玩的,暂时简单了解一下就行,真正用到的时候再详细去看。文章大部分都是参考https://blog.csdn.net/guolin_blog/article/details/49738023

原文链接:https://yq.aliyun.com/articles/667384
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章