windbg-应用层实时调试

news2024/12/25 9:13:50

调试符号

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]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你部署ruoyi前后端分离版本

下载源码(当前版本3.8.5)RuoYi-Vue: 🎉 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本 (gitee.com)创建数据库(一定要是这三个&…

【STM32】【HAL库】遥控关灯3 遥控器

相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 硬件遥控器 控制一个灯的开关(2个按键),发射RF433或红外 使用纽扣电池供电 一键启动,低待机功耗 硬件设计 一键…

推荐系统开源工具RecBole学习

文章全文首发:码农的科研笔记(公众号) RecBole是由AI Box团队开发的基于Pytorch的推荐系统算法库。该框架从数据处理、模型开发和算法训练都有涉及,能方便进行算法构建和实验对比。 数据组织形式 RecBole约定了一个统一、易用的数…

发生异常: AttributeError ‘xxx’ object has no attribute ‘ooo’

python 发生异常: AttributeError ‘xxx’ object has no attribute ‘ooo’ 原因: 函数调用发生在变量定义之前 示例分析: 在apple.py文件中代码如下: class Apple():def __init__(self):self.eat()self.pricedef eat(self):print("吃…

Spring Security in Action 第十八章 手把手OAuth2应用

本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringSecurity相关知识相关知识,打造完整的SpringSecurity学习步骤,提升工程化编码能力和思维能力,写出高质量代码。希望大家都能够从中有所收获&#…

Java:SpringMVC的使用(2)

目录第十二章 REST风格CRUD练习12.1 搭建环境12.2 实现功能思路第十三章 SpringMVC消息转换器13.1 消息转换器概述13.2 使用消息转换器处理请求报文(1) 使用RequestBody获取请求体(2) 使用HttpEntity\<T>获取请求体及请求头13.3 使用消息转换器处理响应报文(1) 使用Respo…

llvm 创建外部调用函数方法

llvm 创建外部调用函数方法 2023-02-12 15:26:19 sizaif 文章目录llvm 创建外部调用函数方法法一:声名参数类型及函数类型在llvm IR中处理并调用函数:外部函数&#xff1a;法二声明函数在llvm IR中处理并函数调用外部函数法一: 声名参数类型及函数类型 // Fun Ty static Fun…

【CS224W】(task3)NetworkX工具包实践

note 节点可以为任意可哈希的对象&#xff0c;比如字符串、图像、XML对象&#xff0c;甚至另一个Graph、自定义的节点对象。通过这种方式可以自由灵活地构建&#xff1a;图为节点、文件为节点、函数为节点&#xff0c;等灵活的图形式。暂时省略&#xff1a;【B5】计算机网络图…

vue3学习资料整理

一、一个后端程序员为什么要学习前端&#xff1f; 1.网上找到的学习理由 《Java后端的我也要学Node.js 了》 https://blog.csdn.net/yusimiao/article/details/104689007 《nodejs后端开发的优缺点&#xff08;nodejs的概念与特征详解&#xff09;》 https://www.1pindao.co…

2023级浙江大学MEM提面最新经验分享

一、个人背景背景&#xff1a;本人毕业于某211大学工程管理相关专业&#xff0c;目前定居在杭州&#xff0c;在某汽车制造公司工作&#xff0c;负责研发无人驾驶项目。我申请的是浙大MEM提前批面试&#xff0c;因为通过提面优秀资格顺利上岸录取&#xff0c;之前感到对自己有帮…

Java、JSP动漫网站的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着科技的迅速发展&#xff0c;计算机技术已应用到社会的各个领域。随着计算机技术和通信技术的迅速发展&#xff0c;网络的规模也逐渐增大&#xff0c;网络的元素也随之不断增加&#xff0c;有的利用其通信&#xff0c;有的利用其…

【软件测试开发】Junit5单元测试框架

目录1. 注解Test 注解BeforeEach BeforeAllAfterEach AfterAll2. 断言 assertassertequalsassertTrue assertFalseassertNull assertNotNull3. 用例执行顺序方法排序&#xff0c;通过 Order 注解来排序4. 测试套件 Suite5. 参数化单参数stringsints6. 参数化多参数CsvSourceCsv…

File类

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 ✈️推荐一款模拟面试&#xff0c;刷题神器…

2. SpringMVC 请求与响应

文章目录1. 请求映射路径2. 请求参数2.1 get 请求发送普通参数2.2 post 请求发送普通参数2.3 五种类型的参数传递2.4.1 普通参数2.4.2 POJO 数据类型2.4.3 嵌套 POJO 类型参数2.4.4 数组类型参数2.4.5 集合类型参数3. json 数据传输参数&#xff08;重点&#xff09;3.1 传输 j…

C语言(C预编译指令)

目录 1.undef 2.条件编译#ifdef,#else和#endif 3.#ifndef 4.#if和#elif 5.预定义宏 6.#line和#error 7.#pragma 1.undef #undef指令用于取消已定义的#define指令 #define LIMIT 400 #undef LIMIT 如果想使用一个名称但又不确定之前是否已经用过&#xff0c;为了安全起…

Python中的进程线程

文章目录前言多进程与多线程基本概念多进程multiprocessing 类对象进程池subprocess模块进程间通信多线程threading实现线程操作线程共享所有变量线程锁参考资料前言 又花了点时间学习了一下Python中的多线程与多进程的知识点&#xff0c;梳理一下供复习参考 多进程与多线程 …

JUC并发编程与源码分析

一、本课程前置知识及要求说明 二、线程基础知识复习 三、CompletableFuture 四、说说Java"锁"事 8锁案例原理解释: 五、LockSupport与线程中断 六、 Java内存模型之JMM 七、volatile与JMM 八、CAS 九、原子操作类之18罗汉增强 十、聊聊ThreadLocal 十一、Java对…

离线数据仓库

1 数据仓库建模 1.1 建模工具 PowerDesigner/SQLYog/EZDML… 1.2 ODS层 &#xff08;1&#xff09;保持数据原貌不做任何修改&#xff0c;起到备份数据的作用。 &#xff08;2&#xff09;数据采用压缩&#xff0c;减少磁盘存储空间&#xff08;例如&#xff1a;压缩采用LZO&…

seata源码-全局事务回滚服务端源码

这篇博客来记录在发起全局事务回滚时&#xff0c;服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中&#xff0c;有说到过&#xff0c;事务发起者在发现分支事务执行异常之后&#xff0c;会提交全局事务回滚的请求到netty服务端&#xff0c;这里是发…

Python 解决dilb和face_recognition第三方包安装失败

目录 dilb和face_recognition第三方包安装失败 亲测有效的解决方法&#xff1a;whl安装方式 dilb和face_recognition第三方包安装失败 场景复现&#xff1a;因为需要用到dlibface_recognition&#xff0c;基于OpenCV做一些人脸识别的项目&#xff0c;在Pycharm中进行pip清华…