windbg-应用层实时调试
调试符号
windbg使用一个或多个目录来存放符号条件,并使用环境变量_NT_SYMBOL_PATH来指向这些环境变量的位置,
对操作系统内部模块的符号文件,一般用http://msdl.microsoft.com/download/symbols
配置如下:
SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols
ld命令:从符号文件目录或者符号服务器中加载符号
lm命令:观察符号模块的文件情况 或者单机“Debug" -> "Modules"选项
符号的表示:
表示方法为”模块名称!符号名称“,操作系统内核的表示为 "nt!符号名称"
符号查找功能:模块名可以使用模糊搜索
X [Options] Modules!Symbol
有符号文件的情况下,windbg可以调试源码,Ctrl+P键,在窗口中指定源文件的代码路径,多个路径使用分号相隔
调试过程 (应用层实时调试)
开始调试时,默认停留在ntdll中的系统断点处,不会直接停留再程序的入口处,可以在命令窗口输入 ":g@$exentry"转到程序入口处
单步相关指令:
命令 | 快捷键 | 功能 |
t | F8 或 F11 | 追踪执行,遇到call指令进去 |
p | F10 | 单步执行,遇到call指令不跳进去 |
g | F5 | 运行程序 |
pa 地址 | 单步到指定地址,不进入call指令 | |
ta地址 | 追踪到指定地址,进入call指令 | |
pc [count] | 单步执行到下一个call指令调用,count参数用于指定call指令的个数 | |
tc [count] | 追踪执行到下一个call指令,遇到call指令跳进去 | |
tb [count] | 追踪执行到吓一跳分支指令,遇到call指令时跳进去,只用于内核调试 | |
pt | 单步执行到下一条call返回指令 | |
tt | 追踪执行下一条call返回指令,遇到call指令时跳进去 | |
ph | 单步执行到下一条分支指令 | |
th | 追踪执行到下一条分支指令,遇到call指令时跳进去 | |
wt | 自动追踪函数执行过程 |
断点指令
1、软件断点:bp、bu、bm
bp是最常用的,其格式如下
bp [ID] [Options] [Address [Passes]] ["CommandString"]
ID:指定断点ID,可不指定,内核调试限制32个断点,用户模式不限制
Options:可不指定:
/I:中断后自动删除该断点,即一次性断点
/c:指定最大调用深度,大于这个深度则断点不工作
/C:指定最小调用深度
Adress:地址或者符号,例如MesssageBoxW
Passes:忽略中断的次数,可不指定
CommondString:当中断时执行指令,用双引号包裹起来,多个指令用分号分隔
bu命令对某个符号下断点,例如"bu kernel32!GetVersion",bu命令设置的断点是和符号关联的,如果符号的地址变了,断点会保持与原符号的关联
bm命令设置通配符的断点,可以一次创建多个断点,例如对模块中所有 print函数开头的函数设置断点:"bm msvcr80!print*"
2、硬件断点
硬件断点可以实现例如IO访问的的断点,格式如下:
ba [ID] Access Size [Options] [Address] [Passess] ["CommandString"]
Access:指定出发断点的访问防止
e:在读取或执行指令时出发断点
r:在读取数据时出发断点
w:在写入数据时触发断点
i:在执行IO时触发断点
Size:访问的长度。在x86系统中其值可以为1、2、4,代表一字节、字、双字,x64系统中多了一个8,代表四字节访问。
3、条件断点
软件断点和硬件断点都支持条件断点,这两条命令是等价的。
bp | bu | ba _Address "j (Condition) 'OptionalCommands'; 'gc' "
bp | bu | ba _Address ".if (Condition) 'OptionalCommands'; .else 'gc' "
例如 , 当GetVersion被调用是检测eax寄存器,如果其值等于0x12ffc4就中断,否则使用指令gc继续。
bp kernel32!GetVersion ".if(@eax=0x12ffc4){} .else{gc}"
在内核态下,eax高位会补齐,会变为0xffffffffc012ffc4,这时可以用&操作对高位清零
bp kernel32!GetVersion ".if(@eax & 0x0`ffffffff)=0xc012ffc4{} .else{gc}"
在不中断进程的情况下,打印所有的CreateFileA函数调用,代码如下
bp kernel32!CreateFileA ".echo; .printf\"CreateFileA(%ma,%p,%p), ret=\",poi(esp+4),dwo(esp+8),dwo(esp+c);gu.printf\"%N\",eax;.echo;g"
poi的作用是取这个地址上的值,dwo用于从(esp+8)地址中取8个字节。
4、管理断点
bl命令可以列出当前的断点,bc命令、bd命令和be命令分别用于删除、禁用、启用断点,断点号可以用*通配符匹配。例如:
bd 1-3,4 //禁止1、2、3、4号断点
bc * //删除所有断点
栈窗口
call指令会将函数的返回地址记录在栈中,所以可通过遍历栈帧来追溯函数的调用过程。使用k[b|p|P|v|d] 命令可以查看栈回溯(显示的是一定数量的栈帧),第二个字母大小写敏感。

