在Windbg中设置断点追踪打开软件远程调试开关的模块

news2024/11/17 7:29:37

目录

1、Windbg动态调试

2、在Windbg中设置断点

2.1、在函数入口处设置断点

2.2、在函数内部某一行上设置断点

3、设置断点跟踪对打开远程调试开关接口的调用

3.1、编写演示代码

3.2、在Windbg中设置调用SetRemoteDebugOn接口的断点进行跟踪

4、最后


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html       最近在测试时发现,我们的软件在启动起来后会自动打开远程调试开关,而基于安全考虑,打开远程调试开关需要用户自己在设置中手动操作,不能自动打开。因为我们的软件模块有上百个dll库,涉及到多个开发组,无法确定到底是哪个模块自动打开的,后来想到可以使用Windbg动态调试设置断点去快速定位问题。本文详细讲述这一问题的排查过程。

1、Windbg动态调试

       一般在排查C++软件异常问题时,如果有包含异常上下文的dump文件,我们优先使用Windbg打开dump文件去进行静态分析。如果发生异常时没有生成dump文件,则需要将Windbg附加到目标进程上(或者使用Windbg启动目标程序)进行动态调试。

       Windbg主要用来分析C++软件异常,除此之外,还可以在动态调试时帮我们辅助定位一些问题。我们可以在动态调试的Windbg中设置断点(设置代码段的地址),去对程序的运行轨迹进行跟踪。本案例中,正是通过在Windbg中设置断点定位问题的。

        使用Windbg进行动态调试有两种方式:

1)直接将Windbg附加到已经运行起来的目标进程上。点击菜单栏中的File->Attach to a Process...。
2)可以直接使用Windbg启动目标程序。点击菜单栏中的File->Open Executabe...。如果问题出在程序启动的过程中,则使用此种方式。

       本项目问题中,自动打开远程调试开关的操作应该是在程序启动时执行的,所以我们要用Windbg去启动程序的方式。

2、在Windbg中设置断点

       可以使用bp命令设置断点,可以将断点设置在函数入口处,也可以在函数内部设置断点。在函数内部某一行上设置断点,命中断点后可以查看到中断时函数中局部变量的值,变量的值可能是排查问题的重要线索。

2.1、在函数入口处设置断点

        在函数入口处设置断点,直接使用函数名就可以了,函数名就是函数在代码段的首地址。以netdll.dll库中的SetRemoteDebugOn函数为例,设置断点的命令为:

bp netdll!SetRemoteDebugOn

其中netdll就是所在dll库名称(不带.dll后缀),SetRemoteDebugOn就是函数名。

此处的SetRemoteDebugOn函数是netdll.dll库的导出函数,函数的符号是对外公开的,无需pdb符号库文件。如果要设置的函数是dll库内部的函数,非dll库的导出函数,则需要将库的pdb文件设置到Windbg中,因为内部函数需要pdb文件中的函数符号,否则Windbg没法识别。

2.2、在函数内部某一行上设置断点

       此处说的函数内部的某一行,不是C++源码的某一行,而是二进制文件中汇编代码(二进制机器码)的某一行。因为程序最终运行的是二进制文件,执行的是二进制文件中的二进制代码(与汇编代码等价的,汇编代码是二进制代码的助记符)。

       其实就是在所在函数(函数就是函数在代码段的首地址)基础上加上一个offset偏移值。但这个偏移值不是随意写的,需要使用IDA打开二进制文件查看汇编代码去确定。因为不同的汇编指令,其长度也是不一样的,只能设置汇编指令的地址,不能设置两条汇编指令地址中间的地址值,否则会无效,不会命中断点。

       以开源库libcurl.dll为例,我们使用IDA Pro打开该库文件查看反汇编出来的汇编代码,找到该库的内部函数easy_perform,在该函数中的10007D2D行设置断点,如图所示:

要在IDA中看到库内部函数的符号,需要将pdb文件拿过来,放到libcurl.dll同级目录中,IDA回去自动加载。关于如何使用IDA反汇编工具,可以查看我之前写的文章:

IDA反汇编工具使用详解icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/120635120       要在指定的10007D2D行设置断点,需要计算这行汇编指令相对所在函数的偏移:

0x10007D2D - 0x10007D10 = 0x1D

所以设置断点的WIndbg命令为:

bp libcurl!easy_perform+0x1D

       从下图也可以看出不同的汇编指令占的代码段内存的长度是不一样的:

注意,这个地方讲到的地址,都是代码段的地址,是二进制文件二进制代码(汇编代码)的地址。代码段的地址,要和数据段地址区分开来,变量占用的内存是数据段内存。   

       关于C++程序的内存分区,可以查看之前的文章:
