玩好.NET高级调试,你也要会写点汇编

news2024/12/28 20:29:36

一:背景

1. 简介

.NET 高级调试要想玩的好,看懂汇编是基本功,但看懂汇编和能写点汇编又完全是两回事,所以有时候看的多,总手痒痒想写一点,在 Windows 平台上搭建汇编环境不是那么容易,大多还是用微软的 MASM + DosBox 搭一个 8086 的环境,这玩意距今快 50 年了。

在以前想快捷的写一点汇编,借助的是 VC 编译器的 __asm 在 C/C++ 代码中内嵌一点,比如下面这样。


int main()
{
	int num = 10;

	__asm {
		mov[num], 20
	}

	printf("num=%d", num);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XPpDzTnO-1670470379736)(https://huangxincheng.oss-cn-hangzhou.aliyuncs.com/img/20221208095947.png)]

便捷是便捷,但只能玩个局部,还是不够爽,所以本篇我们借助 nasm 来搭建一个 32bit 的汇编环境,当然 64bit 也是可以的, nasm 在 Linux 社区中非常有名。

二:搭建 x86 汇编环境

1. 前置基础构件

  1. nasm 下载

nasm 是一个非常有名的汇编器,官方网址:https://nasm.us/ 目前稳定版是 2.15.05

  1. gcc

大家都知道,源代码要变成可执行程序,步骤一般是: asm -> obj -> exe,前半部分由 nasm 负责,后半部分由 gcc 负责, gcc 是 Linux 上的刚需产品,在 Windows 上可以用 MinGW

下载网址:https://sourceforge.net/projects/mingw/files/MinGW

下载完之后,将下图中的 五项 全部勾选上进行安装。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0lKxjozu-1670470379738)(https://huangxincheng.oss-cn-hangzhou.aliyuncs.com/img/20221208102251.png)]

bin, include,lib 全部配到环境变量的 PATH 中,然后打开控制台键入 gcc -v 看一下有没有配好。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2iFOqQjH-1670470379738)(https://huangxincheng.oss-cn-hangzhou.aliyuncs.com/img/20221208102500.png)]


PS C:\Users\Administrator\Desktop> gcc -v
Using built-in specs.
COLLECT_GCC=C:\MinGW\bin\gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --with-gmp=/mingw --with-mpfr --with-mpc=/mingw --with-isl=/mingw --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --enable-libgomp --disable-libvtv --enable-nls
Thread model: win32
gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
PS C:\Users\Administrator\Desktop>

  1. vscode 插件

这里我准备用 vscode 来写汇编代码,主要安装两个插件。

  • The Netwide Assembler (NASM)

这个 nasm 官方提供的 语法高亮 插件。

  • GDB Debug

gdb 已经内嵌到了 gcc 中,方便于 code 调试。

2. vscode 自动化构建

玩过 vscode 的朋友应该知道,自动化构建需要自己写 tasks.json,这里我简单写了一个。


{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "win86",
            "type": "shell",
            "command": "nasm.exe -f win32 -g -F cv8 -l app.lst app.asm; gcc app.obj -o app.exe",
            "problemMatcher": {
                "pattern": {
                    "regexp": "error"
                }
            },
            "group": "build",
            "presentation": {
                "focus": true,
                "panel": "dedicated",
                "reveal": "silent",
                "clear": true
            }
        }
    ]
}

然后就是配置启动 launch.json,代码如下:


{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "gdb",
            "request": "launch",
            "name": "GDB32",
            "program": "${workspaceFolder}/app.exe",
            "stopOnEntry": true,
            "preLaunchTask": "win86"
        },
        {
            "type": "gdb",
            "request": "launch",
            "name": "GDB64",
            "program": "${workspaceFolder}/app.exe",
            "stopOnEntry": true,
            "preLaunchTask": "win64"
        }
    ]
}

到这里基础设施就全部搭建完成了,然后就是写一个简单的汇编程序,实现三个 printf 的打印,代码如下:


extern _printf
SECTION .data

    msg             db      'Hello World!', 0Ah , 0h;
    
    num1            dd       100;
    num1_int_fmt    db      'num1=%d', 0Ah, 0h;

    num2            dq       3.14;
    num2_flt_fmt    db       'num2=%lf', 0Ah, 0h;

SECTION .text

global _main
 
_main:

    push ebp
    mov  ebp , esp 

    ; printf("Hello World\n");
    mov  eax , msg
    push eax 
    call _printf
    add  esp, 4

    ; printf("num1=%d",num1)
    mov  eax , [num1]
    push eax 
    mov  ebx , num1_int_fmt
    push ebx , 
    call _printf
    add  esp , 4

    ; printf("num2=%lf",num2)
    movq    xmm0  , [num2]
    sub     esp   , 0x8
    movsd   [esp] , xmm0
    mov     ebx   , num2_flt_fmt
    push    ebx 
    call    _printf
    add     esp   , 0xc

    mov esp , ebp
    pop ebp 

    ret

