原本打算在入门之后弄个安卓逆向教程作为总结,但是吧,写文章教程,各大论坛都有,而且还写得挺好,例如 52 论坛的 《教我兄弟学逆向》教程,自己再去写就没多大意思了;做视频教程吧,因为个人原因,没有那么多时间去录制视频和剪辑视频。
谨以此文总结我的逆向路程以及送给想要学习安卓逆向的新人!!!
前置技能
逆向这玩意不是很玄学,不像 web 渗透那样很玄学(强烈吐槽一波以前我还在做 web 渗透的时候,挖不出大洞也就算了,全都是一堆反射型的 xss,xss 到底跟我有多过不去啊),只要你基础够,在舍得掉头发,就能够有产出,下面简单罗列一下我个人认为的安卓逆向所需要的前置技能:
1、一定程度的安卓正向开发经验
2、会写简单的脚本,例如 python、c
正向开发越熟练,在逆向的过程越容易找到关键点,同时在正向开发的过程中总要了解一下安卓系统的机制吧,这都是后面的无论是脱壳还是写自己的加固代码必要的知识;至于后面的会写简单的脚本,既是为了逆向也是为了能够正向开发,例如脱壳现在的主流方案要么 ida 动态调试到脱壳点 dump 下来,要么使用 frida 编写脚本 hook 脱壳,再要么编写 xposed 插件脱壳(ps:脚本小子除外),这些都需要我们自己写脚本的;至于正向开发那就更没得说了,无论是你想实现自己的加固方案还是要做涉及到底层的开发都需要写到 so 层里面去,而这前提是你的会 c 或者 c 。
至于怎么学,我个人建议去网上找文章教程跟着敲代码就可以了,例如菜鸟教程或 w3c!!!
基础技能
说是基础,其实真的是基础,别看看起来真的很难的样子,在安卓逆向的世界里这都是要非常熟练的基础能力,我个人总结如下:
1、熟练使用 AndroidKiller、Jeb 等工具
2、了解 smali 语言,能够将简单的 sali 语句翻译成 java
3、能够使用 AndroidStudio 进行 java 层面的动态调试
4、了解 arm 汇编语言
5、从 0 到 1 编写一个 so 文件
6、能够配合 ida 对 so 进行动态调试并简单了解 ida 的使用
7、配合 so 层的编写经验实现自己的反调试代码,并一一动手调试过掉这些反调试
我最开始学习这些的时候是大部分跟着 52 论坛的教我兄弟学逆向教程学的,时间大概两个月左右吧,但有些没有的,例如 smali 语法,我就去百度搜索和下载官方对应的指令表来学习,学完之后看懂一些简单的语法是没有问题了,还有 arm 汇编,这个建议去图书馆找本专业书来看,写得比较详细系统,至于其他的,要多动手实践。
当然,看雪论坛等这些技术论坛有很多资料,没事就翻一翻,是能够发现惊喜的,有些东西不同时候看是完全不同的,当你在看到能够一下想到原理并知道他下一步要干什么的时候,基本这个知识点你差不多很熟练了,在这个知识点上你也能够被叫声大佬了!!!
进阶技能
在上面基础学完了之后,其实就可以做一些实践了,比如刷一下 bugku、攻防世界的题啊,去百度一下破解教程,跟着大佬的博客学习破解,多练手,练着练着就知道一般哪里是逆向的关键点了!!!
然后说起进阶技能吧,就是在基础技能之上开始进入逆向精彩的地方--加固和脱壳之间的对抗,个人总结要学习、研究的知识点如下:
1、了解安卓 apk 包的架构,能解析 apk 的各种文件,例如 dex、xml 文件
2、了解动态加载的技术
3、学习安卓第一代壳(落地加载壳)的加固方案然后自己动手实现
4、学习 frida 的使用方法,会使用 frida 编写简单的脱壳机
5、有碎片时间可以阅读一下安卓源码
6、学习安卓第二代壳(不落地加载壳)的加固方案有条件就自己实现一下
7、针对第一代壳和第二代壳的加载点无论是使用动态调试还是 hook 的方法脱壳修复
8、了解第三代壳(函数抽取式壳)和第四代壳 (vmp) 的原理
9、学会使用或者自己编写针对第三代壳的脱壳机,例如: fart、frida-unpack 等等
10、能自己解析 so 文件,也就是 elf 文件,这是后面 so 层加密加固的前提
11、有时间可以学习一下 unicorn 框架,u1s1,这框架是真的舒服,我记得 github 上已经有基于 unicorn 的 so 调用器,名字叫啥忘了
12、学习 so 层的一些加密加固方案
13、然后还要 ollvm 框架,不得不说, ollvm 用来对抗 ida 的分析那滋味是真的酸爽,可以看一下无名侠大佬还有其他大佬写的利用 unicorn 进行反混淆的文章,是真的棒
上面这些是关于加固脱壳我的学习路程,因为个人水平有限,上面可能写的不是很好。我个人始终认为,不会自己写加固代码,就不会真正的脱壳,更不要说修复了,
其实,大家写的加固方案加载 dex 点基本都差不多,你会写了,也知道了加载点在哪儿,脱壳点也就一清二楚了。其他的关于怎么学,可以买书也可以百度大佬们的博客,书我觉得姜维大佬的小黄书和非虫大佬的安卓逆向的书很好,其他的知识点就只有百度和去各大论坛去找资料了!!!
其他技能
当然,除了上面这些跟安卓逆向一看就有直接联系的知识以外,还有很多看似和逆向没那么多的技能,这些看似不重要,但我觉得这些一点都不比加固脱壳的技术的重要性差,例如:
1、谷歌百度搜索能力和日志分析,安卓逆向这东西你越学的深,遇见问题一般来说都没有现成的解决方案,有的话多半也是商业加密,基本在网上是搜不到的,多谷歌和进行日志分析可能找不到怎么解决,但能找到哪里出现问题,能找到哪里出现问题离解决问题就只有 10% 了。
2、流量抓取姿势,很多人一听流量抓取就以为这是 web 渗透做的事,其实不然,app 是啥,就是个客户端,和浏览器没什么区别,有时候逆向的时候功能点很多找不到逆向点的时候完全可以靠定位流量锁定关键代码的,当然,在各大厂商日益重视流量安全的今天,抓取流量有时候比较麻烦了,例如,高版本的安卓已经不信任个人 https 证书,想通过 https 证书抓取流量在高版本有点行不通了,但是,还是可以通过 xposed 插件、vpn、更换低版本安卓、hook 底层发包函数等方式抓取流量,方法很多,这里只是想说明流量很重要在需要联网的 app 的逆向过程中。
3、博客书写,写博客不是装逼,不是全写高端的,写博客的本质是总结帮助总结梳理自己的知识体系,写博客只能说仁者见仁智者见智吧!
上面写的只是一小部分,这里挑选的是我认为最重要的部分,总之,我觉得要学好安卓逆向,还需要耐得住寂寞,研究这东西真的需要坚持,覆盖的东西太多了!!!
后序
其实还有很多想要写的,但是删了又加,删了又删,就成这样子了,可能写的不是很好,一边写一边回忆自己这一年走过来的艰辛,心绪不是很好,大致上写出来了我自己的学习路线。
谨以此文总结自己入门安卓逆向的学习,也送给所有对安卓逆向感兴趣的朋友!!!