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.应用层、平台层、基础…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...