OD常识及技巧
菜单栏
E 模块
T 线程(挂起与激活)resume恢复线程
B 执行断点
HBP 硬件断点
OD指令
dd 查看dword
db 查看字节集
hw 硬件写入断点
hr 硬件访问断点
快捷键
CTRL + A 分析代码
CTRL + S 查找命令序列
F2 下断和取消
Shift+F2 条件断点
F4 代码执行一次
F7 单步步入(进call)
F8 单步步过(不进call)
条件断点
== 等于
!= 不等于
&& 和
|| 或
汇编指令
mov 赋值
lea 传址
push 入栈
pop 出栈
add 加
sub 减
mul 乘法
div 除法
call 函数
retn 返回
rep 主要用来重复执行指令 详见 REP指令前缀簇
指令:REP MOVS mem8/16/32, m8/16/32
描述:从DS:[(E)SI]中复制(E)CX个字节/字/双字到ES:[(E)DI]
DS:[(E)SI]由于(E)SI寄存器中保存的是源操作数的地址,所以DS:[(E)SI]指的就是该地址保存的值
|
|
断点
内存访问 断在执行之前
内存写入 断在执行之前
硬件访问(CE) 断在执行之后
硬件写入(CE) 断在执行之后
硬件执行 可添加条件断点
OD断点缺点
一次只能断在一个位置
CE则可以把所有相关断点列在一起
OD断点优点
高亮插件,易于追踪
堆栈
esp 栈顶指针 堆栈顶端的刻度
ebp 栈底指针 本层函数的栈底
ebp 不稳定,有时不是栈底,而是普通寄存器
判断方法,看ebp与esp的差距是否很大
如果差距大,则是普通寄存器
堆栈平衡
特性
- esp 不能变化
寄存器
EAX call的返回值
ECX call的参数
找call总结
找call时,需要注意的地方:
-
找call在send上下断,尽量避免被心跳call干扰
-
在我们找call的时候,会有一些其它伴生函数干扰
例如:
- 打怪、打开npc对话框或者寻路call,可能会先触发走路call
- 打坐、释放技能可能会伴随快捷键函数
找到call后,我们还需要对函数的参数、寄存器进行分析。
- 外平栈,看清楚参数的数量,是否和平栈的数值对应。在调用call的时候一定要平栈,否则会崩溃。
- 内平栈,通过retn的数值,来判断参数的数量,并且分析ecx的来源。个别情况下,还需要分析edx和esi等参数的来源。
- 有些函数调用的是虚函数,比如
call eax
或者call [edx+8]
,我们需要去分析call里寄存器的来源。 - 如果我们的参数中需要用到eax,但是eax无法很快的得到结果,这时可以通过调用eax来源的call来获得,前提是分析清楚来源函数的参数和寄存器。调用连call。
带有结构体的函数
- 申请一片内存(可以通过OD插件)
- 在内存中填写结构体里的内容
- 将我们申请的内存地址,push到call中
- 进行调用
无法通过发包函数获得的call
例如:寻路,控件,按键
|
|
|
|
|
|
发包函数
- bp send
- send sendto WSASend
- 重新实现的发包函数 WSPSend
- 线程发包
|
|
控件
控件输入
寻找突破口:
|
|
控件点击
|
|
按键call
|
|
proc断点 (源自 飞郁网络培训 2018-2019 2018.12.22 proc断点分析按键CALL)
插件
IDA
用于查看伪函数代码
对于复杂的结构体、数组、二叉树、链表,更直观。
跳出VM
|
|