1. 关于中断和异常的说法错误的是()
    中断和异常是由中断处理器和异常处理器分别管理的 统一管理的
    中断通常是指由外部设备引发的
    异常通常是指由CPU内部产生的
    可以改变代码的执行流程

  2. 根据CPU报告异常的方式和导致异常的指令是否可以安全的执行,IA-32CPU将异常分为三类,下面哪个不是()
    错误
    中止
    陷阱
    断言

  3. 关于错误类异常和陷阱类异常的说法错误的是()
    除零错误,页访问错误和INT3都属于错误类异常 int3属于陷阱类异常
    都属于可修复的异常
    触发陷阱类异常时CPU处理完异常后继续在导致异常的那条指令的下一条上执行
    触发错误类异常时CPU处理完异常后继续在导致异常的那条指令上执行

  4. 关于IDT的说法错误的是()
    在windbg中通过idt命令可查看其内容 !idt
    IDT 就是中断描述符表
    IDT表是由操作系统在启动初期进行初始化的
    IDT表中共有256项

  5. 关于异常分发的说法错误的是()
    最多给每个异常两轮的处理机会
    异常产生后会尝试发送给调试器,如果没有就会发送给异常处理快
    不论用户态还是内核态异常都是通过KiDispatchException函数分发
    用户态异常分发都是两轮,而内核则不确定 都是两轮

6. Windows使用EXCEPTION_RECORD结构来描述异常,对此结构的描述错误的是()
typedef struct _EXCEPTION_RECORD

  1. {
  2. DWORD ExceptionCode;
  3. DWORD ExceptionFlags;
  4. struct _EXCEPTION_RECORD* ExceptionRecord;
  5. PVOID ExceptionAddress;
  6. DWORD NumberParameters;
  7. ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];

}EXCEPTION_RECORD,*PEXCEPTION_RECORD;

ExceptionAddress 记录异常发生的地址
产生内存访问异常时,ExceptionInformation下标为1的元素保存错误原因 是异常地址
ExceptionCode表示异常代码,如:0x80000003表示INT3异常。c0000005空指针异常,内存访问异常
ExceptionFlags 用来记录异常标志,如第一位置1,说明这是个不可恢复执行的异常。exceptionflags的值为1,则表示不可继续的异常,exceptionflags值为0,表示可继续的异常

  1. 对SEH的理解错误的是()
    SEH可以嵌套使用终结处理和异常处理
    SEH提供两种功能,一是终结处理(try,finally),一是异常处理(try,except)
    try,except之后可以再跟一个__finally,前提是块与块之间是相邻的 块于块是成对出现的可以
    中文翻译即结构化异常处理

  2. 关于SEH的终结处理的理解错误的是()
    如果在main函数中,当try块中执行return后finally块是不会被执行的
    try,finally是Visual C++编译器为支持SEH专门定义的关键字 其他编译器没有该关键字,比如dev_c++就没有
    try块中执行ExitThread或ExitProcess等函数时,finally块是不会被执行的
    __finally块常用来做状态恢复或资源的释放等工作

  3. 关于SEH的异常处理的理解错误的是()
    过滤表达式既可以是常量、函数调用,也可以是条件表达式或其他表达式。
    当过滤表达式的值是0时,说明“我处理不了,找找其他人看能不能处理”。
    当过滤表达式的值是-1时,except块不会被执行
    GetExceptionCode和GetExceptionInformation函数只能在过滤表达式中使用 过滤表达式是
    except(过滤表达式),并不一定这里使用

    10. 关于VEH的理解错误的是()
    如果程序中既有SEH也有VEH,那么出现异常时,VEH将优先被调用。
    AddVectoredExceptionHandler函数用于注册VEH处理函数
    VEH回调函数的参数类型是PEXCEPTION_RECORD类型 struct _EXCEPTION_POINTERS *
    与SEH不同,VEH只能在用户态程序中使用

  4. 关于SEH和VEH的不同之处说法错误的是()
    注册信息的存储位置相同,都在函数栈中。
    windows从xp以后,提供了一种简称为VEH(向量化异常处理)的机制,这个VEH呢,是对整个进程来说是全局的(SEH是针对线程的)异常捕获技术
    image.png
    它们的作用范围不同,在进程里VEH全局有效,SEH会随着函数的返回而被注销。
    从应用范围来说,VEH要求系统版本是Windows XP或更高,而SEH没有这方面要求。
    image.png
    从编译角度讲,SEH的注册和登记是依赖编译器编译时所生成的数据结构和代码,而VEH是系统API调用显式完成的,不需要编译器的特别处理。

  5. 关于VCH的说法错误的是()
    通过API AddVectoredContinueHandler函数来注册VCH
    从作用范围讲VCH与VEH一样都是进程内全局有效的
    VCH的注册信息是保存在进程堆中的
    进程中有VCH和SEH时,产生异常后VCH会优先于SEH,处理异常

  6. 对TEB的理解错误的是()
    TEB指的是线程环境块,存在于用户层中
    通过FS寄存器可以找到TEB的首地址
    SEH链的首地址可通过TEB找到
    TEB的0x18偏移处是PEB结构的首地址 0x30

  7. 内核态的异常分发过程描述错误的是是()
    内核调试器可能会接收到两次异常信息
    如果异常最终不能被处理就会引发蓝屏死机
    如果调试器没有处理或调试器不存在那么会交给SEH和VEH处理
    异常信息会优先发送给内核调试器

  8. 以下属于静态反调试的是()
    补丁检查
    检测PEB中的BeinDebug标记位 其他三个都是动态的
    使用SEH异常
    时间检测

  9. 以下反调试方法中,哪种方法是在main函数之前执行的()
    使用SEH异常反调试
    检测父进程
    使用TLS反调试 局部线程存储,有模块加载或者卸载都会调用tls线程回调函数 只有单步不行,其他应该都可以
    单步检测

  10. 对软件断点的说法错误的是()
    其原理是修改指令的一个字节为0xCC 第一个字节
    软件断点是由INT 3指令引发的
    软件断点属于陷阱类异常
    软件断点只能设置执行断点,无法设置数据访问断点 数据访问断点属于内存访问断点

  11. 对调试寄存器的说法错误的是() DR0~7
    DR6用来鉴别是哪个硬件断点被触发了
    DR0~DR3用来保存下断地址
    用于调试支持,设置硬件断点。
    DR4和DR5用来保存断点地址

  12. 对硬件断点理解错误的是()
    硬件断点最多设置4个
    设置的数据访问断点属于错误类异常 硬件断点下的数据
    当设置硬件执行断点时,其长度只能设置为1字节 可变
    设置硬件断点是通过线程上下文来设置的,即:SetThreadContext函数

  13. 对内存断点理解错误的是
    内存断点在同一内存页上只能设置一个断点 想多少就多少个,
    内存断点可以设置执行断点,也可以设置数据访问断点
    内存断点触发的异常属于错误类异常
    原理是通过修改下断地址所在的内存页属性,触发内存访问异常使程序断下来

软件断点:修改指令第一个字节为cc

image.png

image.png

image.png
image.png

硬件断点

image.png
image.png

内存断点

image.png

条件断点