- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
一、x64架构核心变革与寄存器体系
1. x64架构特性升级
2. 寄存器访问模式
二、x64调用约定深度解析
1. Microsoft x64调用约定
2. 函数调用实例分析
3. 复杂参数处理
三、混合编程与ABI规范
1. 汇编与C++交互实践
四、逆向工程核心技术实战
1. 函数帧栈分析
一、x64架构核心变革与寄存器体系
1. x64架构特性升级
- 地址空间扩展:
- 虚拟地址宽度64位(实际使用低48位)
- 内存布局划分:
0x00000000`00000000 - 0x00007FFF`FFFFFFFF // 用户空间 0xFFFF8000`00000000 - 0xFFFFFFFF`FFFFFFFF // 内核空间
- 寄存器扩展:
寄存器类别 x86(32位) x64扩展 通用寄存器 EAX, EBX等8个 RAX-R15(新增R8-R15) 指令指针 EIP RIP 标志寄存器 EFLAGS RFLAGS
2. 寄存器访问模式
mov rax, 1234ABCDh ; 64位访问
mov eax, 56789ABCDh ; 32位访问(自动清零高32位)
mov ax, 0BEEFh ; 16位访问
mov al, 0FFh ; 8位访问(低字节)
二、x64调用约定深度解析
1. Microsoft x64调用约定
- 参数传递规则:
参数1 → RCX 参数2 → RDX 参数3 → R8 参数4 → R9 后续参数 → 从右向左压栈
- 调用者职责:
- 分配至少32字节影子空间
- 保证栈16字节对齐(
RSP & 0xF == 0
)
2. 函数调用实例分析
C++函数声明:
extern "C" int64_t asm_Add(int a, int b);
MASM实现:
asm_Add proc; 影子空间自动分配(编译器处理)add rcx, rdx ; a + bmov rax, rcx ; 返回值存入RAXret
asm_Add endp
逆向特征识别:
00007FF7A1B21000 48 8B C1 mov rax, rcx
00007FF7A1B21003 48 03 C2 add rax, rdx
00007FF7A1B21006 C3 ret
3. 复杂参数处理
6参数函数调用:
int _fastcall Fun(int a, int b, int c, int d, int e, int f);
汇编调用逻辑:
mov r9d, 4 ; 参数4 → R9
mov r8d, 3 ; 参数3 → R8
mov edx, 2 ; 参数2 → EDX
mov ecx, 1 ; 参数1 → ECX
push 6 ; 参数6压栈(从右向左)
push 5 ; 参数5压栈
call Fun
add rsp, 16 ; 清理栈参数
三、混合编程与ABI规范
1. 汇编与C++交互实践
外部函数声明:
EXTERN Fun:proc ; 声明C++函数
EXTERN printf:proc ; 声明标准库函数
跨语言调用示例:
call Fun ; 调用C++函数
lea rcx, formatStr ; 参数1 → RCX
lea rdx, message ; 参数2 → RDX
call printf ; 调用printf
四、逆向工程核心技术实战
1. 函数帧栈分析
典型栈帧结构:
RBP+0x20 → 影子空间(32字节)
RBP+0x28 → 返回地址
RBP+0x30 → 保存的RBP
RBP+0x38 → 局部变量
栈操作逆向特征:
00007FF7CFA4BA94 48 81 EC 28 01 00 00 sub rsp, 128h ; 分配栈空间
00007FF7CFA4BA9B 48 8D 6C 24 20 lea rbp, [rsp+20h] ; 建立栈帧