实例详解C++程序的五大内存分区icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/120958761        此外,我们要说一下了解汇编代码的重要性,从此处我们也能看出一点端倪。熟悉汇编代码,不仅可以辅助排查C++程序问题,还可以理解高级语言无法理解的编程细节或代码执行细节的问题。如果要了解排查C++软件问题所需要掌握的汇编基础知识,可以查看我之前写的文章:
分析C++软件异常需要掌握的汇编知识汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124758670

3、设置断点跟踪对打开远程调试开关接口的调用

       为了跟踪是哪个模块自动打开远程调试开关,只要拿来底层库用打开远程调试的函数名称及所在的模块名,就可以在动态调试的Windbg中设置断点进行跟踪了。

此处不便展示项目中的相关模块和接口,也为了方便日后的视频课程的讲解,我特意写了一些测试代码,来讲述整个问题的跟踪过程。

3.1、编写演示代码

       使用Visual Studio创建了一个MFC主程序TestDlg.exe,以及一个包含打开远程调试接口SetRemoteDebugOn的netdll.dll动态库。在TestDlg.exe主程序的Test按钮的响应函数中调用netdll.dll库中的用于打开远程调试的API接口SetRemoteDebugOn。

       动态库netdll.dll中API接口SetRemoteDebugOn定义如下:

主程序TestDlg.exe中的Test按钮的响应函数调用SetRemoteDebugOn的代码如下:

3.2、在Windbg中设置调用SetRemoteDebugOn接口的断点进行跟踪

       使用Windbg启动TestDlg.exe,使用Windbg动态调试。因为最终调用的是netdll.dll模块中的SetRemoteDebugOn接口去打开远程调试开关,所以只要对SetRemoteDebugOn接口入口处设置断点就可以了,即:bp netdll!SetRemoteDebugOn,如下所示:

我们使用bl命令查看当前设置的断点列表,如上所示。

       然后点击TestDlg.exe程序窗口中的Test按钮:

在按钮的响应函数中调用SetRemoteDebugOn接口,这样就命中了刚才设置的断点,Windbg中断下来,使用kn命令查看此时的函数调用堆栈,我们就知道是哪个模块调用了SetRemoteDebugOn接口将远程调试关闭了。

       查看命中断点时的函数调用堆栈如下所示:

从上图可以看出,TestDlg.exe模块调用了打开远程调试开关的接口,并且还能看到是TestDlg.exe模块中的CTestDlgDlg::OnBnClickedTest函数调用的。如果有pdb,还能看到具体是函数中的哪一行代码调用的!

4、最后

       本例中通过在Windbg中设置断点,快速地定位出打开远程调试开关的模块及函数信息。Windbg动态调试功能确实很有用,希望本文能给大家带来一定的启示和参考。

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

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

相关文章

线上Vue项目访问其他服务器接口(宝塔平台配置解决)

前端本地解决跨域问题非常简单,配置代理即可,线上需要配置nginx,宝塔给我们更简单的配置方式:反向代理。 登录进宝塔页面,选择网站,点击网站名,选择反向代理 点击添加反向代理 注意&#xff…

基于Springboot实现餐厅点餐系统演示【项目源码+论文说明】分享

基于Springboot实现餐厅点餐系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识&#xff…

resources(static与templates)