00行描述的是当前中断所在的函数(call),
01行描述的是调用00行中函数的上一级函数。
第一列是栈帧的基地址,因为x86系统用EBP寄存器来记录栈帧的基地址,x64用
第二列是函数的返回地址,这个地址是调用本行函数的那条call指令的下一条指令的地址
第三列是函数名及执行位置
kb命令只用于显示放在栈上的前三个参数,前两列与最后一列的内容跟上面一样。中间三列是子函数的参数,不管函数的参数是多少,这里只显示三个。

kb命令可以携带参数,例如”kb 2“,即显示上面两层调用堆栈。
kp名可以把参数和参数值以函数原型的形式显示出来,包括参数类型、名字、取值(必须有符号)
kv命令可以在kb命令的基础上增加帧指针省略信息和调用约定的显示
kd命令用于列出栈中的数据
内存命令
1、查看内存
d命令用于显示指定地址的内存数据,格式如下
d[类型] [地址范围]
d命令有d、da、db、dc、dd、dD、df、dp、dq、du、dw、dW、dyb、dyd、ds、dS等。
dw表示双字节形式
dd表示4字节形式
dq表示8字节形式
df表示4字节单精度浮点数格式
dD表示8字节双精度浮点数格式
dp表示指针大小格式,在32位系统下为4字节,在64位系统下为8字节。
地址范围可以L(l)参数设置,例如 "dd 401000 L4" 表示显示前四个数据
da表示ASCII字符串,
db表示字节和ASCII字符串,
dc表示DWORD和ASCII字符串
du表示Unicode字符串
dW表示双字节WORD和ASCII字符串
ds用于显示ANSI_STRING类型的字符串格式
dS用于显示UNICODE_STRING类型字符串格式
dyp表示显示二进制和字节
dyd表示显示二进制和DWORD值
dt [模块名!类型名] 用于显示数据类型和数据结构,例如使用“dt ntdll!*”可以列出ntdll中所有的结构
dds、dps、dqs用于显示地址及相关符号
2、搜索内存
s命令用于搜索内存:
s -[type] range pattern
type 表示搜索内容的数据类型。b表示 BYTE, w表示WORD,d表示DWORD,a表示ASCII,u表示Unicode。默认类型为b
range表示地址范围,可以用两种方式表示,一是起始地址,二是起始地址加长度L。如果搜索长度超过256MB,则用 “L?length”
pattern 用于指定要搜索的地址内容,可以用空格分隔要搜索的数值。
例如,要在 400000h和403000h之间搜索Unicode字符串"pediy":
s -u 400000 403000 "pediy"
在目标空间为2GB的user mode内存空间中搜索ASCII字符串 "mytest"
s -u 0x00000000 L?0x7fffffff mytets
3、修改内存
e命令用于修改指定的内存数据,他有两种格式
按字符串方式编辑指定地址的内容,格式如下:
e{a|u|za|zu} adress "String"
其中,“za”和"zu" 表示以零结尾的ASCII和Unicode字符串,
z和u则表示不以零结尾
按数值方式编辑,格式如下:
e{a|b|d|D|f|q|u|w} adress [values]
a表示ASCII码,b表示BYTE,d表示DWORD,D表示double,f表示float,q表示8字节,u表示Unicode,w表示WORD,例如 "eb 287897 70 65 64 69 79"表示写入 "pediy"
执行完e命令,在以d命令查看修改结果
4、观察内存属性
!address 用于显示指定地址的内存属性
!address [Adresss]
相关文章:

