zoukankan      html  css  js  c++  java
  • 第30章:记事本WriteFile()API钩取(略)

    调试器进程经过注册后,每当调试者发生调试事件(Debug Event)时,OS就会暂停其运行,并向调试器报告相应事件.调试器处理事件后,被调试者继续运行.

    调试器必须处理EXCEPTION_BREAKPOINT异常,对应汇编指令为INT3,IA-32 编码为0xCC.

    调试器只需要在断点的起始位置将其改为Int 3(下钩),运行到那儿时,程序执行Int 3指令暂停,然后 EIP-1并将指令替换回去(脱钩). 

    查看代码:

    int main(int argc, char* argv[])
    {
        DWORD dwPID;
    
        if( argc != 2 )
        {
            printf("
    USAGE : hookdbg.exe <pid>
    ");
            return 1;
        }
    
        // Attach Process
        dwPID = atoi(argv[1]);
        if( !DebugActiveProcess(dwPID) )   //此 API 将调试器附加到 PID 所指的进程上
        {
            printf("DebugActiveProcess(%d) failed!!!
    "
                   "Error Code = %d
    ", dwPID, GetLastError());
            return 1;
        }
    
        // 调试器循环
        DebugLoop();
    
        return 0;
    }
    void DebugLoop()
    {
        DEBUG_EVENT de;
        DWORD dwContinueStatus;
    
        // 等待被调试者发生事件
        while( WaitForDebugEvent(&de, INFINITE) )
        {
            dwContinueStatus = DBG_CONTINUE; // 处理正常,则其值设置为DBF_CONTINUE;若无法处理或希望在应用程序的SEH中处理,
                            // 则设置其值为DBG_EXCEPTION_NOT_HANDLE.      
    // 被调试进程生成或者附加事件 if( CREATE_PROCESS_DEBUG_EVENT == de.dwDebugEventCode ) { OnCreateProcessDebugEvent(&de); } // 异常事件 else if( EXCEPTION_DEBUG_EVENT == de.dwDebugEventCode ) { if( OnExceptionDebugEvent(&de) ) continue; } // 被调试者进程终止事件 else if( EXIT_PROCESS_DEBUG_EVENT == de.dwDebugEventCode ) { // debuggee 终止 -> debugger 终止 break; } // 再次运行被调试者 ContinueDebugEvent(de.dwProcessId, de.dwThreadId, dwContinueStatus); } }
    BOOL OnCreateProcessDebugEvent(LPDEBUG_EVENT pde)
    {
        // 获取本程序的 WriteFile() API地址
        g_pfWriteFile = GetProcAddress(GetModuleHandleA("kernel32.dll"), "WriteFile");
    
        // API Hook - WriteFile()
        //   更改第一个 byte 为 0xCC (INT 3) 
        //   (orginal byte 是 g_chOrgByte 的备份)
        memcpy(&g_cpdi, &pde->u.CreateProcessInfo, sizeof(CREATE_PROCESS_DEBUG_INFO));
    ReadProcessMemory(g_cpdi.hProcess, g_pfWriteFile,
    &g_chOrgByte, sizeof(BYTE), NULL);
    WriteProcessMemory(g_cpdi.hProcess, g_pfWriteFile,
    &g_chINT3, sizeof(BYTE), NULL); return TRUE; }
  • 相关阅读:
    Luogu 1514 引水入城
    HDU 2196 Computer
    CF460C Present
    初等数论整理
    2019UMS培训day6解题报告
    2019UMS培训day5解题报告
    2019UMS培训day3解题报告
    Luogu 1731 生日蛋糕
    JavaWeb之ServletContext域对象
    c3p0连接池
  • 原文地址:https://www.cnblogs.com/Rev-omi/p/13401563.html
Copyright © 2011-2022 走看看