static "static"目录用于存放静态资源文件,例如HTML、CSS、JavaScript、图像等。 springboot整合了springmvc的拦截功能。拦截了所有的请求。默认放行的资源是:resources/static/ 目录下所有静态资源。(不走controller控制器就能…

【开发篇】十一、SpringBoot缓存底层实现技术的切换为Ehcache、Redis、Memcached

文章目录 0、补充:数据淘汰策略1、切换为Ehcache2、切换为Redis3、切换为memcached--安装与启停4、切换为memcached--整合 SpringBoot提供了缓存的统一整合接口,方便缓存技术的开发与管理: GenericJCacheEhcacheHazelcastInfinispanCouchbase…

《视觉 SLAM 十四讲》V2 ——第3讲

关于本笔记的说明: 最好跟着 原书 整理个人笔记,他人笔记仅适合参考部分内容。 ———————— B站链接 高翔博客链接 百度网盘链接:https://pan.baidu.com/s/1VsrueNrdqmzTvh-IlFBr9Q 提取码:vfhe github源码链接V2 《视觉…

OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

OpenCV读取RGB图像 在OpenCV中,读取的图片默认是HWC格式,即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C,因此最小颗粒度是C。 例如,一张形状为2562563的RGB图像,在OpenCV中读取后的格式…

阿里云服务器方升架构、自研硬件、AliFlash技术创新

阿里云服务器技术创新:服务器方升架构及自研硬件、自研存储硬件AliFlash和阿里云异构计算加速平台,阿里云百科分享阿里云服务器有哪些技术创新: 目录 服务器技术创新 服务器方升架构及自研硬件 自研存储硬件AliFlash 阿里云异构计算加速…

进入k8s下mysql docker容器,设置慢查询开关

服务器账号信息:wps/kingsoft 进入mysql容器: kc exec -ti -n kube-public mysql-0 -- bash 访问数据库: mysql -h10.13.83.171 -uhuangweiheng -phuangweiheng_password; 数据库超管:root/wpsepmysql sudo service mysql r…

QQ农场怀旧版搭建(附带搭建完成示例)

QQ农场搭建 示例均在宝塔面板搭建搭建完成网站,欢迎━(`∀)ノ亻!大家种种菜 http://farm.dreamlove.top/如果不出意外应该会一直续费下去,毕竟linux服务器便宜很多~ 所需依赖 mysql 5.5 php 5.4 nginx 1.22下载农场文件并安装好了依赖 下载地址1:https://cloudr…

Cloudera Manager-6.2.0安装文档

环境准备 安装包地址 链接:https://pan.baidu.com/s/1QrLsXynmopqoZhDkoIAihg 提取码:kaoi 虚拟机建议配置 至少3台节点,server节点安装cloudera server服务和mysql服务 server节点 ​ 内存:3GB以上 ​ 存储:4…

react 网页/app复制分享链接到剪切板,分享到国外各大社交平台,通过WhatsApp方式分享以及SMS短信方式分享链接内容

1.需求 最近在做一个国际网站app,需要把app中某个页面的图文链接分享到国外各大社交平台上(facebook,whatapp,telegram,twitter等),以及通过WhatApp聊天方式分享,和SMS短信方式分享链接内容,该怎么做呢?图示如下: 分享到国外各大社交平台&am…

详解Avast Driver Updater:电脑驱动更新工具的利器还是多余的软件?

亲爱的读者朋友们,你是不是经常为电脑的驱动问题而烦恼?如果是的话,你可能会对这款软件——Avast Driver Updater 电脑驱动更新工具感兴趣。但在你决定尝试之前,不妨先和我一起深入探讨一下它的优点、缺点以及它适用的使用场景。 …

移动机器人建模两轮驱动与四轮驱动

本文章仅记录小编再学习过程中的知识总结,若有不对之处请批评指正,互相学习,共同进步。 一、两轮驱动运动学模型 示例最后得出,该机器人会沿全局参考系的Y轴以速度1的旋转的同时,以速度3瞬时的移动。 二、四轮驱动运动…

Ps:抓手工具

抓手工具 Hand Tool常用于在文档窗口中平移图像,方便观察大尺寸图像(或者被放大的图像)的局部细节,是操作 Ps 最常用的辅助工具之一。 快捷键:H ◆ ◆ ◆ 常用操作方法与技巧 1、快捷键 H 是一个弹簧键。即&#xff…

【Linux】 df命令使用

df命令 df 命令,用于显示 Linux 系统中各文件系统的硬盘使用情况,包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等 执行命令结果 各列信息的含义分别是: Filesystem:表示该文件系统位于哪个分区,因此该…

算法与数据结构-AC自动机

文章目录 什么是多模式串匹配算法基于单模式串和 Trie 树实现的敏感词过滤经典的多模式串匹配算法:AC 自动机 什么是多模式串匹配算法 单模式串匹配算法,是在一个模式串和一个主串之间进行匹配,也就是说,在一个主串中查找一个模式…

精准纠错音错节奏 钢琴老师都在推荐小叶子智能陪练

如今市面上帮助孩子练琴的软件越来越多,有线上陪练的,还有AI陪练。产品琳琅满目,家长也挑花了眼。如何挑选一款真正能帮助孩子练琴的App呢?作为从业十余年的钢琴老师,可以分享三点建议给大家。 看品牌实力是否过硬 现…

二维平面扭曲的python实现及思路

二维平面扭曲的python实现及思路 缘起原理实现代码 缘起 工作需要,需要一个尝试改变设备布点的方法,在csdn闲逛时,偶然间发现这样的一篇文章 二维扭曲,参考这位博主的文章,我对其内容进行复现和进一步挖掘。若有侵权或…

基于STM32+OneNet设计的GPS定位器(ESP8266)

一、 设计说明 随着移动互联网和物联网技术的快速发展,越来越多的智能设备被广泛应用于各个领域。其中,GPS定位器是一种常见的智能设备,可以用于车辆、家庭、宠物等物品的实时定位。在实际使用中,GPS定位器需要具有实时上传位置数据、低功耗、精度高等特点。 当前提出了一…

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全

CTFshow 代码审计 web301 下载的附件的目录结构如下: 开题后界面,看见输入框,感觉是sql。 大概浏览一遍源码,我们可以发现在checklogin.php文件中有无过滤的SQL语句,SQL注入没得跑了。 这题SQL注入有三种做法。 方法一…