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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
算法题丨Next Permutation
描述 Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replacement must be in-place, do not allocate extra memory. 示例 Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 算法分析 难度:中分析:这里需要跟大家介绍一下相关的几个概念: ...
- 下一篇
【Java】归并排序算法
归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序 归并排序算法稳定,数组需要O(n)的额外空间,链表需要O(log(n))的额外空间,时间复杂度为O(nlog(n)),算法不是自适应的,不需要对数据的随机读取。 工作原理 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。 设定两个指针,最初位置分别为两个已经排序序列的起始位置。 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。 重复步骤3直到某一指针达到序列尾。 将另一序列剩下的所有元素直接复制到合并序列尾。 代码 public class MergeSortTest { public static void main(String[] args) { //测试数据 int A[] = { 1, 6, 4, 5, 2, 9, 7, 2...
相关文章
文章评论
共有0条评论来说两句吧...