入门基础
逆向本质认识
一个函数判断 true or false(破解游戏举例)
游戏脱机,侧重游戏运行时的数据查看(内存数据、协议分析)调试输出查看
协议数据入门
了解数据本质 & 根据服务器下发数据进行的 UI 渲染(界面显示如 VIP8/9)
加解密(哈希算法、对称与非对称算法)
基础环境及工具
Frida(动态 hook 工具)
Unity 调试库
frida-il2cpp-bridge
https://github.com/vfsfitvnm/frida-il2cpp-bridge/wiki/Snippets
frida-il2cpp-bridge 使用指南⭐
Il2CppHookScripts
https://github.com/axhlzy/Il2CppHookScripts/blob/ts/README.zh-CN.md
GameSentry
引擎支持
cocos-js
cocos-lua
Unity il2cpp
基本使用
环境搭建
基于 nodejs 搭建属于自己的 frida 武器库⭐
IDA、Binary Ninja(Native 层分析)
环境搭建
基本使用
插件配置
分析手法
Jadx(Java 层分析)
逆向工程之开发技能点
逆向工程核心是<b><font color="#e74f4c">重构 / 理解开发者的意图</font></b>
开发者之帽:思考 “如果是我,我会如何实现这个功能?会用什么库?会设置怎样的代码结构?”
攻击者之帽:思考 “系统的薄弱环节在哪里?开发者可能忽略了哪些安全边界?我如何利用这个逻辑?”
架构师之帽:思考 “这个模块在整个软件体系中扮演什么角色?它与其他部分如何交互?为什么会这样设计?”
纯经验是在用<b><font color="#e74f4c">已知</font></b>去套<b><font color="#e74f4c">未知</font></b>,一旦超出经验范围,效率就急剧下降<br><br>而开发技能是理解构建事物的规则和蓝图,这让你有能力分析任何基于这些规则构建的系统,无论其外在表现多么新颖<br><br><b><font color="#e74f4c">所以很多底层知识的学习永远都不会过时,上层变化仅仅是封装调用,其核心都是基于底层逻辑来的(AOSP 系统源码、linker 加载解析 ELF、特定引擎的底层执行逻辑 Unity、Cocos2D ...)<br><br><br></font></b>纯靠经验逆向存在效率、深度和天花板的根本性差异。纯经验是归纳法的产物,它在面对已知模式时高效,但在面对未知或创新的设计时,几乎是无效的。这是一种线性努力,回报递减。<br><br>简单理解就是,这个案例跟着别人复现学会了,换个相差不大但又有细微差别的就不行了<br><br>复现案例需要思考为什么,否者只是学会了特定案例的操作方法,而没有掌握方法论<b><font color="#e74f4c"></font></b>
举个栗子🌰
修车工 (纯经验) vs. 汽车工程师 (开发技能)
修车工 (纯经验)
工作方式:靠听、看、闻。听到某种异响,就知道是哪个轴承坏了。他的大脑是一个巨大的 “故障 - 零件” 对应表
局限性:遇到一辆采用全新混合动力系统的车,他的经验库完全失效。他不知道这个新系统的设计原理,只能瞎猜,所以会感觉比较累。他是在<font color="#e74f4c"><b>识别症状</b></font>
1. 听声音、看故障码,知道 “异响 A” 对应换 “零件 B”<br>2. 累计的知识是 if-then 规则的集合<br>3. 面对一辆全新设计的、没见过的发动机,他会束手无策,因为他的经验库里没有匹配项<br>
汽车工程师 (开发技能)
1. 他不只知道换零件,他懂内燃机原理、材料力学、电子控制逻辑<br>2. 他能从第一性原理出发,分析出故障的根本原因,即使是前所未见的问题<br>3. 他能看懂设计蓝图,理解为什么活塞是这个形状,为什么喷油时机是这个参数
工作方式:他懂内燃机原理、懂电路、懂软件控制逻辑。他不只知道换零件,他能看懂设计蓝图
优势:面对新系统,他能从物理和代码的<font color="#e74f4c"><b>第一性原理</b></font>出发,分析出能量如何流动、指令如何传递。他能理解<b><font color="#e74f4c">为什么</font></b>会出问题,甚至能预测潜在的设计缺陷。他是在<b><font color="#e74f4c">理解系统</font></b>
加解密
32 位密文 e9bc0e13a8a16cbb07b175d92a113126
靠经验我猜测它可能是 md5 算法
有开发技能:也能根据算法特征判断它疑似 md5,但为了验证是否是,可以根据算法源码特征值进行进一步确定<br><br>- `0123456789ABCDEF`、`0123456789abcdef`<br>- `1732584193`、`271733879`、`1732584194`、`271733878`<br>- `0x67452301`、`0xefcdab89`、`0x98badcfe`、`0x10325476`<br><br>也能知道为什么这个算法是 32 位密文数据
其实说这么多,做这么多比喻就是想说明开发技能的重要性,如果想走得更远就一定要<b><font color="#e74f4c">知其然,知其所以然(开发技能、方法论)<br></font></b>