软件调试
文章平均质量分 77
My classmates
QQ349561280
展开
-
1.调试对象
将一个程序拖拽进OD中,这种方式是通过 CreateProcess() 建立联系的。 程序正在运行中通过OD附加程序,这种方式是通过 DebugActiveProcess() 建立联系的。 DebugActiveProcess执行流程 <1> kernel32! DbaUiConnectToDbg() ntdll! DbgUiConnectToDbg() ntdll! ZwC...原创 2018-11-01 19:57:30 · 1073 阅读 · 1 评论 -
4.软件断点
调试的本质: 想办法让被调试程序触发异常 触发异常后就会向DEBUG_OBJECT里发送调试事件 调试器接管异常的过程 一般调试器都会有软件断点,内存断点,硬件断点… 其实这些无非就是想让被调试程序触发异常再让调试器来接管。 在OD中随便一个地址按下F2后程序执行到那就会被断下来,这时调试器将会拥有被调试程序的控制权,这个过程我们称为“中断到调试器”。 当我们在OD中按下F2其实就是将那个地...原创 2018-11-03 17:36:34 · 1954 阅读 · 0 评论 -
5.内存断点
原理就是对所设地址的属性设置为不可读不可写属性,这样当这个地址被访问或写入就会产生异常。 //改变内存地址内存页的属性 BOOL VirtualProtectEx( IN HANDLE hProcess,// 要修改内存的进程句柄 IN LPVOID lpAddress,// 要修改内存的起始地址 IN SIZE_T dwSize,// 页区域大小 IN DWORD flNewPr...原创 2018-11-03 21:53:22 · 606 阅读 · 0 评论 -
2.调试事件的采集
typedef struct _DEBUG_OBJECT { KEVENT EventsPresent; FAST_MUTEX Mutex; LIST_ENTRY EventList; union { ULONG Flags; struct { UCHAR DebuggerInacti...原创 2018-11-02 09:25:49 · 563 阅读 · 0 评论 -
6.硬件断点
调试寄存器 DR0~DR3:调试地址寄存器,用于设置硬件断点 DR4~DR5:保留,未公开具体作用 DR6:调试寄存器组状态寄存器 DR7:调试寄存器组控制寄存器 硬件断点的原理是使用DR0~DR3设置地址,使用DR7设置状态,因此最多设置4个。 <1> L0/G0 ~ L3/G3: L0/G0对应DR0,L1/G1对应DR1,以此类推…,用于控制Dr0~Dr3是否有效,Lx是局...原创 2018-11-04 15:34:13 · 3051 阅读 · 0 评论 -
3.调试事件的处理
调试器会有一个循环一直判断EventList有没有调试事件有就取出来处理。 调试器创建形式 关联调试器与被调试器进程 调试循环 每一种收集调试事件API都不一样,是因为它要收集调试事件的类型是不一样的。 这是异常要收集的调试事件 typedef struct _EXCEPTION_DEBUG_INFO { EXCEPTION_RECORD ExceptionRecord; ...原创 2018-11-02 15:50:42 · 1051 阅读 · 0 评论 -
7. SEH + 硬件断点HOOK
DLL #include<windows.h> #include <TlHelp32.h> #include <stdio.h> #include <limits.h> typedef HANDLE(WINAPI *OPENTHREAD) (DWORD dwFlag, BOOL bUnknow, DWORD dwThreadId); OPENTHR...原创 2018-11-04 20:34:37 · 2416 阅读 · 1 评论