好久没有写博客,一直在用自己的印象笔记记录一些问题。2017年了,想重新的把博客写起来。也希望通过这个平台交一些朋友。
什么是反编译?
反编译的定义--计算机软件反向工程(Reverse engineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。
对于Android来说,反编译就是将一个apk转换成相应的资源文件(可能被混淆了)和java代码(可能被混淆了)。这一过程可能是apk->dex->jar->查看代码,也可能是apk->资源文件+smali,也可能直接是apk->查看代码。这个过程就就需要对具体的反编译工具而言了。
反编译工具有什么用?
一个新的强大的库想知道哪些大厂在使用,可以反编译大厂的apk,看看有没有相应的包。
apk发布以后发现有问题,可能某些功能漏了,反编译看看相应的代码是否存在就知道了。
看着别人apk的动画效果好厉害,反编译别人的apk,然后查找相应的代码模仿(很大可能也找不到)。
了解例如apt生成代码的效果,反编译代码就可以看到生成的代码(当然在build/generated/source/apt目录下也可以看到)。
…
反编译工具有哪些?
dex2jar 、jd-gui、jadx 、enjarify 、Apktool
上面的5种反编译相关的工具都是开源的。
- 最开始反编译工具是dex2jar可以将dex转化成jar包,然后可以将jar通过jd-gui来转换。
- 发现这个过程需要两步才能完成,后来直接使用jadx将apk反编译查看代码。
- 使用jd-gui/jadx查看代码的时候,跳转以及查找都比较的慢。就使用enjarify(号称可以反编译出来的类最多)将apk反编译成dex,然后使用jadx将dex反编译成java代码,使用Android Studio查看代码。
- 使用apktool可以反编译出资源文件。
所以现在我的习惯,对于直接给的jar(其它部门的SDK)使用jd-gui。对于不需要去具体看代码的apk使用jadx直接查看。对于可能需要研究的代码,使用enjarify + jadx + Andorid Studio。需要查看资源文件就使用apktool。
一个小的tips,使用adb命令快速的找到当前在那个界面。
adb shell dumpsys window windows | grep -E ‘mCurrentFocus'
更多的adb命令还可以查考awesome-adb
最后反编译不是我们学习的全部,但是了解一点还是对开发有帮助的。