首页
社区
课程
招聘
[原创]断点拦截局部数据
发表于: 2021-2-5 10:46 5886

[原创]断点拦截局部数据

2021-2-5 10:46
5886

  下断点拦截数据,原理就是对目标进程进行下断点调试。

  设置断点的原理就是在某个地址写入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);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 4402
活跃值: (1366)
能力值: ( LV7,RANK:113 )
在线值:
发帖
回帖
粉丝
2
条件记录断点不香?
2021-2-8 14:22
0
游客
登录 | 注册 方可回帖
返回
//