- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
一、Visual Studio 2019 与 MASM 环境搭建
二、汇编程序框架
三、程序指令集与工作模式
四、动态调用与函数声明
五、数据段的三种形式
六、代码段特性
七、程序入口点
在Windows逆向工程的学习过程中,掌握在Visual Studio 2019中的MASM(Microsoft Macro Assembler)汇编语言环境,是深入分析计算机底层原理和开发高效代码的基础。
一、Visual Studio 2019 与 MASM 环境搭建
-
环境配置步骤
-
汇编代码工程结构
二、汇编程序框架
在MASM中,汇编程序遵循特定的框架结构。以下示例演示了一个标准的MASM程序框架:
; 标准程序框架
.386 ; 指定指令集(支持80386及以上指令)
.model flat, stdcall ; 内存模型与调用约定
option casemap:none ; 不区分大小写 .data ; 数据段定义 message db "Hello, World!", 0 .code ; 代码段定义
start: invoke MessageBoxA, NULL, addr message, addr message, MB_OK ; 调用Windows API MessageBoxA invoke ExitProcess, 0 ; 退出当前进程
end start ; 程序入口点
拓展说明:
.386
:启用32位指令支持,使用现代处理器架构。.model flat, stdcall
:指定平面内存模型及调用约定stdcall
。.data
和.code
:区分全局静态数据和执行代码。
三、程序指令集与工作模式
-
指令集:
- x86架构支持常见的指令集:
- 数据传输指令:MOV、PUSH、POP等。
- 算术指令:ADD、SUB、IMUL、IDIV等。
- 逻辑操作:AND、OR、XOR、NOT等。
- 控制流:JMP、CALL、RET、JE、JNE等。
- 在x64模式下,则有扩展寄存器和指令,如RAX、RBX。
- x86架构支持常见的指令集:
-
工作模式:
- 实模式:16位模式,直接访问物理内存,主要用于早期DOS系统。
- 保护模式:32位或64位模式,支持虚拟内存和内存保护,是现代操作系统的主要模式。
- 长模式:64位模式,支持更大的地址空间和更高效的指令集。
拓展知识点:
- SSE/AVX:用于浮点运算和向量运算。
- 系统指令:如
INT
(中断指令)、IN
/OUT
(端口操作)。
四、动态调用与函数声明
-
函数调用的两种方式:
- 静态调用:函数地址在编译时已确定(如直接调用子函数)。
- 动态调用:通过函数指针或加载动态链接库(DLL)来调用函数。
-
声明与调用Windows API:
- 使用
invoke
指令调用API:invoke MessageBoxA, NULL, addr message, NULL, MB_OK
- 使用
stdcall
或cdecl
定义自定义函数。
- 使用
调用约定:
- stdcall:参数从右到左压栈,由被调用者清理栈。
- cdecl:参数从右到左压栈,由调用者清理栈。
五、数据段的三种形式
-
.data
- 定义已初始化的全局静态数据。
- 示例:
.data
szText db "Hello, World!", 0
dwValue dw 1234h
-
.code
- 定义未初始化的变量,可节约程序大小。
- 示例:
.code
main PROC ; 代码逻辑
main ENDP
-
.const
- 用于存储变量不可更改的常量数据。
- 示例:
.const
PI REAL4 3.1415926
六、代码段特性
-
可执行性
- 代码段包含程序的指令,具有可执行权限。
-
只读性
- 代码段通常是只读的,防止程序运行时被修改。
-
地址对齐
- 代码段通常按页对齐,以提高执行效率。
七、程序入口点
-
定义入口点:
- 使用
end
标记程序的入口点,通常是start
标签:end start
- 在Visual Studio中,可指定
.asm
中程序的起始点。
- 使用
-
入口点的作用:
- 指定程序执行的第一条指令。
- 在逆向过程中,识别入口点是关键的一步。
拓展知识点:
- PE文件结构:入口点在PE文件的
AddressOfEntryPoint
字段中指定。 - 跳转表:分析入口点如何跳转到实际程序逻辑。