windbg-应用层实时调试
调试符号windbg使用一个或多个目录来存放符号条件,并使用环境变量_NT_SYMBOL_PATH来指向这些环境变量的位置,对操作系统内部模块的符号文件,一般用http://msdl.microsoft.com/download/symbols配置如下:SRV*C:\Symbols*http://msd…...
【Python语言基础】——Python NumPy 数组索引
Python语言基础——Python NumPy 数组索引 文章目录 Python语言基础——Python NumPy 数组索引一、Python NumPy 数组索引一、Python NumPy 数组索引 访问数组元素 数组索引等同于访问数组元素。 您可以通过引用其索引号来访问数组元素。 NumPy 数组中的索引以 0 开头,这意味…...

MWORKS--MoHub介绍
MWORKS--MoHub介绍1 介绍1.1 简介1.2 功能特征2 快速上手2.1 进入工作台2.2 新建仓库并进入建模空间2.3 建模进入建模工作空间加载模型库新建模型2.4 仿真2.5 后处理曲线、动画2.6 查看模型信息3 使用手册参考1 介绍 1.1 简介 MWORKS.MoHub 支持工业知识、经验、数据的模型化…...

Netty零拷贝机制
Netty零拷贝机制一:用户空间与内核空间二:传统IO流程三:零拷贝常见的实现方式1. mmap write2. sendfile四:Java中零拷贝五:Netty 中如何实现零拷贝1. CompositeByteBuf 实现零拷贝2. wrap 实现零拷贝3. slice 实现零拷…...

