Android反编译

一.尝试对demo进行反编译

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


这个就是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,比如我这里



然后得到相应的jar文件


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

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

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

2.apktool

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

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

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


第一个.bat文件


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

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

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


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

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


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


smali

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


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

重新打包

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

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

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

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

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

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

比如我这里的



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

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

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

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

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

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

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

三.总结

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

你可能感兴趣的:(Android反编译)