Android APK反编译

深入探讨Android应用反编译与Smali文件解析
文章详细记录了一次尝试反编译Smartisan OS天气APP的复杂经历,从使用常见工具遇到瓶颈,到深入学习Dalvik虚拟机原理、Smali文件结构,最终认识到反编译完整代码的困难与价值。分享了反编译过程中的学习成果,包括理解Smali文件的重要性、源码保护策略等,并强调了反编译过程中获取的知识对理解他人代码实现、优化性能的益处。

        何曾几时,我很幼稚地认为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分,不满意的地方就是居然还花一些篇幅介绍搭建环境,我觉得能看懂这种书肯定会搭建环境了,另外一些显浅的内容也没必要介绍了.有很多地方希望能看到更详细的,可惜,点到为止.

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值