玩好.NET高级调试,你也要会写点汇编
一:背景
1. 简介
.NET 高级调试要想玩的好,看懂汇编是基本功,但看懂汇编和能写点汇编又完全是两回事,所以有时候看的多,总手痒痒想写一点,在 Windows 平台上搭建汇编环境不是那么容易,大多还是用微软的 MASM + DosBox
搭一个 8086 的环境,这玩意距今快 50 年了。
在以前想快捷的写一点汇编,借助的是 VC 编译器的 __asm
在 C/C++ 代码中内嵌一点,比如下面这样。
int main()
{
int num = 10;
__asm {
mov[num], 20
}
printf("num=%d", num);
}
便捷是便捷,但只能玩个局部,还是不够爽,所以本篇我们借助 nasm
来搭建一个 32bit 的汇编环境,当然 64bit 也是可以的, nasm
在 Linux 社区中非常有名。
二:搭建 x86 汇编环境
1. 前置基础构件
- nasm 下载
nasm 是一个非常有名的汇编器,官方网址:https://nasm.us/
目前稳定版是 2.15.05
。
- gcc
大家都知道,源代码要变成可执行程序,步骤一般是: asm -> obj -> exe
,前半部分由 nasm 负责,后半部分由 gcc 负责, gcc 是 Linux 上的刚需产品,在 Windows 上可以用 MinGW
。
下载网址:https://sourceforge.net/projects/mingw/files/MinGW
下载完之后,将下图中的 五项
全部勾选上进行安装。
把 bin, include,lib
全部配到环境变量的 PATH 中,然后打开控制台键入 gcc -v
看一下有没有配好。
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>
- 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
输出结果如下:
从上面的代码看,我需要自己协调栈平衡,自己去管理寄存器和内存的使用,真的是太爽了。
二:总结
汇编看多了,总想自己动手试试,如果你也有这种想法,可以搭建一下玩玩,有一点遗憾的是,在 windows 中用 gdb 单步调试汇编目前还没搞定,在 linux 上很轻松,不过也不影响自己学习研究,毕竟可以用强大的 windbg 和 ollydbg 来实现单步调试,对吧!
玩好.NET高级调试,你也要会写点汇编的更多相关文章
- [Android Studio 权威教程]断点调试和高级调试
好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...
- ###Android 断点调试和高级调试###
转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...
- Android Stuido中断点调试和高级调试
写一个简单的调试程序 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class M ...
- Linux高级调试与优化——gdb调试命令
番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...
- .NET高级调试系列-Windbg调试入门篇
Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...
- jquery选择器玩得不6啊,只能慢慢写判断了,唉..........................
jquery选择器玩得不6啊,只能慢慢写判断了,唉..........................
- 剖析手写Vue,你也可以手写一个MVVM框架
剖析手写Vue,你也可以手写一个MVVM框架# 邮箱:563995050@qq.com github: https://github.com/xiaoqiuxiong 作者:肖秋雄(eddy) 温馨提 ...
- idea 高级调试技巧
两年前写过一篇关于idea的高级用法,今天再来一篇关于调试方面的技巧讲解: 一.条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值. 参考上图,在断点的位置,右 ...
- Linux高级调试与优化——信号量机制与应用程序崩溃
背景介绍 Linux分为内核态和用户态,用户态通过系统调用(syscall)进入内核态执行. 用户空间的glibc库将Linux内核系统调用封装成GNU C Library库文件(兼容ANSI &am ...
- Visual Studio高级调试技巧
1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持嵌入汇编) _asm 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows ...
随机推荐
- 「Chroot环境」Debian Testing amd64 on arm64
这个是适用于ARM64环境的AMD64 Debian Testing系统.基于FEX转译.这个系统运行在ARM64的手机和电脑上,运行的软件是AMD64(X64)格式.下载链接提供桌面版和基础版.适用 ...
- 关于成本标签管理-基于-Resource Groups & Tag Editor-统计指定Project-所有资源
背景:因我们所有AWS都是使用Project标签作为成本标签的,今天因一个项目决定彻底退役下线 于是决定要完全清理此项目的所有资源,防止继续产生费用~ 首先想到的去通过Project 在ec2 , s ...
- 关于Linux下aws-cli-2版本的安装
AWS CLI 版本 2 是 AWS CLI 的最新主版本,支持所有最新功能.版本 2 中引入的某些功能无法向后兼容版本 1,您必须升级才能访问这些功能. AWS CLI 版本 2 仅可作为捆绑安装程 ...
- python今日分享(内置方法)
目录 一.习题详解 二.数据类型的内置方法理论 三.整型相关操作 四.浮点型相关操作 五.字符串相关操作 六.列表相关操作 今日详解 一.习题详解 1.计算1-100所有数据之和 all_num = ...
- Stanford CoreNLP无法生成实例对象
在服务器上运行Stanford,今日无法启动"StanfordCoreNLP"了,就是运行下面代码一直在运行,不结束,不报错. from stanfordcorenlp impor ...
- Shading-JDBC、ShadingSphere、ShardingProxy 使用详解
ShadingSphere ShardingSphere是一款起源于当当网内部的应用框架,2015年在当当网内部诞生,2016年由主要开发人员张亮带入京东数科,在国内经历了当当网.电信翼支付.京东数 ...
- Linux 下搭建 HBase 环境
Linux 下搭建 HBase 环境 作者:Grey 原文地址: 博客园:Linux 下搭建 HBase 环境 CSDN:Linux 下搭建 HBase 环境 前置工作 首先,需要先完成 Linux ...
- mujoco d4rl 安装问题
最近mujoco免费了,属实爽歪歪,安装d4rl没有以前那么麻烦了(不知为何半年前我安装d4rl时走了那么多弯路) mujoco安装 在 https://mujoco.org/download 上面下 ...
- 题解 CF1011B Planning The Expedition
Solution 考虑 二分 . 首先要确定二分的对象,显然二分天数较为简单. 每次找到的 \(mid\) 需要判断是否能让整队人吃饱,那就调用一个 check() . 对于 check() ,求出每 ...
- 笔记:Debian下为sublime text建立软链接[像vi一样到处使用]
先查询sublime-text安装路径 :~$ dpkg -L sublime-text /. /opt /opt/sublime_text ... /opt/sublime_text/sublime ...