说到现场调试,断点是最重要的。通常,在生产环境中解决一个非常复杂的问题需要在本地、非生产环境中调试我自己的一台测试机器。我通常会调试有问题的进程或代码,以便更好地了解它是如何工作的,以及在我进入时需要收集哪些数据。这通常涉及一些逆向工程,并对相关流程或模块进行代码审查。我们总是希望在进行实时调试时尽量减少对生产环境的影响。我称之为设计完美的断点。

我们通常使用几种类型的断点。

最常见的断点是bp,在windbg中设置它很简单:bp 0xaddress。请注意,当您进入用户模式进程时,它会停止进程的执行。当您进入内核调试器时,它会停止整个机器。在这种情况下,我们想知道一旦断点命中,我们将发出什么命令。然后,可以设置断点,以便在插入时自动发出命令。

在遇到断点时运行命令的语法很简单:bp 0xaddress “comand1;command2;…”。例如-bp 0xMYADDRESS “kv;dd g_myGlobal;g” 此命令将在0xMYADDRESS上中断,通过kv转储调用堆栈;将内存转储为从g_MyGlobal地址开始的dword;然后使用g命令继续执行。

另一个很酷的技巧是让一个断点启用或禁用另一个断点或禁用它自己。假设您有一个断点,它太频繁地被命中,以至于每次代码执行时都会中断。但是,一旦满足特定的状态或条件,您可能希望每个调用堆栈都与该断点关联。您所需要做的就是设置一个断点,等待您的关键条件代码执行。然后,这个断点可以启用更昂贵的断点。

示例如下:

bp ntdll!RtlAllocateHeap “kv;g” << 这将是断点1,设置在一个非常常见的调用上。

bd 1 << 禁用断点1,因为在断点2执行之前我们不想看到它的输出。

bp notepad!OpenFile “be 1;g” <<这将在执行NotePad!OpenFile启用断点1

最昂贵的断点类型是ba - 。此断点允许您中断对内存或I/O端口的访问。有几种变体:baw(写中断)、bar(读中断)、bae(执行中断)和bai(用于i/O端口)。

让我们用break-on-write作为示例。语法很简单。ba w4 0xNNNNnnnn。这意味着访问中断,访问类型为WRITE,宽度为4字节,后跟目标地址。但是,由于处理器必须监视对该内存的访问,因此通常会减慢执行时间。这可能是您在另一个条件检查期间有条件地使用be启用的断点。

Ba类型的断点在资源更改时非常方便,并且您不知道是什么代码路径触及它。假设你有一个损坏的临界区。不太可能是某个关键部分api导致了损坏。更有可能的是,有什么东西把记忆给改写了。在这种情况下,您可以简单地对关键部分地址执行baw4,后跟一个“kv;g”,然后让进程运行。您将看到critical section api接触critical section的所有位置;但是,您还将看到任何在该内存上写入的违规者。

条件断点

您也可以在调试器中的断点执行过程中,使用断点后面的部分中的j命令执行条件中断或检查:bp Address “j EXPRESSION ‘If True Commands1;If True command2’;'Else Command1;Else Command2'”

下面是检查对文件打开操作的调用的示例。断点是在调用后的指令上设置的。

bp notepad!SomeNotePadCodeOpeningAFile+0x132 "j @eax >0 '.echo all is good file opened ok;gc';'!gle;kv;lsa eip;gc'“

如果eax(用于存储函数返回值的默认寄存器)为非零,我们将“all is good,file opened ok”回显到命令输出窗口。如果eax为零(表示失败),则!gle显示最后一个错误,通过kv转储调用堆栈,并使用LSA eip在eip地址列出源。

为虫子生,为虫子死,为虫子奋斗一辈子

分类: 调试

