首页
社区
课程
招聘
[讨论]软件调试学习笔记4.1
发表于: 2020-1-16 23:42 2709

[讨论]软件调试学习笔记4.1

2020-1-16 23:42
2709

目录

测试使用环境VS 2019

相关词汇

中断 break
断点 breakpoint
落实断点 resolve breakpoint
断点异常 BP breakpoint exception
边界 limit
通用性保护异常GP General Protection Exception


软件中断

实践注入代码手工设置断点

#include <windows.h>
#include <cstdlib>

int main(int argc, char* argv[])
{
    // manual breakpoint
    //_asm INT 3;//默认把_asm INT 3;这句断点指令注释掉
    printf("Hello INT 3!\n");
    system("pause");
    return 0;
}

INT 3 指令为断点指令
INT 3 指令的设计目的是中断到调试器
INT 3 指令产生的断点是依靠插入指令和软件中断机制工作的。
INT 3 断点异常属于陷阱类异常,常规当CPU产生异常时,程序指针是指向导致异常的下一条指令。观察汇编窗口发现确是指向导致异常的这条指令,原因是操作系统为了支持调试对程序指针做了调整。

 

调试器设置断点的步骤:首先对代码中某行设置断点时,(1)调试器会把这里本来指令的第一个字节保存起来,(2)然后写入一条INT 3指令。[ INT 3指令的机器码是11001100b,十六进制0xCC ],仅1字节,设置和取消断点时需要保存恢复一个字节。

 

扩展知识:断点的设置信息保存在当前目录下的同名.opt文件中。

 

落实断点:VS 2019一个一个地取出OPT文件中的断点记录(断点所在的文件和行位置),将断点设置到目标代码的内存映像中,将断点位置对应的指令的第一个字节先保存起来,在替换为0xCC。替换是在启动调试时和调试过程中动态进行的。

 

落实断点过程中可能发生问题:某个断点的位置根本对应不到目标映像的代码段。
测试下图操作,在不调试的情况下直接在代码中添加上_asm INT 3;

 



CPU在实模式时执行INT 3的过程

当CPU执行INT 3指令的过程就是产生断点异常,并转去执行异常处理例程的过程。在跳转到处理例程之前,CPU会保存当前的执行上下文,包括段寄存器、程序指针寄存器等。

REAL-ADDRESS-MODE:
IF((vector_number*4)+3) (* is not within IDT limit 是否在IDT限制之内;检查根据中断向量号计算出向量地址是否超出了中断标的边界,实模式下,中断向量表的每个表项是个字节,分贝处理例程的段(两字节)和偏移地址(两字节)*)
THEN #GP;(* 如果超出,产生保护性错误异常 *)
FI;
IF (* stack not large enough for a 6-byte return information,堆栈不够大,不能返回6字节;检查栈上是否有足够的空间来保存寄存器,当堆栈不足以容纳要压入的6字节的内容时(CS、IP、EFLAGS的低16位),产生堆栈异常#SS *)
THEN #SS;
FI;
Push (EFLAGS[15:0]);(* 清除标志寄存器的IF,TF,AC位 *)
IF ← 0;
TF ← 0;
AC ← 0;
Push (CS);(* 当前段的寄存器和程序指针寄存器的内容保存在当前程序的栈 *)
Push (IP);
(* No error codes are pushed 没有错误代码被推送 *)
CS ← IDT (Descriptor (vector_number*4),selector);(* 将注册在中断向量表(IDT)中的异常处理例程的入口地址 *)
EIP ← IDT (Descriptor (vector_number*4),offset);(* 16 bit offset ADN 0000FFFFH *)
END

扩展知识:为了辅助调试,编译器在编译调试版时会用0xCC来填充刚分配的缓冲区,如果因为缓冲区或堆栈溢出时程序指针意外指向这些区域,会因为遇到INT 3指令而马上中断到调试器。编译器还使用INT 3指令来填充函数或代码段末尾的空闲区域(用于内存对齐)。

软件断点的局限性

1:可以让CPU执行到代码段内的某个地址时停下来,不适用与数据段和I/O空间。
2:对于在ROM只读存储器中执行的程序[ BIOS 或其他固件程序 ],无法动态增加软件断点。目标内存是只读的,无法动态写入断点指令。
3:在中断向量表或中断描述表没有准备好或遭到破话的情况下,这类断点无法或不能正常工作的。常见场景[ 系统刚刚启动时,或中断描述表被病毒篡改 ]。

软件断点的优点:使用方便,没有数量限制


u `hiint3!HiInt3.cpp:11`

硬件断点

陷阱标志

实模式调试器例子解析

未完


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-1-17 03:52 被陈阿姨编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//