网络安全编程:调试API函数之产生断点

 [[398092]]

Windows中有些API函数是专门用来进行调试的,被称作Debug API,或者是调试API。利用这些函数可以进行调试器的开发,调试器通过创建有调试关系的父子进程来进行调试,被调试进程的底层信息、即时的寄存器、指令等信息都可以被获取,进而用来分析。

OllyDbg调试器的功能非常强大,虽然有众多的功能,但是其基础的实现就是依赖于调试API。调试API函数的个数虽然不多,但是合理使用会产生非常大的作用。调试器依赖于调试事件,调试事件有着非常复杂的结构体。调试器有着固定的流程,由于实时需要等待调试事件的发生,其过程是一个调试循环体,非常类似于SDK开发程序中的消息循环。无论是调试事件还是调试循环,对于调试或者说调试器来说,其最根本、最核心的部分是中断,或者说其最核心的部分是可以捕获中断。

产生中断的方法是设置断点。常见的产生中断的断点方法有3种,分别是中断断点、内存断点和硬件断点。下面介绍这3种断点的不同。

中断断点,这里通常指的是汇编语言中的int 3指令,CPU执行该指令时会产生一个断点,因此也常称之为INT3断点。现在演示如何使用int 3来产生一个断点,代码如下: 

  1. int main(int argc, char* argv[])  
  2.  
  3.   __asm int 3  
  4.   return 0;  

代码中使用了asm,在asm后面可以使用汇编指令。如果想添加一段汇编指令,方法是asm{}。通过asm可以在C语言中进行内嵌汇编语言。在__asm后面直接使用的是int 3指令,这样会产生一个异常,称为断点中断异常。对这段简单的代码进行编译连接,并且运行。运行后出现错误对话框,如图1所示。

图1  异常对话框

图1所示的异常对话框中通过链接“请单击此处”可以打开详细的异常报告。如果电脑与此处显示的对话框不同,请依次进行如下设置:在“我的电脑”上单击右键,在弹出的菜单中选择“属性”,打开“属性”对话框,选择“高级”选项卡,选择“错误报告”按钮,打开“错误汇报”界面,在该界面上选择“启用错误汇报”单选按钮,然后单击确定。通过这样的设置,就可以启动“异常对话框”了。对于分析程序的BUG、挖掘软件的漏洞,弹出异常对话框界面是非常有用的。

这个对话框可能常常见到,而且见到以后多半会很让人郁闷,通常情况是直接单击“不发送”按钮,然后关闭这个对话框。在这里,这个异常是通过int 3导致的,不要忙着关掉它。通常在写自己的软件时如果出现这样的错误,应该去寻找更多的帮助信息来修正错误。单击“请单击此处”链接,出现如图2所示的对话框。

图2  “异常基本信息”对话框

弹出“异常基本信息”对话框,因为这个对话框给出的信息实在太少了,继续单击“要查看关于错误报告的技术信息”后面的“请单击此处”链接,打开如图3所示的对话框。

图3  “错误报告内容”对话框

通常情况下,在这个报告中只关心两个内容,一是Code,二是Address。在图3中,Code后面的值为0x80000003,Address后面的值为0x0000000000401028。Code的值为产生异常的异常代码,Address是产生异常的地址。在Winnt.h中定义了关于Code的值,在这里0x80000003的定义为STATUS_BREAKPOINT,也就是断点中断。在Winnt.h中的定义为:

  1. #define STATUS_BREAKPOINT ((DWORD)0x80000003L) 

可以看出,这里给的Address是一个VA(虚拟地址),用OD打开这个程序,直接按F9键运行,如图4和图5所示。

图4  在OD中运行后被断下

图5  OD状态栏提示

从图4中可以看到,程序执行停在了00401029位置处。从图5看到,INT3命令位于00401028位置处。再看一下图3中Address后面的值,为00401028。这也就证明了在系统的错误报告中可以给出正确的出错地址(或产生异常的地址)。这样在以后写程序的过程中可以很容易地定位到自己程序中有错误的位置。