设计完美windbg断点的更多相关文章

  1. Windbg断点调试

    [文章主题] Windbg是Windows驱动调试的重要软件,也是必须学习的软件,前面的博客介绍了一些双机调试的环境配置,只要按照我所说的步骤一步步下来就可以完成环境搭建. 本文主要介绍如何调试sys ...

  2. Windbg断点调试.net程序

    程序员都知道,在生产环境中,如果没有系统日志,对问题的分析将非常的困难.即使有日志,有时候也会因为日志记录的不全面,而导致问题不能分析清楚.其实,Windbg里面有Live Debug功能,正好可以借 ...

  3. 设计完美的策略模式,消除If-else

    策略模式是oop中最著名的设计模式之一,是对方法行为的抽象,可以归类为行为设计模式,也是oop中interface经典的应用.其特点简单又实用,是我最喜欢的模式之一.策略模式定义了一个拥有共同行为的算 ...

  4. 第11章 Media Queries 与Responsive 设计

    Media Queries--媒体类型(一) 随着科学技术不断的向前发展,网页的浏览终端越来越多样化,用户可以通过:宽屏电视.台式电脑.笔记本电脑.平板电脑和智能手机来访问你的网站.尽管你无法保证一个 ...

  5. WinDbg调试命令汇总

    一. 1. !address eax 查看对应内存页的属性 2. vertarget 显示当前进程的大致信息 3 !peb 显示process Environment Block 4. lmvm 可以 ...

  6. CSS3知识点整理(五)----响应式设计及其他属性

    介绍Media Queries与Responsive设计以及外轮廓属性.resize属性.CSS3生成内容等 学会如何使用CSS3中的Media Queries模块来让一个页面适应不同的终端(或屏幕尺 ...

  7. windbg 常用命令详解

    = kd> ln 8046e100 (8046e100) nt!KeServiceDescriptorTableShadow | (8046e140) nt!MmSectionExtendRes ...

  8. 在Xamarin开发中,UWP环境下无法进入断点调试standard库的问题解决方案

    环境如下 选择的代码共享方案为standard模式 再多平台依赖注入的时候,断点一直提示没有加载文档. 进入到目标平台项目Debug文件夹下,查看.发现standard库引用进来后,对应的*.pdb文 ...

  9. C语言课程设计

    目录 实现目的 游戏玩法介绍 实现流程与作品架构 任务列表及贡献度 总结感想 作品源码与仓库地址(附页) 资料引用与出处(附页) 实现目的 2048,作为一款极其经典的游戏,从发行到现在,已经有了极多 ...

随机推荐

  1. 深入了解Netty【四】IO模型

    引言 IO模型就是操作数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型.非阻塞式IO模型.IO复用模型.信号驱动式IO模型.异步IO模型. 因为学习Netty必不可少的要了解IO多 ...

  2. 网址中的静态资源 public

     客户端浏览器收到的HTML响应内容中如果带有 link img script video audio 等带有src或者href标签时候,这些都是外部链接资源请求url.浏览器会默认自动性的对这些资源 ...

  3. 12 props 传的是数组处理

    <template> <div>InfoDetailed</div> </template> <script> export default ...

  4. Django 入门介绍

    Django介绍 Django框架是PythonWeb三大主流框架之一,以其功能强大全面而受到众多开发者追捧,现如今Django已经更新到3版本,但是并不推荐使用,更多建议使用1版本. Django版 ...

  5. Azure Storage 系列(四)在.Net 上使用Table Storage

    一,引言 今天我们就不多说废话了,直接进入正题,Azure Table Storage.开始内容之前,我们先介绍一下Azure Table Storage. 1,什么是Azure Table Stor ...

  6. 对韩峰著《SQL优化最佳实践》P7 案例的质疑

    事先申明下,我的DB环境是Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production,如果与作者环境不同而 ...

  7. [Java核心技术]第九章-集合(映射-HashMap&TreeMap)

    HashMap 基本操作 HashMap<Integer,Integer> firstAccurMap=new HashMap<Integer,Integer>(); firs ...

  8. java 多线程-3

    十.同步机制解决Thread继承安全问题 创建三个窗口买票,共100张票.用继承来实现 方式一:同步代码块 public class RunMainExtends { public static vo ...

  9. k8s重要概念及部署k8s集群(一)

    k8s介绍 Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功 ...

  10. java 多线程-4

    十四.sleep方法和wait方法的区别 [面试题] 相同点: 一旦执行方法,都可以使得当前线程进入阻塞状态. 不同点: 两个方法的声明位置不同:Thread类声明sleep():Object类中声明 ...