api钩子

作者: Sadmess | 来源:发表于2019-03-29 22:48 被阅读0次
#include "windows.h"
#include "stdio.h"

LPVOID g_pfWriteFile = NULL;
CREATE_PROCESS_DEBUG_INFO g_cpdi;
BYTE g_chINT3 = 0xCC, g_chOrgByte = 0;

BOOL OnCreateProcessDebugEvent(LPDEBUG_EVENT pde)
{
    g_pfWriteFile = GetProcAddress(GetModuleHandleA("kernel32.dll"), "WriteFile");

    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;
}

BOOL OnExceptionDebugEvent(LPDEBUG_EVENT pde)
{
    CONTEXT ctx;
    PBYTE lpBuffer = NULL;
    DWORD dwNumOfBytesToWrite, dwAddrOfBuffer, i;
    PEXCEPTION_RECORD per = &pde->u.Exception.ExceptionRecord;

    
    if( EXCEPTION_BREAKPOINT == per->ExceptionCode )
    {
        if( g_pfWriteFile == per->ExceptionAddress )
        {
           
            WriteProcessMemory(g_cpdi.hProcess, g_pfWriteFile, 
                               &g_chOrgByte, sizeof(BYTE), NULL);

           
            ctx.ContextFlags = CONTEXT_CONTROL;
            GetThreadContext(g_cpdi.hThread, &ctx);

            
            ReadProcessMemory(g_cpdi.hProcess, (LPVOID)(ctx.Esp + 0x8), 
                              &dwAddrOfBuffer, sizeof(DWORD), NULL);
            ReadProcessMemory(g_cpdi.hProcess, (LPVOID)(ctx.Esp + 0xC), 
                              &dwNumOfBytesToWrite, sizeof(DWORD), NULL);

            
            lpBuffer = (PBYTE)malloc(dwNumOfBytesToWrite+1);
            memset(lpBuffer, 0, dwNumOfBytesToWrite+1);

            
            ReadProcessMemory(g_cpdi.hProcess, (LPVOID)dwAddrOfBuffer, 
                              lpBuffer, dwNumOfBytesToWrite, NULL);
            printf("\n### original string ###\n%s\n", lpBuffer);

            for( i = 0; i < dwNumOfBytesToWrite; i++ )
            {
                if( 0x61 <= lpBuffer[i] && lpBuffer[i] <= 0x7A )
                    lpBuffer[i] -= 0x20;
            }

            printf("\n### converted string ###\n%s\n", lpBuffer);

            
            WriteProcessMemory(g_cpdi.hProcess, (LPVOID)dwAddrOfBuffer, 
                               lpBuffer, dwNumOfBytesToWrite, NULL);
            
            
            free(lpBuffer);

            
            ctx.Eip = (DWORD)g_pfWriteFile;
            SetThreadContext(g_cpdi.hThread, &ctx);

            
            ContinueDebugEvent(pde->dwProcessId, pde->dwThreadId, DBG_CONTINUE);
            Sleep(1);

            
            WriteProcessMemory(g_cpdi.hProcess, g_pfWriteFile, 
                               &g_chINT3, sizeof(BYTE), NULL);

            return TRUE;
        }
    }

    return FALSE;
}

void DebugLoop()
{
    DEBUG_EVENT de;
    DWORD dwContinueStatus;

    
    while( WaitForDebugEvent(&de, INFINITE) )
    {
        dwContinueStatus = DBG_CONTINUE;

        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 )
        {
            break;
        }
        ContinueDebugEvent(de.dwProcessId, de.dwThreadId, dwContinueStatus);
    }
}

int main(int argc, char* argv[])
{
    DWORD dwPID;

    if( argc != 2 )
    {
        printf("\nUSAGE : hookdbg.exe <pid>\n");
        return 1;
    }

    dwPID = atoi(argv[1]);
    if( !DebugActiveProcess(dwPID) )
    {
        printf("DebugActiveProcess(%d) failed!!!\n"
               "Error Code = %d\n", dwPID, GetLastError());
        return 1;
    }

    DebugLoop();

    return 0;
}

关于sleep(1)的作用,理论上sleep(0)就会交接线程,然鹅实际测试中还是导致了直接下断点而没有执行api的情况,索性改为sleep(1),就慢一毫秒吧哈哈哈。

另:debug勾取api相关函数不收录了,个人感觉学习意义不大////逃

相关文章

  • api钩子

    关于sleep(1)的作用,理论上sleep(0)就会交接线程,然鹅实际测试中还是导致了直接下断点而没有执行api...

  • JNA User32 Api使用参考

    常用的user32API说明JNA改变窗口状态和键盘钩子键盘钩子

  • 1-1、Vue3 生命周期

    详情: 生命周期钩子 API 手册[https://staging-cn.vuejs.org/api/compos...

  • Vue API 概览

    API 全局配置 全局 API 选项 / 数据 选项 / DOM 选项 / 生命周期钩子 选项 / 资源 选项 /...

  • Vue3 生命周期钩子函数

    官方文档 生命周期钩子函数 - [https://composition-api.vuejs.org/zh/api...

  • vue3 生命周期

    vue2 到 vue3 生命周期钩子映射关系 Vue 2.0Vue 3.0 选项式 api(Options API...

  • Vue3+TS Day17 - 生命周期钩子、Provide、C

    一、Composition API补充 1、生命周期钩子? 2、Provide 和 Inject使用? 3、Com...

  • 理解hook

    任何一个模块可以通过额外的或者可选的钩子来扩展API,通过在这些钩子处插入额外的逻辑,执行这些逻辑自定的功能,其他...

  • Vue3中组合式API中的生命周期钩子

    Vue在setup中也注册一些生命周期钩子函数,这些钩子函数与选项式API的名称相似,但前缀为 on 为了方便我将...

  • Native Hook方案

    Hook翻译过来就是“钩子”的意思,是指截获进程对某个API函数的调用,使得API的执行流程转向到我们自己实现的代...

网友评论

      本文标题:api钩子

      本文链接:https://www.haomeiwen.com/subject/syrdbqtx.html