Android APK反编译

        何曾几时,我很幼稚地认为Android反编译很简单,直到我决定反编译Smarisan OS的天气APP的时候,我才知道,一切远远没有我想的那么简单.

        由于做项目的时候需要用到天气预报,在网上兜了一圈也没发现比较合适好用的天气API,突然间想到了Smartisan OS中有一个天气APP,所以反编译看了一下,它用的是中国天气网的API,我也很幼稚地在中国天气网上下载了个表格填好发送过去,以为能得到Key,结果,一直没有回信,所以决定拉黑了中国天气网... 不扯了。 

        不过,意外地发现了Smarisan OS的天气APP没有混淆代码,从类名以及方法名、变量名都是有意义的名字,而不是abcd这种混淆过的命名。所以好奇了,决定反编译,把代码全部扒出来学习。但是扒的过程才发现,完整反编译非常困难,最后决定放弃了。过程慢慢道来。

         Google上搜索:android反编译。出来的方法基本都是 apktool + dex2jar + jd-gui方法。之前我一直用这种方法。先详细说一下这个方法吧。

         Android APK安装包就是一个把各种资源和代码压缩成zip格式的文件。Apktool扒出来APK资源文件和一堆smali文件. 把APK重命名成zip文件,解压会看到一个dex文件,这个文件是Dalvik虚拟机执行的字节码.反编译的关键就是把dex文件中的Dalvik指令翻译成java代码.我有神器,dex2jar把dex转换成jar,再用jd-gui打开就是反编译后的java代码.dex2jar是国人写的,效果还可以,把代码的结构和部分的代码还原,但是,涉及到逻辑代码,就非常混乱了.

         上面的方法不太可行,所以另找出路.我记得有一本书,叫做《Android软件安全与逆向分析》,但是一直没看。找来看了一下,没错,这就是讲怎么反编译APK的,认真阅读前几章才发现自己有很多知识根本不知道,包括Dalvik虚拟机原理,Dalvik指令,Smali文件等。知道有这些概念后,不断地网上找资料恶补。

        Dalvik的原理和Java虚拟机JVM有很大的区别,Dalvik是指令基于寄存器的,JVM基于堆栈。但是两者的指令很相似,只要有JVM的基础,学习Dalvik易如反掌,不过我一点都不了解JVM指令。了解Dalvik指令包括Dex的格式后,接下来就是Smali文件了,用Apktool反编译出来会发现有很多Smali文件,它们是Dex中的字节码反汇编出来的,Smali并不是一种编程语言,网上找不到具体定义,我的理解是,它只是把Java/Dalvik指令抽象出来,形成更人性化的语法,说白了就是翻译Dalvik指令.这种语法风格来自Jasmin(Jasmin是按照JVM指令设计的).《Android软件安全与逆向分析》中使用’Smali文件’来描述它,非常准确.学习Smali比较困难,因为公开的资料少,一边看这本书和参考Dalvik指令,勉强能看得懂了,不过看到switch,try崩溃了.回头想想,当时用dex2jar,就觉得看到了全部的代码,真的是很可笑.

         基础知识准备好之后,把Smartisan OS中的天气APP反编译,一边看dex2jar反编译的java源码,一边对应看Smali文件代码,两者对应起来翻译.刚开始写一些been类还是挺简单的,直到我遇到了一个变态类--SmartisanViewPager.两千多行源码,一万三四千Smali代码,而且逻辑代码占了多数,我再次崩溃了,能把这个类翻译出来吗? If else,for,while,switch,try已经把我搞晕了,要是遇到了嵌套深点的,就更难翻译了.浏览其他类,还有一个两千多行代码的类,几百行的也有近十个类,这么多代码最少得半个月,而且逻辑代码翻译错了,看不到效果,真的找不出问题在哪里,不可能重新翻译一点吧.这么多时间还不如拿来研究开源的项目,考虑到得不偿失,坚持了三天后还是放弃反编译锤子了.

         那么,这几天的努力不是浪费了吗?其实没有,最少懂得反编译,看得懂Smali文件,可以知道别人的实现思路和如何更好的保护自己的源码,以及优化性能.java中的字符串加号拼接,其实转化成了StringBuilder了,我会乱说吗?

 

      保护源码方法:逻辑代码嵌套得越深就越难理解.多写一些无用的逻辑代码,增加阅读难度.


参考资料:

《Android软件安全与逆向分析》作者丰生强 

关于Dalvik的公开资料都可以在这里找到 http://source.android.com/devices/tech/dalvik/index.html 

Dalvik指令:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

另外不懂的就Google一下咯.


PS: Smarisan OS天气APP似乎是很急赶粗来的.发现一些命名是单词错了.

对于《Android软件安全与逆向分析》一书的评价,我觉得可以打80分,不满意的地方就是居然还花一些篇幅介绍搭建环境,我觉得能看懂这种书肯定会搭建环境了,另外一些显浅的内容也没必要介绍了.有很多地方希望能看到更详细的,可惜,点到为止.

Android APK反编译,布布扣,bubuko.com

Android APK反编译

上一篇:Android-apt


下一篇:微信支付二维码本地测试可以,上传到服务器不显示问题