当前位置: 首页 > article >正文

Windows逆向工程入门之汇编开发框架解析

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

环境搭建与配置

Visual Studio配置

X86汇编基础框架

基本程序框架

数据定义与内存访问

过程(函数)定义

汇编框架解析

代码主体解析

完整代码执行

代码逻辑流程

汇编代码段组织


环境搭建与配置

Visual Studio配置

1. 创建新项目:  
   File -> New -> Project -> Empty Project  

2. 配置MASM支持:  
   Project -> Build Customizations -> 勾选masm(.targets)  

3. 添加汇编文件:  
   Solution Explorer -> Add -> New Item -> .asm file

X86汇编基础框架

基本程序框架

.386            
.model flat, stdcall  
option casemap :none  

ExitProcess PROTO STDCALL :DWORD  
MessageBoxA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD  

.const  
    MB_OK    EQU    0  
    NULL     EQU    0  

.data  
    msgText  db    "Hello Assembly!", 0  
    msgTitle db    "Message", 0  

.data?  
    buffer   db    100 dup(?)  
 
.code  
main PROC  

    invoke MessageBoxA, NULL, offset msgText, offset msgTitle, MB_OK  
    invoke ExitProcess, 0  
main ENDP  

end main   

end

数据定义与内存访问

.data  
    ; 基本数据类型  
    byte_var    db    10          ; 8位  
    word_var    dw    1000h       ; 16位  
    dword_var   dd    12345678h   ; 32位  
    qword_var   dq    1234567812345678h  ; 64位  
    
    ; 数组定义  
    byte_array  db    10 dup(0)   ; 10字节数组  
    word_array  dw    5 dup(?)    ; 5个字未初始化  
    
    ; 字符串  
    str1        db    "Hello", 0  ; C风格字符串  
    str2        db    'World', 13, 10, 0  ; 带换行符

过程(函数)定义

.code  

; 标准过程定义  
StandardProc PROC  
    push ebp        ; 保存调用者的栈基址  
    mov ebp, esp    ; 设置新的栈基址  
    
    ; 函数体  
    
    mov esp, ebp    ; 恢复栈指针  
    pop ebp         ; 恢复调用者的栈基址  
    ret            ; 返回  
StandardProc ENDP  

; 带参数的过程  
ParamProc PROC param1:DWORD, param2:DWORD  
    ; 访问参数  
    mov eax, param1  
    mov ebx, param2  
    
    ret  
ParamProc ENDP

汇编框架解析

代码主体解析

.386  
.model flat, stdcall  
option casemap :none
  1. .386:

    • 指定代码适用于 80386 指令集(支持32位操作)。
    • x86结构指令集一般从 80386 开始全面支持32位操作。
  2. .model flat, stdcall:

    • flat: 使用平坦内存模型,所有地址空间共享一个线性内存块(通常用于现代操作系统)。
    • stdcall: 调用约定,参数从右到左压栈,由被调用函数负责清理栈。
  3. option casemap :none:

    • 禁用大小写不敏感的行为(汇编语言默认不区分大小写)。
    • 在 casemap 被禁用后,变量、函数名需大小写完全一致。
ExitProcess PROTO STDCALL :DWORD  
MessageBoxA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD
  1. 函数声明(PROTO):

    • 定义和声明外部函数的接口,告诉编译器如何调用这些函数及其参数类型。
    • ExitProcess: 用于退出当前进程。
      • 参数:
        • DWORD:退出代码。
    • MessageBoxA: 显示一个带标题、内容和按钮的消息框。
      • 参数:
        • DWORD hWnd (父窗口句柄),
        • DWORD lpText (消息内容的地址),
        • DWORD lpCaption (标题内容地址),
        • DWORD uType (按钮类型)。
  2. 调用约定:

    • STDCALL 调用约定,遵循特定的调用与栈清理规则:
      • 参数从右到左入栈。
      • 被调用函数负责栈的清理。
.const  
    MB_OK    EQU    0  
    NULL     EQU    0
  1. const 段:
    • 定义常量,编译时会将常量替换为其对应值。
    • MB_OKMessageBox 按钮类型,0 指定显示一个确认按钮 “确定”。
    • NULL:空指针,表示0值。
