Windows逆向工程入门之MASM编程深度解析
- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
第一章:MASM程序架构与核心要素
1.1 标准程序框架解析
1.2 数据定义与内存管理
1.3 寻址模式全解
直接寻址
寄存器相对寻址
基址变址寻址
带比例的间接寻址
第二章:逆向工程基础与PE文件精析
2.1 PE文件结构三维透视
2.2 函数调用逆向追踪
典型函数框架
2.3 逆向工程工具链
IDA Pro高级功能
WinDbg实战命令
第三章:进阶逆向技术专题
3.1 反汇编对抗技术
代码混淆手段
反动态分析技术
3.2 异常处理机制逆向
SEH链遍历方法
VEH与SEH对比
第四章:安全编程与防御体系
4.1 缓冲区溢出防护
GS安全机制
DEP/NX保护绕过
4.2 代码完整性验证
哈希校验实现
数字签名验证
第一章:MASM程序架构与核心要素
1.1 标准程序框架解析
.586 ; 指定80386指令集及更高版本
.model flat,stdcall ; 内存模型与调用约定
option casemap:none ; 强制区分大小写
.data ; 初始化数据段
szMsg db 'Hello Reversing!',0
.code ; 代码段入口
main proc
invoke MessageBoxA,0,offset szMsg,0,0
invoke ExitProcess,0
main endp
end main
关键组件说明:
-
内存模型(Memory Model):
flat
模式表示32位线性地址空间,所有段寄存器(CS/DS/ES/SS)指向同一4GB空间 -
调用约定(Calling Convention):
stdcall
参数压栈顺序为从右向左,被调用函数负责栈平衡,典型特征如:
push arg3
→push arg2
→push arg1
→call func
-
混合编程特性:
支持invoke
伪指令实现API调用,自动处理参数压栈和栈平衡
1.2 数据定义与内存管理
数据类型伪指令对照表:
伪指令 | 位宽 | 等价类型 |
---|---|---|
BYTE | 8 | unsigned char |
WORD | 16 | short |
DWORD | 32 | long |
QWORD | 64 | __int64 |
REAL4 | 32 | float |
内存分配高级技巧:
.data
dwArray DWORD 50 DUP(?) ; 200字节未初始化数组
struc _POINT ; 自定义结构体
x DWORD ?
y DWORD ?
ends
pt1 _POINT <100,200> ; 结构体实例化
1.3 寻址模式全解
直接寻址
mov eax, [00401000h] ; 绝对地址访问(需VirtualQuery验证可读性)
寄存器相对寻址
mov ecx, [esi+20h] ; 常用于结构体字段访问
基址变址寻址
mov edx, [ebx+edi*4] ; 数组元素访问(元素大小=4字节)
带比例的间接寻址
lea eax, [ebp-40h] ; 获取局部变量地址
第二章:逆向工程基础与PE文件精析
2.1 PE文件结构三维透视
typedef struct _IMAGE_DOS_HEADER { // DOS头
WORD e_magic; // "MZ"
LONG e_lfanew; // PE头偏移
} IMAGE_DOS_HEADER;
typedef struct _IMAGE_NT_HEADERS { // PE头
DWORD Signature; // "PE\0\0"
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS;
// 关键数据目录项(Index枚举值)
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // 导入表
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // 导出表
逆向分析要点:
-
节区特征识别:
.text
: 可执行代码(常包含OEP).data
: 全局变量/静态数据.rdata
: 导入表/IAT等重要结构
-
RVA转换公式:
文件偏移 = VirtualAddress - VirtualSectionStart + RawDataOffset
2.2 函数调用逆向追踪
典型函数框架
; 函数序言(Prologue)
push ebp
mov ebp, esp
sub esp, 0C0h ; 分配局部变量空间
; 函数尾声(Epilogue)
mov esp, ebp
pop ebp
retn 8 ; 清理8字节参数
栈帧分析技巧:
- 参数定位:
[ebp+8]
为第一个参数地址 - 局部变量:
[ebp-4]
为第一个局部变量 - 返回地址:
[ebp+4]
保存call指令下条地址
2.3 逆向工程工具链
IDA Pro高级功能
- 交叉引用(Xrefs):
Ctrl+X
查看数据/代码引用路径 - 结构体重建:
ALT+Q
快速应用结构模板 - 脚本扩展:IDAPython实现自动化分析
WinDbg实战命令
!peb // 查看进程环境块
lm m kernel32 // 列出模块信息
u 00401000 L5 // 反编译指定地址代码
dt _PEB @$peb // 解析PEB结构
第三章:进阶逆向技术专题
3.1 反汇编对抗技术
代码混淆手段
jz $+5 ; 动态跳转
call $+5 ; 动态计算地址
pop eax ; 获取当前EIP
反动态分析技术
- TLS回调检测:在EP执行前初始化反调试
- NtQueryInformationProcess:检测ProcessDebugPort
- 时间戳检测:RDTSC指令检查执行时间差
3.2 异常处理机制逆向
SEH链遍历方法
assume fs:nothing
mov eax, fs:[0] ; 获取EXCEPTION_REGISTRATION
@@:
cmp eax, -1 ; 链尾检测
je @f
mov ebx, [eax+4] ; 异常处理函数地址
mov eax, [eax] ; 下一节点
jmp @b
VEH与SEH对比
特性 | SEH | VEH |
---|---|---|
作用范围 | 线程级 | 进程级 |
执行顺序 | 最后执行 | 最先执行 |
注册方式 | FS:[0]链 | AddVectoredExceptionHandler |
反调试应用 | 较少 | 常见于高级保护 |
第四章:安全编程与防御体系
4.1 缓冲区溢出防护
GS安全机制
; 典型GS Cookie生成
mov eax, ___security_cookie
xor eax, ebp
mov [ebp-4], eax
DEP/NX保护绕过
- ROP链构造:利用现有代码片段拼接攻击链
- JIT喷射攻击:通过可执行内存区域注入代码
4.2 代码完整性验证
哈希校验实现
mov esi, offset CodeStart
mov edi, offset CodeEnd
sub edi, esi
invoke CalcHash, esi, edi
cmp eax, [dwExpectedHash]
jnz Alarm
数字签名验证
WinVerifyTrust(
hWnd,
&ACTION_VERIFY,
&WinTrustData
);