在OD中运行自己的int 3程序时,可能OD不会停在00401029地址处,也不会给出类似图4的提示。在实验这个例子的时候需要对OD进行设置,在菜单中选择“选项”→“调试设置”,打开“调试选项”对话框,选择“异常”选项卡,取消“INT3中断”复选框的选中状态,这样就可以按照该例子进行测试了。

回到中断断点的话题上,中断断点是由int 3产生的,那么要如何通过调试器(调试进程)在被调试进程中设置中断断点呢?看图4中00401028地址处,在地址值的后面、反汇编代码的前面,中间那一列的内容是汇编指令对应的机器码。可以看出,INT3对应的机器码是0xCC。如果想通过调试器在被调试进程中设置INT3断点的话,那么只需要把要中断的位置的机器码改为0xCC即可。当调试器捕获到该断点异常时,修改为原来的值即可。

内存断点的方法同样是通过异常产生的。在Win32平台下,内存是按页进行划分的,每页的大小为4KB。每一页内存都有其各自的内存属性,常见的内存属性有只读、可读写、可执行、可共享等。内存断点的原理就是通过对内存属性的修改,本该允许进行的操作无法进行,这样便会引发异常。

在OD中关于内存断点有两种,一种是内存访问,另一种是内存写入。用OD随便打开一个应用程序,在其“转存窗口”(或者叫“数据窗口”)中随便选中一些数据点后单击右键,在弹出的菜单中选择“断点”命令,在“断点”子命令下会看到“内存访问”和“内存写入”两种断点,如图6所示。

图6  内存断点类型

下面通过简单例子来看如何产生一个内存访问异常,代码如下: 

  1. #include <Windows.h>  
  2. #define MEMLEN 0x100  
  3. int main(int argc, char* argv[])  
  4.  
  5.   PBYTE pByte = NULL 
  6.   pByte = (PBYTE)malloc(MEMLEN);  
  7.   if ( pByte == NULL )  
  8.   {  
  9.     return -1;  
  10.   }  
  11.   DWORD dwProtect = 0 
  12.   VirtualProtect(pByte, MEMLEN, PAGE_READONLY, &dwProtect);  
  13.   BYTE bByte = '\xCC' 
  14.   memcpy(pByte, (const char *)&bByte, MEMLEN);  
  15.   free(pByte);  
  16.   return 0;  

这个程序中使用了VirtualProtect()函数,该函数与VirtualProtectEx()函数类似,不过VirtualProtect()是用来修改当前进程的内存属性的。

对这个程序编译连接,并运行起来。熟悉的出错界面又出现在眼前,如图7所示。

图7  “异常基本信息”对话框

按照前面介绍的步骤打开“错误报告内容”对话框,如图8所示。

图8  “错误报告内容”对话框

按照上面的分析方法来看一下Code和Address这两个值。Code后面的值为0xc0000005,这个值在Winnt.h中的定义如下:

  1. #define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L) 

这个值的意义表示访问违例。Address后面的值为0x0000000000403093,这个值是地址,但是这里的地址根据程序来考虑,值是用malloc()函数申请的,用于保存数据的堆地址,而不是用来保存代码的地址。这个地址就不进行测试了,因为是动态申请,很可能每次不同,因此大家了解就可以了。

硬件断点是由硬件进行支持的,它是硬件提供的调试寄存器组。通过这些硬件寄存器设置相应的值,然后让硬件断在需要下断点的地址。在CPU上有一组特殊的寄存器,被称作调试寄存器。该调试寄存器有8个,分别是DR0—DR7,用于设置和管理硬件断点。调试寄存器DR0—DR3用于存储所设置硬件断点的内存地址,由于只有4个调试寄存器可以用来存放地址,因此最多只能设置4个硬件断点。寄存器DR4和DR5是系统保留的,并没有公开其用处。调试寄存器DR6被称为调试状态寄存器,记录了上一次断点触发所产生的调试事件类型信息。调试寄存器DR7用于设置触发硬件断点的条件,比如硬件读断点、硬件访问断点或硬件执行断点。 

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/147931.html<

(0)
管理的头像管理
上一篇2025-03-11 22:16
下一篇 2025-03-11 22:17

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注