Ox00 前言

Ox01 逆向基础

数据类型在内存中的结构

  • 1.Vector 的原理
    • 是一个动态数组,每次添加元素时,如果缓冲区不够大会重新生成。
    • 标准模板库中的 vector 对象是 4 个字段,关键字段是第二个,是数据的起始地址,第三个是数据的结束地址。
    1. List 的原理
    • 是一个双向链表。
    • 标准模板库中的 list 对象是三个字段,关键字段是第二个,指向头结点,第三个是链表元素个数。
    1. 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;
};