安卓逆向从0到1学习总结

PS:该文已经首发于公众号信安之路!!!

初识安卓逆向是在2019年的暑假,到现在也快一年了,这一年来有刚从web渗透转来的迷茫,有成功破解了第一个app的喜悦,也有通宵熬夜逆向的心酸,到现在感觉自己成功踏进逆向大门的满足感。原本打算在入门之后弄个安卓逆向教程作为总结,但是吧,写文章教程,各大论坛都有,而且还写得挺好,例如52论坛的<

前置技能

逆向这玩意不是很玄学,不像web渗透那样很玄学(强烈吐槽一波以前我还在做web渗透的时候,挖不出大洞也就算了,全都是一堆反射型的xss,xss到底跟我有多过不去啊),只要你基础够,在舍得掉头发,就能够有产出,下面简单罗列一下我个人认为的安卓逆向所需要的前置技能:

  • 一定程度的安卓正向开发经验
  • *会写简单的脚本,例如python、c

正向开发越熟练,在逆向的过程越容易找到关键点,同时在正向开发的过程中总要了解一下安卓系统的机制吧,这都是后面的无论是脱壳还是写自己的加固代码必要的知识;至于后面的会写简单的脚本,既是为了逆向也是为了能够正向开发,例如脱壳现在的主流方案要么ida动态调试到脱壳点dump下来,要么使用frida编写脚本hook脱壳,再要么编写xposed插件脱壳(ps:脚本小子除外),这些都需要我们自己写脚本的;至于正向开发那就更没得说了,无论是你想实现自己的加固方案还是要做涉及到底层的开发都需要写到so层里面去,而这前提是你的会c或者c++。至于怎么学,我个人建议去网上找文章教程跟着敲代码就可以了,例如菜鸟教程或w3c!!!

基础技能

说是基础,其实真的是基础,别看看起来真的很难的样子,再安卓逆向的世界里这都是要非常熟练的基础能力,我个人总结如下:

  • 熟练使用AndroidKiller、Jeb等工具
  • 了解smali语言,能够将简单的sali语句翻译成java
  • 能够使用AndroidStudio进行java层面的动态调试
  • 了解arm汇编语言
  • 从0到一编写一个so文件
  • 能够配合ida对so成进行动态调试并简单了解ida的使用
  • *配合so层的编写经验实现自己的反调试代码,并一一动手调试过掉这些反调试

我最开始学习这些的时候是大部分跟着52论坛的教我兄弟学逆向教程学的,时间大概两个月左右吧,但有些没有的,例如smali语法,我就去百度搜索和下载官方对应的指令表来学习,学完之后看懂一些简单的语法是没有问题了,还有arm汇编,这个建议去图书馆找本专业书来看,写得比较详细系统,至于其他的,要多动手实践。当然,看雪论坛等这些技术论坛有很多资料,没事就翻一翻,是能够发现惊喜的,有些东西不同时候看是完全不同的,当你在看到能够一下想到原理并知道他下一步要干什么的时候,基本这个知识点你差不多很熟练了,再这个知识点上你也能够被叫声大佬了!!!

进阶技能

在上面基础学完了之后,其实就可以做一些实践了,比如刷一下bugku、攻防世界的题啊,去百度一下一下破解教程,跟着大佬的博客学着破解啊,多练手练着练着就知道一般哪里是逆向的关键点了!!!

然后说起进阶技能吧,就是再基础上开始逆向精彩的地方–加固和脱壳之间的对抗,个人总结要学习、研究的知识点有如下:

  • 了解安卓apk包的架构,能解析apk的各种文件,例如dex、xml文件
  • 了解动态加载的技术
  • 学习安卓第一代壳(落地加载壳)的加固方案然后自己动手实现
  • 学习frida的食用方法,会使用frida编写简单的脱壳机
  • 有碎片时间可以阅读一下安卓源码
  • 学习安卓第二代壳(不落地加载壳)的加固方案有条件就自己实现一下
  • 针对第一代壳和第二代壳的加载点无论是使用动态调试还是hook的方法脱壳修复
  • 了解第三代壳(函数抽取式壳)和第四代壳(vmp)的原理
  • 学会使用或者自己编写针对第三代壳的脱壳机,例如:fart、frida-unpack等等
  • 能自己解析so文件,也就是elf文件,这是后面so层加密加固的前提
  • 有时间可以学习一下unicorn框架,u1s1,这框架是真的舒服,我记得github上已经有基于unicorn的so调用器,名字叫啥忘了
  • 学习so层的一些加密加固方案
  • *然后还要ollvm框架,不得不说,ollvm用来对抗ida的分析那滋味是真的酸爽,可以看一下无名侠大佬还有其他大佬写的利用unicorn进行反混淆的文章,是真的棒

上面这些是关于加固脱壳我的学习路程,因为个人水平有限,上面可能写的不是很好。我个人始终认为,不会自己写加固代码,就不会真正的脱壳,更不要说修复了,其实,大家写的加固方案加载dex点基本都差不多,你会写了,也知道了加载点再哪儿,脱壳点也就一清二楚了。其他的关于怎么学,可以买书也可以百度大佬们的博客,书我觉得姜维大佬的小黄书和非虫大佬的安卓逆向的书很好,其他的知识点就只有百度和去各大论坛去找资料了!!!

