0x00 TOC
原理
无混淆无加密无加壳
仅混淆
仅加密
仅加壳
自动化实现
一些软件
参考链接
0x01 原理
首先在逆向领域,有一个是需要区别的。就是反汇编和反编译。
反汇编把程序的原始机器码,翻译成较便于阅读理解的汇编代码。比如IDA、OD等。
反编译,通常是将机器码(汇编语言)转换为高级编程语言。
由于Java、.net这样的基于虚拟机技术的语言都是采用了ByteCode的二进制结构,因此很容易将ByteCode转化为“抽象语法树”(简称AST,《编译原理》这门课中的概念),然后采用反编译器就可以将AST转换为代码了。
详细可以参考乌云上的文章反编译系列教程(上)
0x02 无混淆无加密无加壳
一个Android程序,如果没有进行混淆,加密,加壳等行为时,如果进行反编译的话,是可以逆向到Java源码的。
先通过Dex2Jar软件将classes.dex
转换为jar文件,然后再通过Java反编译工具JD-GUI将jar文件转换成JAVA源文件。
总之这是通过dex转jar,然后再转java源代码的思路。其中dex转jar也可以选择一些其他软件,例如谷歌官方的enjarify。
下载Dex2Jar和Jd-gui的地址:
Dex2Jar:https://github.com/pxb1988/dex2jar/releases
JD-GUI:http://jd.benow.ca/
使用Dex2Jar和Jd-gui的命令:
dex2jar <file0>
//即
./d2j-dex2jar.sh xxx.apk
java -jar jd-gui-x.y.z.jar
//或者是
java -classpath jd-gui-x.y.z.jar org.jd.gui.App
//也可以直接运行客户端
以下即为反汇编出来的结果。
2.APK改之理、APKDB、Android逆向助手、Android Killer之类软件
实际本质上还是通过Dex2jar或者apktool工具的封装。
还有一个Jadx的软件也比较好用。
3.在线反编译网站
地址:http://www.decompileandroid.com/
地址:http://www.ludaima.cn/android.html
只需要上传需要反编译的apk,稍等片刻,即可下载源码。
4.smali和Baksmali以及Smali Viewer
smali是将smali文件转换成dex。
Baksmali和smali相反,将dex转换成smali。
在Quora的一篇问答中,介绍了smali和baksmali的作用。
Smali/Baksmali is an assembler/disassembler for the dex format used by dalvik,
Android's Java VM implementation. The names "Smali" and "Baksmali" are the
Icelandic equivalents of "assembler" and "disassembler"