Ox00 前言
Ox01 逆向基础
数据类型在内存中的结构
- 1.Vector 的原理
- 是一个动态数组,每次添加元素时,如果缓冲区不够大会重新生成。
- 标准模板库中的 vector 对象是 4 个字段,关键字段是第二个,是数据的起始地址,第三个是数据的结束地址。
-
- List 的原理
- 是一个双向链表。
- 标准模板库中的 list 对象是三个字段,关键字段是第二个,指向头结点,第三个是链表元素个数。
-
- map二叉树的遍历
- 前序、中序、后序遍历
Ox02 调用约定
约定的是传参的方向,平衡堆栈者
- 常见的约定有
Cdecl 从右往左依次入栈,调用者平衡堆栈 add esp,0x8
Stdcall 从右往左依次入栈,函数内平衡堆栈 ret 0x8
Thiscall 从右往左依次入栈,函数内平衡堆栈
Fastcall 从右往左依次入栈,函数内平衡堆栈
Passcall 从左往右依次入栈,函数内平衡堆栈
Ox03 逆向分析方法
① 自上而下,单步跟踪
② 自下而上,API 下断栈回溯
③ 字符串分析
④ 源码对比
Ox10 OD快捷键
- 快捷键
- F2 软件断点
- F7 单步步入
- Ctrl+G 打开跳转窗口
- Ctrl+A 分析模块
- F8 单步步过
- Ctrl+F2 重新开始
- Alt+L 显示记录、日志
- Alt+K 打开调用堆栈窗口
- Ctrl+F11 跟踪进入
- Ctrl+F12 跟踪跳过
- Ctrl+T 设置条件
- Ctrl+F9 执行到返回
- F4 执行到鼠标选中位置
- F9 运行
- Ctrl+N 查看当前模块名称,即导入导出信息
- Alt+F9 执行到用户代码
- Alt+B 打开断点列表
- Ctrl+P 补丁
- Alt+C 反汇编、CPU 窗口
- Alt+M 内存窗口
- Alt+E 可执行模块窗口
- Alt+O 调试设置
- ; 注释
- : 标签
- 空格 修改汇编指令
- 回车 选择 CALL 或 jmp,跳转到对应指令
-
- 返回上一步
- Ctrl+左右方向键 可以显示右边内容
- Ctrl+B 查找二进制数据
- Ctrl+F 查找命令
- Ctrl+S 查找命令序列
- Alt+F 打开文件菜单
- F12 暂停
- Alt+F2 关闭
- 1~9 填充指定字节的 nop
- Ctrl+X 复制当前代码地址
- Shift+X 复制选中代码的 opcode,即 16 进制数据
Ox20 IDA快捷键
- 快捷键
- 空格 切换反汇编视图
- ESC 返回上一步
- G 打开跳转窗口
- N 修改名称
- ; 注释
- F5 反编译为伪代码(C 代码)
- H 转换当前数据为 16 进制
- X 在 F5 的伪代码中,选中函数可以查看交叉引用
- F7 调试器中 单步步入
- F8 调试器中 单步步过
- C 转换当前数据为代码
- P 转换当前代码为函数
- D 定义数据,修改当前数据类型
- A 转换当前数据为 ascii 字符串
- Enter 选择 CALL 或 jmp,跳转到对应指令
- Ctrl+X 在反汇编窗口中 选中 XREF,显示交叉引用
- R 转换当前数据为字符
- alt+enter 选择 CALL 或 jmp,跳转到对应指令
- alt+Q 转换某内存为结构体变量
- M 转换数据为枚举常量
- T 转换偏移地址为结构体字段
- Y 设置变量类型
- Alt+T 搜索字符串
- Alt+1~9 显示选项卡窗口
- Ctrl+S 查看区段信息
- Shift+* 转换当前数据为数组
- Alt+M 添加标签
- Ctrl+M 列出所有标签
- Ctrl+Alt+B 列出所有断点
- F4 执行到鼠标选中位置
- Shift+F4 查看所有函数名
- Shift+F12 查看所有字符串
- Shift+F5 查看签名列表
- Ctrl+W 保存
- Delete 在函数窗口,删除函数
- Ctrl+F 在函数窗口,快速查找
- U 转换为未定义数据
- Alt+B 搜索 16 进制数据
- Insert 在结构体、枚举窗口创建对应数据
- F2 在 16 进制窗口中修改数据
Ox30 核心代码定位
- 字符串搜索
- 栈回溯
- MFC按钮点击函数特征
Ox40 核心代码分析
- C++类对象调用分析
- 各类CALL
- STL容器库分析
- vector:内部实现为动态数组
struct MyVector
{
struct MyVector* pSelf;
int* pDataStart;
int* pDataEnd;
int* pBufEnd;
};
- list:内部实现为双向循环链表
struct MyNode
{
struct MyNode* pNext;
struct MyNode* pPrev;
int nData;
};
struct MyList
{
struct MyList* pSelf;
struct MyNode* pRoot;
int nNodeCount;
};
- map: 内部的实现是红黑树(平衡二叉树)
struct MyMapNode
{
struct MyMapNode* pLeft;
struct MyMapNode* pParent;
struct MyMapNode* pRight;
int unknown;
int nkey;
int nValue;
};
struct MyMap
{
struct MyMap* pSelf;
struct MyMapNode* pRoot;
int nNodeCount;
};