Android 逆向分析学习路线?
的有关信息介绍如下:
(一路走来的经验之谈,希望能对大家有所帮助)
【第一部分,基础部分】
1,
1.1 Dex文件格式和字节码指令格式学习
通常APP加壳要对DEX文件进行整体或部分的魔改,比如修改文件头,移除魔数特征,抽取指令,隐藏DEx文件等。也会对文件部分内容进行加密,在ART加载类或执行指令时释放还原。所以必须清楚知道DEX的文件格式,字符串,指令,数据怎么存储,进而了解一般加壳加固方案如何修改,隐藏DEX的内容。
此外,要通过阅读ART源码,熟悉ART的DEX加载机制,熟悉脱壳程序常用的脱壳点(HOOK点).
熟悉Smali语法,很多时候,程序经过变态混淆阅读性大大降低,这时候需要通过阅读Smali来分析逻辑。
Samli最好熟悉到可以手写字节码实现功能函数的程度,这时无论怎么变态混淆代码,对你来说都是无用的。
1.2 学习Native部分 SO(ELF)文件格式。
对于Native部分的代码,也就是C、C++编译出来的SO文件,要知道SO文件格式,字符串,数据常量,机器指令存在什么地方。要分别基于SO编译视图结构(Section)和加载视图结构(Program)去学习。特别是关于动态链接相关的链接逻辑,涉及rel,got,plt等section的定义。
学习linker源码,看linker是如何加载so并链接函数的。对于每个so的初始化构造部分,init,initarray,JNI_Onload.三个阶段的逻辑,底层的加固加壳,反调试,反hook等多在这个三个阶段启动。
学习汇编语言:主要是ARM32/64的汇编指令格式。包括算数运算指令,移位指令,寻址指令,逻辑指令,跳转指令等。
要熟悉ARMV8(ARMV7用的少了)架构下的过程调用规范,寄存器使用规范:
2,学习Jadx,ida等反编译工具的使用。
如何使用Jadx-gui分析apk,查找,跳转,调试,查看寄存器,函数调用栈等。
如何使用IDA-pro分析so,查找字符串,跳转函数,交叉引用跟踪,动态调试,查看内存,寄存器,函数调用栈。
3,学习包名,签名的校验规则。
因为修改程序通常会改变包名或签名,要对抗程序对这包名和签名特征的校验。需要掌握一些对抗方法,比如,文件重定向,HOOK系统函数等。
4,学习反混淆。字符串加密方法。
熟悉基本的混淆技术,Proguard规则,R8混淆,自定义变态混淆,字符串加密等。可以自己写脚本实现反混淆或借助第三方工具比如MT管理器。
(基础知识文档汇总:https://github.com/goldenfish689/android-reverse/blob/main/Android%E9%80%86%E5%90%91%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.zip)
【第二部分,进阶部分】
5,反调试,反root,反虚拟机,反hook,反抓包。
6,VMP,OLLVM
关于VMP,可以先看看正常的字节码是如何被解释执行的,在linker源码里找到C-interpreter相关代码阅读,其他VMP都是基于此来定制opcode和对应实现。
VMP开源例子:GitHub - maoabc/nmmp: dex-vm used to protect the android classes.dex file
关于OLLVM,可以先用其混淆自己些的C代码通过OLLVM混淆,然后分析它,看如何混淆的对应关系。重点熟悉控制流平坦化,虚假控制流,指令拆分(膨胀),字符串混淆。
llvm-project:https://github.com/llvm/llvm-project
7,Hook,hook框架。应用内hook(无需root),应用外hook(需root)。
Xposed:GitHub - rovo89/Xposed: The native part of the Xposed framework (mainly the modified app_process binary).
Frida:https://github.com/frida/frida
xHOOK:GitHub - iqiyi/xHook: A PLT hook library for Android native ELF.
PLT-HOOK:GitHub - bytedance/bhook: :fire: ByteHook is an Android PLT hook library which supports armeabi-v7a, arm64-v8a, x86 and x86_64.
Inline-hook: https://github.com/bytedance/android-inline-hook
其它HOOK方案:Dobby,sandhook。另外啊,最好学习一下ptrace系统调用的工作原理。这个对于调试APP和理解进程注入有帮助。
8,学习一些常用的算法:AES,DES,RSA,sha-256,MD5,Base64等。
密码学学习:https://ciphersaw.me/ctf-wiki/crypto/introduction/ (各种加密的算法介绍)
9,学习通讯协议http、https,websocket,socket,熟悉各种数据传输协议gson,xml,probobuf。
学习常用抓包,解析包工具,charles,fiddler,burpsuite,httpcanary等。资料很多,网上自学哈。
10,学习常见业务(逆向大厂APP必须的技能)。
设备环境监测(比如模拟器,ROOT,沙盒,HOOK环境,虚拟机VA);
设备指纹(此算法在账号的注册登录时起到关键作用);
[原创]聊聊大厂设备指纹获取和对抗&设备指纹看着一篇就够了!-Android安全-看雪-安全社区|安全招聘|kanxue.com
[原创]聊聊大厂设备指纹其二&Hunter环境检测思路详解!-Android安全-看雪-安全社区|安全招聘|kanxue.com
[原创]聊聊大厂设备指纹其三&如何在风控对抗这场“猫鼠游戏”中转换角色-Android安全-看雪-安全社区|安全招聘|kanxue.com
[原创]自动化采集Android系统级设备指纹对抗&如何四两拨千斤?-Android安全-看雪-安全社区|安全招聘|kanxue.com
在从事逆向的整个过程,要不断学习积累,加深对Android系统机制的熟悉程度,特别是binder原理,更要熟悉常用的Native、Java系统框架,库函数。



