下断点拦截数据,原理就是对目标进程进行下断点调试。
设置断点的原理就是在某个地址写入0xCC。对某个地址设置断点之后,当被调试的目标进程运行到这个地址,就会报错抛出异常给我们的调试进程。我们的调试进程就可以拿到当前的环境数据。
拿到数据之后,就要让目标进程继续正常执行了,这时候是先把0xCC恢复成原本的内容;然后EIP减一,让当前的指令重新正常执行;
但这个时候断点已经恢复,想重复拦截数据的话就需要重新设置断点:设置单步标志,当前的指令重新正常执行之后,触发单步异常,这个时候再重新下断点就可以了。
/
/
被调试的进程
ID
static DWORD g_processID
=
0
;
/
/
将进程改为被调试状态
DebugActiveProcess(g_processID);
/
/
退出调试的时候,不关闭被调试进程
BOOL
kRet
=
DebugSetProcessKillOnExit(false);
/
/
被调试的进程
ID
static DWORD g_processID
=
0
;
/
/
将进程改为被调试状态
DebugActiveProcess(g_processID);
/
/
退出调试的时候,不关闭被调试进程
BOOL
kRet
=
DebugSetProcessKillOnExit(false);
/
/
保存断点地址和对应的内存内容,用于恢复断点
static
map
<DWORD, BYTE> g_mBpAddress2Content;
/
/
添加断点,原理就是写入
0xCC
,程序运行到这里,会触发异常
BOOL
CBreakPointHelper::AddBreakPoint(DWORD address)
{
BYTE content;
SIZE_T bytesRead;
BOOL
rRet
=
ReadProcessMemory(g_hProcess, (LPCVOID)address, &content,
1
, &bytesRead);
BYTE intInst
=
0xCC
;
SIZE_T byteWriten;
BOOL
wRet
=
WriteProcessMemory(g_hProcess, (LPVOID)address, &intInst,
1
, &byteWriten);
if
(wRet) g_mBpAddress2Content[address]
=
content;
return
rRet && wRet;
}
/
/
删除断点,原理就是把原本的内存内容写回去
BOOL
CBreakPointHelper::DelBreakPoint(DWORD address)
{
if
(g_mBpAddress2Content.count(address) <
=
0
)
return
false;
SIZE_T byteWriten;
BYTE content
=
g_mBpAddress2Content[g_resetUserBpAddress];
WriteProcessMemory(g_hProcess, (LPVOID)(address), &(content),
1
, &byteWriten);
return
true;
}
/
/
保存断点地址和对应的内存内容,用于恢复断点
static
map
<DWORD, BYTE> g_mBpAddress2Content;
/
/
添加断点,原理就是写入
0xCC
,程序运行到这里,会触发异常
BOOL
CBreakPointHelper::AddBreakPoint(DWORD address)
{
BYTE content;
SIZE_T bytesRead;
BOOL
rRet
=
ReadProcessMemory(g_hProcess, (LPCVOID)address, &content,
1
, &bytesRead);
BYTE intInst
=
0xCC
;
SIZE_T byteWriten;
BOOL
wRet
=
WriteProcessMemory(g_hProcess, (LPVOID)address, &intInst,
1
, &byteWriten);
if
(wRet) g_mBpAddress2Content[address]
=
content;
return
rRet && wRet;
}
/
/
删除断点,原理就是把原本的内存内容写回去
BOOL
CBreakPointHelper::DelBreakPoint(DWORD address)
{
if
(g_mBpAddress2Content.count(address) <
=
0
)
return
false;
SIZE_T byteWriten;
BYTE content
=
g_mBpAddress2Content[g_resetUserBpAddress];
WriteProcessMemory(g_hProcess, (LPVOID)(address), &(content),
1
, &byteWriten);
return
true;
}
DEBUG_EVENT debugEvent;
while
(WaitForDebugEvent(&debugEvent, INFINITE))
{
switch (debugEvent.dwDebugEventCode)
{
case EXCEPTION_DEBUG_EVENT:
OnException(&debugEvent);
break
;
}
ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId, DBG_CONTINUE);
}
DEBUG_EVENT debugEvent;
while
(WaitForDebugEvent(&debugEvent, INFINITE))
{
switch (debugEvent.dwDebugEventCode)
{
case EXCEPTION_DEBUG_EVENT:
OnException(&debugEvent);
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课