
软件调试
文章平均质量分 77
My classmates
QQ349561280
展开
-
1.调试对象
将一个程序拖拽进OD中,这种方式是通过 CreateProcess() 建立联系的。程序正在运行中通过OD附加程序,这种方式是通过 DebugActiveProcess() 建立联系的。DebugActiveProcess执行流程<1> kernel32! DbaUiConnectToDbg()ntdll! DbgUiConnectToDbg()ntdll! ZwC...原创 2018-11-01 19:57:30 · 1173 阅读 · 1 评论 -
4.软件断点
调试的本质:想办法让被调试程序触发异常触发异常后就会向DEBUG_OBJECT里发送调试事件调试器接管异常的过程一般调试器都会有软件断点,内存断点,硬件断点… 其实这些无非就是想让被调试程序触发异常再让调试器来接管。在OD中随便一个地址按下F2后程序执行到那就会被断下来,这时调试器将会拥有被调试程序的控制权,这个过程我们称为“中断到调试器”。当我们在OD中按下F2其实就是将那个地...原创 2018-11-03 17:36:34 · 1996 阅读 · 0 评论 -
5.内存断点
原理就是对所设地址的属性设置为不可读不可写属性,这样当这个地址被访问或写入就会产生异常。//改变内存地址内存页的属性BOOL VirtualProtectEx( IN HANDLE hProcess,// 要修改内存的进程句柄 IN LPVOID lpAddress,// 要修改内存的起始地址 IN SIZE_T dwSize,// 页区域大小 IN DWORD flNewPr...原创 2018-11-03 21:53:22 · 643 阅读 · 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 · 588 阅读 · 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 · 3150 阅读 · 0 评论 -
3.调试事件的处理
调试器会有一个循环一直判断EventList有没有调试事件有就取出来处理。调试器创建形式关联调试器与被调试器进程调试循环每一种收集调试事件API都不一样,是因为它要收集调试事件的类型是不一样的。这是异常要收集的调试事件typedef struct _EXCEPTION_DEBUG_INFO { EXCEPTION_RECORD ExceptionRecord; ...原创 2018-11-02 15:50:42 · 1089 阅读 · 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 · 2482 阅读 · 1 评论