输出结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fIp7D9cm-1670470379739)(https://huangxincheng.oss-cn-hangzhou.aliyuncs.com/img/20221208110551.png)]

从上面的代码看,我需要自己协调栈平衡,自己去管理寄存器和内存的使用,真的是太爽了。

二:总结

汇编看多了,总想自己动手试试,如果你也有这种想法,可以搭建一下玩玩,有一点遗憾的是,在 windows 中用 gdb 单步调试汇编目前还没搞定,在 linux 上很轻松,不过也不影响自己学习研究,毕竟可以用强大的 windbg 和 ollydbg 来实现单步调试,对吧!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计SSM佳音大学志愿填报系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Mybatis日志配置(slf4j、log4j、log4j2)

文章目录1. Mybatis日志1.1 日志实现原理1.2 日志实现方式2. SLF4J2.1 slf4j日志级别2.2 日志门面与日志实现2.3 日志门面与日志依赖配置3. LOG4J3.1 日志级别3.2 log4j重要组件3.3 mybatis日志配置log4j3. LOG4J23.1 mybatis配置log4j23.2 log4j2配置文件1. Mybatis日志 1.1 …

elasticsearch集群数据索引迁移自动化脚本

日常维护elasticsearch集群会出现新老集群数据迁移,这里使用的是snapshot api是Elasticsearch用于对数据进行备份和恢复的一组api接口,可以通过snapshot api进行跨集群的数据迁移,原理就是从源ES集群创建数据快照,然后在目标ES集群中进行恢复。 1、新老集群修改集群配置文…

潦草手写体也能轻松识别,快速提取文字不用愁

基于文本识别(OCR)技术的成熟与应用,日常生活中的大部分“印刷体识别”需求都能被满足,替代了人工信息录入与检测等操作,大大降低输入成本。 而对于复杂的手写体识别需求,业界识别质量却参差不齐。大部分手…

【Linux】进程优先级进程切换

索引➡️进程优先级1.什么叫做优先级2.为什么会存在优先级3.看看Linux怎么做的4.查看进程优先级的命令😊进程的一些特性➡️进程切换➡️进程优先级 1.什么叫做优先级 优先级和权限有些区别,权限决定能还是不能,优先级的前提是能&#xff0…

计算机存储器之逻辑地址和物理地址转换详解

文章目录1 概述2 转换2.1 逻辑地址 to 物理地址2.2 物理地址 to 逻辑地址3 扩展3.1 在线进制转换1 概述 #mermaid-svg-zTbJ3rKuirwBssRU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zTbJ3rKuirwBssRU .error-ico…

Zookeeper-全面详解(学习总结---从入门到深化)

目录 Zookeeper概念_集中式到分布式 单机架构 集群架构 什么是分布式 三者区别 Zookeeper概念_CAP定理 分区容错性 一致性 可用性 一致性和可用性的矛盾 Zookeeper概念_什么是Zookeeper 分布式架构 Zookeeper从何而来 Zookeeper介绍 Zookeeper概念_应用场景 数据发布/订阅 实…

vue框架常用的组件库:Element、vant4地址

这些组件库也只能解决UI问题,真正的业务还需要自己去写 pc端:Element:Element - The worlds most popular Vue UI frameworkElement,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.eleme.io…

【成都信息工程大学】2022-807C语言程序设计

(因为考研时间将近,所以没有将其书写的形式展示,这字稍微有点丑,请见谅!!) 算法流程图:先叙述程序设计思想,再画出程序流程图,不需要给出代码。 1.选择排序…

python教程:12种列表常用操作方法

都是基础知识,长久不用就会忘,温故知新,又来学习学习。相信很多人在编程的或者对一些程序处理的思维会用到,比如面试 (有写的不对的地方也请大家指正~ 一、列表定义 列表是一个有序且可更改的集合。在Pyth…

计算机视觉之单发多框检测(Single Shot MultiBox Detector)模型《3》

有了前面两节的背景知识,我们来构造一个目标检测模型,就是来自Wei Liu大神之作的SSD了,有兴趣的可以查阅论文:SSD: Single Shot MultiBox Detector 计算机视觉之目标检测(object detection)《1》https://blog.csdn.net/weixin_41…

[附源码]Python计算机毕业设计Django招聘系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

C#语言实例源码系列-实现图片合成功能

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

关于质量分析

背景 在日常工作过程中,作为测试,我们要及时反思总结历史出现的问题,以便于对日常的工作流程规范以及质量防护措施作出相应的调整作为下属,我们要定期的向上级反馈近期的产品质量情况基于以上的背景,我们需要定期对产…

java简单做一个消费者/生产者案例

首先 我们创建一个包 在包下创建 四个类 首先是奶箱类 milkBox 在业务中充当数据的存储类 参考代码如下 public class milkBox {private int milk;public void put (int milk){this.milk milk;System.out.println("送奶工将第"this.milk"瓶奶放入奶箱");…

华为是如何从0到1打造以项目为中心运作的项目管理体系的?

本文介绍了华为公司打破传统的功能型组织结构,从弱矩阵项目管理向强矩阵转变的历程。 内容包括如何全面铺设项目管理组织,转向“以项目为中心”。同时,通过一系列的政策、标准和规定统一项目管理语言,建设项目管理流程体系。 其…

Servlet与表单数据交互(如文本框、单选按钮、复选框、下拉列表等)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

基于遗传算法解决TSP问题(Matlab代码实现)

目录 1 概述 2 运行结果 3 Matlab代码实现 4 结语 5 参考文献 1 概述 旅行商问题是一个经典的路径规划问题,传统TSP假设客户位置和客户之间旅行时间是固定不变的,而在现实生活中交通状况和客户要求可能会随着时间而改变,为了找到最经济的…

(附源码)ssm教育机构管理系统 毕业设计 010224

ssm教育机构管理系统 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设…

被AI包裹的冬天,智慧供热打破城市供热的“不可能三角”

最近很多城市都迎来了今冬以来的最强寒潮,在拉尼娜事件的影响下,一个格外寒冷的冬天似乎不可避免。而每次降温,有暖气的北方城市就会引来网络上一片艳羡之声。前不久网络上就流传着一个段子“南方人的命也是命,请给南方装暖气 ”&…