当前位置: 首页 > 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.应用层、平台层、基础…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...