在接下来几篇文章里,我们将跟小雅一起学习Smali动态调试,
这可比之前的静态分析要省时喔。
01
动态分析方法
静态分析反编译代码往往是逆向分析的第一步,在对代码逻辑大致了解后,我们就可以使用动态分析的方法验证猜想、加速分析和实现破解。
Android 动态分析
泛指一切需要运行应用才能实现的分析技术
Android动态分析の常用方法
“ 近年来,依托于优雅便捷的Frida框架,很多人初学逆向就开始玩FRIDA HOOK,上手之后都会惊喜于它的简单和强大,几行JS代码就抓到了入参和返回值,甚至直接嗅探到了关键代码,因此感觉不学Smali也可以轻松完成逆向,那么多一事不如少一事,不学Smali也罢。
我认为这是不妥当的,了解和学习Smali可以帮助加深对Android逆向工程的的理解,不论是Smali插桩还是Apk重签名,都是很有价值的知识,如果我们想在逆向之路上走的更长更远,就应该体系化的汲取知识,切忌浮躁和跃进。除此之外,Smali动态调试是一种通用的、常规化的动态分析技术,它和Hook技术在逆向中互相补充,不能重Hook而轻Smali调试,至少在目前看来,这个技术还没有过时。
02
Smali
通俗的来讲,Smali代码是DEX文件反汇编的结果,学习Smali就是学习其出处、语法和寄存器的过程。
DEX
原生Android应用是由Java/Kotlin语言写的,那么从Java源码到成为一个APK文件,其中经过了非常复杂繁多的步骤,我们这里只关注代码的编译执行过程。
Android程序
Android平台上主要使用Java语言来开发程序,但Android上的程序运行机制和标准的Java程序并不一样。因为手机系统的内存和处理器性能较差。
为了解决该问题,以及摆脱和Java母公司的版权纠纷,Google开发了Dalvik虚拟机,Android程序就运行在其上。
03
Java代码从编写到执行
✔ 编写Java代码。
✔ 所有的Java代码通过Java编译器(javac)编译成java字节码,即.class文件。
✔ Java字节码在Java虚拟机上被解释成机器语言后,程序执行。
“ 到目前为止,我们看不到DEX的影子,那就更别提什么Smali了,显然DEX是Android中独有的文件格式,请看下文:
Android中的Java代码从编写到执行
✔ 编写Java代码。
✔ 所有的Java代码通过Java编译器(javac)编译成java字节码,即.class文件。
✔ Java字节码通过Android的dx工具转换为Dalvik字节码,即.dex文件。
✔ Dalvik字节码在Dalvik虚拟机上运行。
“ 我们终于知道DEX的出处了,我们可以瞧一瞧Apk中的DEX文件。
Apkの内部结构
Apk实际上是一种特殊的压缩包,我们可以直接通过360压缩或者别的压缩工具打开。我们罗列和陈述一下展开后的文件结构,需要注意的是,为了满足自身的架构和设计,几乎所有应用的文件结构都会比我们罗列出来的多一些东西,但我们罗列的七部分是固定不变的基础。
“ 我们使用Android逆向助手反编译APK得到Smali代码,它集成了Apktool等一系列工具并实现了可视化拖拽操作。如果你喜欢命令行操作,可以搜索Apktool,如果你使用Mac电脑,可以下载这个工具,界面和操作几乎和windows中一样https://github.com/Jermic/Android-Crack-Tool 。
我演示了Windows下的操作,工具放在了网盘里,也可以自行搜索下载。
以smali开头的文件夹里存放的就是层层叠叠的smali代码,你可能会困惑为什么有两个smali文件夹,这是因为有两个dex文件,那为什么java源码编译和打包后变成两个了Davlik字节码文件呢?一个不好吗?这就涉及到DEX的分包问题了,我之后会提到。
用文本编辑器打开smali文件夹中的众多Smali文件
“ 乍看会有些陌生和恐慌,但不用担心,有非常好的教程和工具可以帮助我们学习Smali语法,除此之外也可以在群里讨论和交流Smali语法。
04
Smali语法学习
1、工具
我们可以使用Java和Smali互转工具来验证与学习Smail语法,工具已放在上一篇百度云中,叫做J2S2J1。
2、教程
我本想自己写一篇完整的教程,但无意中发现了一篇内容、表述、排版均优的教程,附上链接,大家只需要配合上述工具,就可以快速入门Smali语法。https://juejin.im/entry/579ef6e37db2a2005a6350d8
今日份Smali语法介绍和学习到此结束,
小雅会了,你学会了吗?
明日内容:学习Smali动态调试
———— / END / ————
文字:Lilac
排版:小雅
每早九点,
每天一更。