.data  
    msgText  db    "Hello Assembly!", 0  
    msgTitle db    "Message", 0
  1. .data 段:
    • 定义已初始化的全局或静态变量,比如字符串。
    • msgText 和 msgTitle:
      • 定义了两个以 NULL 结尾的C风格字符串。
      • db (Define Byte) 表示 1 字节定义,0 表示字符串结束标记。
.data?  
    buffer   db    100 dup(?)
  1. .data? 段:
    • 定义未初始化的全局或静态变量。
    • buffer:
      • 分配固定空间,大小为100字节。
      • dup(?) 表示分配未初始化的空间。
.code  
main PROC
  1. .code 段:
    • 定义程序的代码段,所有指令从这里开始。
  2. main PROC:
    • 定义 main 过程(过程类似函数),它是程序的入口点。
invoke MessageBoxA, NULL, offset msgText, offset msgTitle, MB_OK  
invoke ExitProcess, 0
  1. invoke 指令:

    • 汇编语言的高级指令,用于简化函数调用。
    • invoke 程序会自动处理参数压栈与调用,并根据声明推断函数签名。
  2. 调用 MessageBoxA:

    • 参数:
      • NULL:无父窗口(显示独立消息框)。
      • offset msgTextmsgText 的地址指针,作为消息内容。
      • offset msgTitlemsgTitle 的地址指针,作为标题。
      • MB_OK:设定按钮样式为 “确定”。
  3. 调用 ExitProcess:

    • 参数:
      • 0:进程退出码,表示正常退出。
main ENDP  
end main
  1. ENDP:
    • 结束 main 过程,标志主程序结束。

完整代码执行

代码逻辑流程
  1. 程序从 .code 段的 main 函数开始执行。
  2. 通过 invoke MessageBoxA 显示一个消息框:
    • 内容为 Hello Assembly!
    • 标题为 Message
  3. 消息框关闭后,调用 ExitProcess 退出程序。
汇编代码段组织
段名描述
.386指定指令集架构(支持x86 32位指令)。
.model flat, stdcall指定内存模型为“平坦”、调用约定为“stdcall”。
段名作用示例
.const定义只读常量MB_OK EQU 0
.data定义已初始化的全局变量或数据msgText db "Hello",0(ASCII字符串必须以0结尾)
.data?定义未初始化数据(运行时填充零值)buffer db 100 dup(?)(保留100字节空间)
.code程序代码段main PROC 和 main ENDP 定义主过程

http://www.kler.cn/a/537565.html

相关文章:

  • Docker 部署 GitLab
  • Go 语言环境安装指南
  • 文件上传全详解
  • 除了wps还有什么表格软件可以在上面切换不用单独启动窗口
  • 借助 Cursor 快速实现小程序前端开发
  • 【GitHub】相关工具下载及使用
  • Axios 拦截器实现的原理
  • C++ 23 的栈踪迹库(stacktrace)
  • 深度洞察与精确匹配:基于HAI部署DeepSeekR1的公考岗位推荐与智能分析
  • XY2-100的Verilog实现
  • 阿里云宝塔在线安装步骤
  • DeepSeek底层揭秘——记忆网络与持续学习机制
  • 用户位置与IP属地:二者之间的关联与差异
  • 日志2025.2.8
  • 深度剖析 Redisson 分布式锁:原理、实现与应用实践
  • k8s部署go-fastdfs
  • OSPF基础(3):区域划分
  • Java 的 CopyOnWriteArrayList 和 Collections.synchronizedList 有什么区别?分别有什么优缺点?
  • 【算法】动态规划专题⑧ —— 分组背包问题 python
  • 《qt6+Open3d点云读取》
  • android apk反编译
  • Verilog 语法篇 硬件描述语言
  • redis高级数据结构布隆过滤器
  • 基于ESP32的远程开关灯控制(ESP32+舵机+Android+物联网云平台)
  • 启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全
  • 跨端兼容——请让我的页面展现在电脑、平板、手机上