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 定义主过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968092.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android ndk兼容 64bit so报错

1、报错logcat如下 2025-01-13 11:34:41.963 4687-4687 DEBUG pid-4687 A #01 pc 00000000000063b8 /system/lib64/liblog.so (__android_log_default_aborter16) (BuildId: 467c2038cdfa767245f9280e657fdb85) 2025…

工业路由器物联网应用,智慧环保环境数据监测

在智慧环保环境数据监测中工业路由器能连接各类分散的传感器,实现多源环境数据集中采集,并通过多种通信网络稳定传输至数据中心或云平台。 工作人员借助工业路由器可远程监控设备状态与环境数据,还能远程配置传感器参数。远程控制设置数据阈…

QT修仙笔记 事件大圆满 闹钟大成

学习笔记 牛客刷题 闹钟 时钟显示 通过 QTimer 每秒更新一次 QLCDNumber 显示的当前时间,格式为 hh:mm:ss,实现实时时钟显示。 闹钟设置 使用 QDateTimeEdit 让用户设置闹钟时间,可通过日历选择日期,设置范围为当前时间到未来 …

MapReduce到底是个啥?

在聊 MapReduce 之前不妨先看个例子:假设某短视频平台日活用户大约在7000万左右,若平均每一个用户产生3条行为日志:点赞、转发、收藏;这样就是两亿条行为日志,再假设每条日志大小为100个字节,那么一天就会产…

拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动

拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动 1. 前情: 1TB的硬盘,分了120G作ubuntu22.04。/boot: 300MB, / : 40GB, /home: 75G, 其余作swap area。 2. 一开始按这个教程:对我无效 https://blog.csdn.net/Eric_xkk/article/details/1…

Redis 数据类型 List 列表

列表类型是⽤来存储多个有序的字符串,如下图所⽰,a、b、c、d、e 五个元素从左到右组成了⼀个有序的列表,列表中的每个字符串称为元素(element),⼀个列表最多可以存储 2^32 - 1个元素。在 Redis 中&#xff…

【devops】Macos 轻量化docker解决方案 orbstack | 不用Docker Desktop启动docker服务

一、orbstack OrbStack is the fast, light, and easy way to run Docker containers and Linux machines. It’s a supercharged WSL and Docker Desktop alternative, all in one easy-to-use app. 二、orbstack 的可视化

RabbitMQ消息队列 发送和接受

步骤 1: 安装 RabbitMQ 首先,需要安装 RabbitMQ,并确保它在运行中。 下载erlang语言包OTP。官网地址:Downloads - Erlang/OTP Rabbitmq官网下载地址:Downloading and Installing RabbitMQ — RabbitMQ 安装MQ注意事项&#xf…

2025最新版Node.js下载安装~保姆级教程

1. node中文官网地址:http://nodejs.cn/download/ 2.打开node官网下载压缩包: 根据操作系统不同选择不同版本(win7系统建议安装v12.x) 我这里选择最新版win 64位 3.安装node ①点击对话框中的“Next”,勾选同意后点…

Spring Boot 3.4 中 MockMvcTester 的新特性解析

引言 在 Spring Boot 3.4 版本中,引入了一个全新的 MockMvcTester 类,使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性,分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…

WEB攻防-文件下载文件读取文件删除目录遍历目录穿越

目录 一、文件下载漏洞 1.1 文件下载案例(黑盒角度) 1.2 文件读取案例(黑盒角度) 二、文件删除 三、目录遍历与目录穿越 四、审计分析-文件下载漏洞-XHCMS 五、审计分析-文件读取漏洞-MetInfo-函数搜索 六、审计分析-…

01.Docker 概述

Docker 概述 1. Docker 的主要目标2. 使用Docker 容器化封装应用程序的意义3. 容器和虚拟机技术比较4. 容器和虚拟机表现比较5. Docker 的组成6. Namespace7. Control groups8. 容器管理工具9. docker 的优缺点10. 容器的相关技术 docker 官网: http://www.docker.com 帮助文档…

IDEA中常见问题汇总

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现

代码下载:私信博主回复基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现 《基于蜘蛛蜂优化算法的无人机集群三维路径规划》 摘要 本研究针对无人机集群三维路径规划问题,提出了一种基于蜘蛛蜂优化算法的解决方案。以5个无人机构成的集群为研究对…

路由过滤方法与常用工具

路由过滤 定义:路由器在发布或者接收消息时,可能需要对路由信息进行过滤。 作用:控制路由的传播与生成;节省设备和链路资源消耗,保护网络安全。 举例:学习汇总后的路由,而不学习汇总时的明细路由…

仿 RabbitMQ 实现的简易消息队列

文章目录 项目介绍开放环境第三⽅库介绍ProtobufMuduo库 需求分析核⼼概念实现内容 消息队列系统整体框架服务端模块数据管理模块虚拟机数据管理模块交换路由模块消费者管理模块信道(通信通道)管理模块连接管理模块 客户端模块 公共模块日志类其他工具类…

【天梯赛】L1-104 九宫格(C++)

易忽略的错误&#xff1a;开始习惯性地看到n就以为是n*n数组了&#xff0c;实际上应该是9*9的固定大小数组&#xff0c;查了半天没查出来 题面 L1-104 九宫格 - 团体程序设计天梯赛-练习集 代码实现 #include<bits/stdc.h> using namespace std; //易错&#xff1a;开…

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层 1. 两个元素实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>纯 CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层</titl…

【转载】开源鸿蒙OpenHarmony社区运营报告(2025年1月)

●截至2025年1月31日&#xff0c;开放原子开源鸿蒙&#xff08;OpenAtom OpenHarmony&#xff0c;简称“开源鸿蒙”或“OpenHarmony”&#xff09;社区累计超过8200名贡献者&#xff0c;共63家成员单位&#xff0c;产生51.2万多个PR、2.9万多个Star、10.5万多个Fork、68个SIG。…

03:Spring之Web

一&#xff1a;Spring整合web环境 1&#xff1a;web的三大组件 Servlet&#xff1a;核心组件&#xff0c;负责处理请求和生成响应。 Filter&#xff1a;用于请求和响应的预处理和后处理&#xff0c;增强功能。 Listener&#xff1a;用于监听 Web 应用中的事件&#xff0c;实…