其他技能

  • 谷歌百度搜索能力和日志分析,安卓逆向这东西你越学的深,遇见问题一般来说都没有现成的解决方案,有的话多半也是商业加密,基本在网上是搜不到的,多谷歌和进行日志分析可能找不到怎么解决,但能找到哪里出现问题,能找到哪里出现问题离解决问题就只有10%了。
  • 流量抓取姿势,很多人一听流量抓取就以为这是web渗透做的事,其实不然,app是啥,就是个客户端,和浏览器没什么区别,有时候逆向的时候功能点很多找不到逆向点的时候完全可以靠定位流量锁定关键代码的,当然,在各大厂商日益重视流量安全的今天,抓取流量有时候比较麻烦了,例如,高版本的安卓已经不信任个人https证书,想通过https证书抓取流量在高版本有点行不通了,但是,还是可以通过xposed插件、vpn、更换低版本安卓、hook底层发包函数等方式抓取流量,方法很多,这里只是想说明流量很重要在需要联网的app的逆向过程中。
  • *博客书写,写博客不是装逼,不是全写高端的,写博客的本质是总结帮助总结梳理自己的知识体系,写博客只能说仁者见仁智者见智吧!

上面写的只是一小部分,这里挑选的是我认为最重要的部分,总之,我觉得要学好安卓逆向,还需要耐得住寂寞,研究这东西真的需要坚持,覆盖的东西太多了!!!

其实还有很多想要写的,但是删了又加,删了又删,就成这样子了,可能写的不是很好,一边写一边回忆自己这一年走过来的艰辛,心绪不是很好,大致上写出来了我自己的学习路线。

谨以此文总结自己入门安卓逆向的学习,也送给所有对安卓逆向感兴趣的朋友!!!

Original: https://www.cnblogs.com/aWxvdmVseXc0/p/13491434.html
Author: windy_ll
Title: 安卓逆向从0到1学习总结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585620/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • redis 安装和命令

    转自:https://blog.csdn.net/hzlarm/article/details/99432240 在线安装: 查看使用的默认端口: 查看redis服务器的状态: 重…

    Linux 2023年5月28日
    076
  • Shell 脚本是什么?

    一个 Shell 脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell 脚本)来完成这…

    Linux 2023年5月28日
    096
  • 用 shell 脚本做自动化测试

    项目中有一个功能,需要监控本地文件系统的变更,例如文件的增、删、改名、文件数据变动等等。之前只在 windows 上有实现,采用的是 iocp + ReadDirectoryCha…

    Linux 2023年6月6日
    077
  • Git报错 error: cannot spawn more: No such file or directory

    问题原因 error: cannot spawn more: No such file or directory 这个错误意思是不存在more指令,我是windows平台,自然这个…

    Linux 2023年6月6日
    093
  • 006 Linux 命令三剑客之-grep

    01 一起来认识 grep! Linux 命令三剑客,sed、grep、awk。 sed:擅长数据修改。 grep:擅长数据查找定位。 awk:擅长数据切片,数据格式化,功能最复杂…

    Linux 2023年5月27日
    094
  • alloc_pages的实现浅析

    alloc_pages的使用 struct page *alloc_pages(gft_t gfp, unsigned int order) alloc_pages定义于 inux…

    Linux 2023年6月7日
    0100
  • Linux系统编程之匿名管道

    1.进程间通信介绍 1.1 进程通信的基本概念 在之前我们已经学习过进程地址空间。Linux 环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量…

    Linux 2023年6月8日
    098
  • 解决USB在虚拟机不显示问题

    电脑重装了下系统,顺带重新装了vmware,发现虚拟机无法识别USB设备,居然连右下角图标和可识别设备都不显示了。 网上找了很多方法,大多是纷繁复杂,且行不行都无法保证。 我发现一…

    Linux 2023年5月27日
    0113
  • .Net中Aspose组件调试技巧

    | 0.48分钟 | 774.4字符 | 1、引言&背景 2、水印或截断问题解决 3、即时调试的技巧 4、声明与参考资料 | SCscHero | 2022/6/4 PM2…

    Linux 2023年6月13日
    073
  • 大数据——克隆主机并配置集群

    利用VMware的克隆功能,克隆出 hadoop102、 hadoop103、 hadoop104三台主机 克隆完成后,记得修改文件( root用户下) vim /etc/sysc…

    Linux 2023年6月8日
    0232
  • cobbler

    cobbler 1. cobbler简介 2. cobbler服务端部署 cobbler简介 Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速…

    Linux 2023年6月7日
    070
  • 构建自定义镜像并优化dockerfile文件

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    086
  • 【深度学习】PyTorch Dataset类的使用与实例分析

    Dataset类 介绍 当我们得到一个数据集时,Dataset类可以帮我们提取我们需要的数据,我们用子类继承Dataset类,我们先给每个数据一个编号(idx),在后面的神经网络中…

    Linux 2023年6月13日
    087
  • python实现Mysql数据库批量新增数据

    一、批量插入数据的场景 二、插入数据的工具选择 三、选择Python进行批量插入 Python实现批量插入Mysql数据库数据 一、批量插入数据的场景 在进行数据压力时需要进行大数…

    Linux 2023年6月14日
    075
  • 【Example】C++ 接口概念讲解及例子演示

    C++ 和 Java 不同的是,C++ 没有 interface 关键字。对于很多新手来说,C++ 当中接口的概念不容易像 Java 当中那样被理解。 然而接口是面向对象编程当中的…

    Linux 2023年6月13日
    087
  • Mysql数据库服务端的安装

    一般提到Mysql数据库的安装在工作当中是说的安装数据库管理软件的服务端,服务端的安装可以安装在Windows环境,也可以安装在Linux环境。 Windows环境安装:目前安装比…

    Linux 2023年6月14日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球