当前位置: 首页 > news >正文

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等。

  1. dw表示双字节形式

  1. dd表示4字节形式

  1. dq表示8字节形式

  1. df表示4字节单精度浮点数格式

  1. dD表示8字节双精度浮点数格式

  1. dp表示指针大小格式,在32位系统下为4字节,在64位系统下为8字节。

地址范围可以L(l)参数设置,例如 "dd 401000 L4" 表示显示前四个数据

  1. da表示ASCII字符串,

  1. db表示字节和ASCII字符串,

  1. dc表示DWORD和ASCII字符串

  1. du表示Unicode字符串

  1. dW表示双字节WORD和ASCII字符串

  1. ds用于显示ANSI_STRING类型的字符串格式

  1. dS用于显示UNICODE_STRING类型字符串格式

  1. dyp表示显示二进制和字节

  1. dyd表示显示二进制和DWORD值

  1. dt [模块名!类型名] 用于显示数据类型和数据结构,例如使用“dt ntdll!*”可以列出ntdll中所有的结构

  1. 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 实例分割五、趣味项目实战&#xf…...

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

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求&#xff…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

基于 TAPD 进行项目管理

起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...