C++:提高篇: 栈-寄存器和函数状态:windows X86-64寄存器介绍
寄存器1、什么是寄存器2、寄存器分类3、windows X86寄存器命名规则4、寄存器相关术语5、寄存器分类5.1、RAX(accumulator register)5.2、RBX(Base register)5.3、RDX(Data register)5.4、RCX(counter register)5.5、RSI(Source index)5.6、RDI(Destination index)5.7、RSP(stac…...

MyBatis-Plus入门案例
MyBatis-Plus入门案例一、MyBatis-Plus简介1、简介2、特性3、支持数据库4、框架结构5、代码及文档地址二、入门案例1、开发环境2、建库建表3、创建Spring Boot工程a>初始化工程b>引入依赖4、编写代码a>配置application.yml 或者 application.propertiesb>添加实体c…...

适用于 Windows 11/10/8/7 的 10 大数据恢复软件分享
适用于 Windows 11/10/8/7 的 最佳数据恢复软件综述。选择首选的专业数据/文件恢复软件,轻松恢复丢失的数据或删除的照片、视频等文件、SSD、外接硬盘、USB、SD卡等存储设备中的文件等。流行的sh流行的数据恢复软件也包括在内。 10 大数据恢复软件分享 为了帮助您恢…...

在线支付系列【23】支付宝支付接入指南
有道无术,术尚可求,有术无道,止于术。 文章目录前言接入指南1. 创建应用2. 绑定应用3. 配置密钥4. 上线应用5. 开通产品沙箱环境开发前准备(沙箱环境)1. 获取参数、秘钥、证书2. 下载支付宝客户端3. 案例演示前言 在之…...

linux系统常用命令
目录 一、系统介绍 二、Linux常用命令 1、Linux命令格式 2、文件目录操作命令:ls 3、文件目录操作命令:cd 4、文件目录操作命令:cat 5、文件目录操作命令:more 6、文件目录操作命令:tail 7、创建文件命令&…...
面试(十一)new与delete(整理) 及 内存泄露
c语言经常使用的是free与malloc,而c++又引入了new和delete它们的区别是什么呢? 内置类型 对于内置类型来说,free和delete、malloc和new几乎没什么区别,但如果是连续的空间,malloc和free只能申请和释放一块空间的内容,而new[] 和 delete[] 可以申请和释放一段连续的空间。…...

2D图像处理:2D ShapingMatching_缩放_旋转_ICP_显示ROI
文章目录 调试结果参考调试说明问题0:并行运行问题问题1:模板+Mask大小问题问题2:组合缩放和旋转问题3:可以直接将计算边缘的代码删除问题4:如何在原始图像上显示匹配到的ROI问题5:计算的原始旋转角度不需要判断,直接可以在ICP中使用问题6:绘制坐标轴问题7:绘制ROI调试…...

(考研湖科大教书匠计算机网络)第四章网络层-第一、二节:网络层概述及其提供的服务
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:网络层概述(1)概述(2)学习内容二:网络层提供的两种服务(1)面向连…...

概论_第8章_假设检验的基本步骤__假设检验的类型
一. 假设检验的基本步骤如下:第1步 根据实际问题提出原假设 及备择假设 , 要求 与 有且仅有一个为真;第2步 选取适当的检验统计量, 并在原假设 成立的条件下确定该检验统计量的分布;第3步 按问题的具体要求, 选取适当…...

SpringMVC--简介和入门案例
SpringMVC简介 什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bean:专门存储业务数据的,如 Studen…...
Cmake入门02-检测环境(笔记)
文章目录检测操作系统处理平台相关源码处理编译器相关源码编译编译处理器相关源码检查cpu是32位还是64位的检测cpu架构处理 CPU指令相关源码案例展示 Eigen3向量化加速项目设置编译器开启向量化优化《CMake cookbook》笔记检测操作系统 cmake中通过CMAKE_SYSTEM_NAME变量来识别…...
Android JNI C++读写本地文件
文章目录小结Android JNI使用CAndroid JNI读写本地文件有关权限创建文件夹访问 /storage/emulated/0/访问/data/data/example.jniwritefile/时间戳Cant determine type for tag参考小结 进行Android JNI C读写本地文件,取得了想要的效果。 Android JNI使用C 对于…...

图形化深度学习开发平台PaddleStudio(代码开源)
目录一、PaddleStudio概述二、环境准备2.1 安装PaddlePaddle2.2 安装依赖库三、基本使用介绍3.1 启动3.2 快速体验3.2.1 下载示例项目3.2.2 训练3.2.3 评估3.2.4 测试3.2.5 静态图导出四、数据集格式4.1 图像分类4.2 目标检测4.3 语义分割4.4 实例分割五、趣味项目实战…...

【力扣-LeetCode】1138. 字母板上的路径-C++题解
1138. 字母板上的路径难度中等98收藏分享切换为英文接收动态反馈我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。在本题里,字母板为board ["abcde", "fghij", "klmno", "pqrst", &quo…...

基于Java+SpringBoot+Vue前后端分离酒店管理系统设计与实现
博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《S…...

【软考系统架构设计师】2022下综合知识历年真题
【软考系统架构设计师】2022下综合知识历年真题 【2022下架构真题第01题:绿色】 01.云计算服务体系结构如下图所示,图中①、②、③分别与SaaS、PaaS、Iaas相对应,图中①、②、③应为( ) A.应用层、基础设施层、平台层 B.应用层、平台层、基础…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

AWSLambda之设置时区
目标 希望Lambda运行的时区是东八区。 解决 只需要设置lambda的环境变量TZ为东八区时区即可,即Asia/Shanghai。 参考 使用 Lambda 环境变量...

年度峰会上,抖音依靠人工智能和搜索功能吸引广告主
上周早些时候举行的第五届年度TikTok World产品峰会上,TikTok推出了一系列旨在增强该应用对广告主吸引力的功能。 新产品列表的首位是TikTok Market Scope,这是一个全新的分析平台,为广告主提供整个考虑漏斗的全面视图,使他们能够…...