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.应用层、平台层、基础…...
【计组】理解Disruptor--《计算机组成原理》(十五)
Disruptor 的开发语言,并不是很多人心目中最容易做到性能极限的 C/C,而是性能受限于 JVM 的 Java。其实只要通晓硬件层面的原理,即使是像 Java 这样的高级语言,也能够把 CPU 的性能发挥到极限。 一、Padding Cache Lineÿ…...
Windows11 安装Apache24全过程
Windows11 安装Apache24全过程 一、准备工作 1、apache-httpd-2.4.55-win64-VS17.zip - 蓝奏云 2、Visual Studio Code-x64-1.45.1.exe - 蓝奏云 二、实际操作 1、将下载好的zip文件解压放到指定好的文件夹。我的是D:\App\PHP下 个人习惯把版本号带上。方便检测错误。 2…...
1302机器翻译(队列)
目录 题目描述 提示 解题思路 代码部分 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#…...
AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)
目录 4806. 首字母大写 题目描述: 实现代码: 4807. 找数字 题目描述: 实现代码: 回溯(超时): 原理思路: 贪心: 原理思路: 4808. 构造字符串 问题…...
跟同事杠上了,Apache Beanutils为什么被禁止使用?
收录于热门专栏Java基础教程系列(进阶篇) 在实际的项目开发中,对象间赋值普遍存在,随着双十一、秒杀等电商过程愈加复杂,数据量也在不断攀升,效率问题,浮出水面。 问:如果是你来写…...
Golang 模糊测试的使用
一 背景 在 Go 1.18 中,Go 语言新增模糊测试(Fuzzing)。Fuzzing,又叫fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。模糊测试和常规的功能…...
RSA公钥加密机制跨语言应用实战
在公钥密码学中(也称为非对称密码学),加密机制依赖于两个密钥:公钥和私钥。公钥用于加密消息,而只有私钥的所有者才能解密消息。实际应用中通常需要对公钥和私钥进行序列化,然后分发密钥实现在不同场景、不同语言环境中使用。本文…...
P7面试送命题
面试总结,对标市场P7。什么叫送命题,一道题回答不上来面试直接挂的题目。JVM 运行时数据区域内存回收机制GC root有哪些volatile原理synchronize原理JDK 集合家族介绍HashMap原理ConcurrentHashMap原理Thread生命周期ThreadPoolExecutor生命周期、实例化…...
零信任-微软零信任介绍(2)
微软零信任是什么? Microsoft Zero Trust 是一种安全架构,旨在在没有信任任何设备、用户或网络的情况下保护网络。这种架构使用多重验证和分段技术,以确保每个请求和资源的安全性。 零信任不假定任何内部用户或设备是安全的ÿ…...
C++中对象调用成员函数this指针的作用
C中对象调用成员函数this指针的作用 Sales_data total;//定义对象 total.isbn();//调用对象中的成员函数isbn成员函数isbn()通过一个名为this的额外隐式参数来访问调用它的对象total。当我们调用一个成员函数时,用请求该函数的对象地址初始化this。 例如࿰…...
工邦邦官网/杭州seo俱乐部
IE的脚本错误对话框非常不友好,无法copy详细信息 (至少IE7是这样)。发现Firefox的Tools > Error Console 中也可以看到错误信息而且可以Copy! 调试程序时,在VS中将默认浏览器设置为Firefox就可以调试并可以Copy脚本错误信息了...
wordpress后台忘记密码/青岛模板建站
1)用数值进行填充 用平均值、中值、分位数、众数、随机值等替代。简便快速但是效果一般,因为等于人为增加了噪声。 2)用算法拟合进行填充(常用的是随机森林算法) 相对一较为准确。但是有一个根本缺陷,如果其…...
做网站能带来什么/十大职业资格培训机构
真的很难想象这个是我打过的比赛,好难啊,我一个人写了七八个小时,还没有写完,主要是我的代码出现了一些思想性的错误, 而且自己还没有意识到,很郁闷。 就补了五个题目。 第一个很简单的题目,随便…...
长沙建设网站企业/网店培训
(一)apache 介绍Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,Apache也叫万维网,www服务器, web服务器主要功能是提供网上信息浏览服务。Apache可以在大多数计算机操作系统中运行&…...
公司取名字参考大全免费/西安seo关键词排名优化
本篇博客我们主要介绍如何用Redis实现布隆过滤器,但是在介绍布隆过滤器之前,我们首先介绍一下,为啥要使用布隆过滤器。 1、布隆过滤器使用场景 比如有如下几个需求: ①、原本有10亿个号码,现在又来了10万个号码&#x…...
个人做短视频网站/深圳全网推广托管
yum服务器lvm扩容,data目录是yum存放rpm包的目录,只有20G,需要添加磁盘扩容到80G# df -lhFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_node5-root 20G 479M 18G 3% /tmpfs 935M…...