找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 226|回复: 0

昭姐每天一练- C++VEHHook

[复制链接]

30

主题

1

回帖

0

积分

版主

积分
0
发表于 2013-6-8 11:25:53 | 显示全部楼层 |阅读模式


#include "StdAfx.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <stdio.h>
#include <limits.h>
#include <Winbase.h>

typedef HANDLE (*OPENTHREAD) (DWORD dwFlag, BOOL bUnknow, DWORD dwThreadId);
OPENTHREAD g_lpfnOpenThread = NULL;

typedef LONG  (WINAPI *PVECTOREDEXCEPTIONHANDLER)(PEXCEPTION_POINTERS ExceptionInfo);

typedef PVOID (*ADDVECTOREEXCEPTIONHANDLER)(
    ULONG FirstHandler,
    PVECTOREDEXCEPTIONHANDLER VectoredHandler
);
ADDVECTOREEXCEPTIONHANDLER g_AddVectorExceptionHandler = NULL;

DWORD func_addr = 0x00401000;
DWORD func_addr_offset = func_addr + 0x2;

void PrintParameters(PCONTEXT debug_context)
{
    printf("EAX: %X EBX: %X ECX: %X EDX: %X\n",
        debug_context->Eax, debug_context->Ebx, debug_context->Ecx, debug_context->Edx);

    printf("ESP: %X EBP: %X\n",
        debug_context->Esp, debug_context->Ebp);

    printf("ESI: %X EDI: %X\n",
        debug_context->Esi, debug_context->Edi);
    printf("EIP: %X\n",
        debug_context->Eip);

    printf("arameters\n"
        "HWND: %X\n"
        "text: %s\n"
        "caption: %s\n",
        (HWND)(*(DWORD*)(debug_context->Esp + 0x4)),
        (char*)(*(DWORD*)(debug_context->Esp + 0x8)),
        (char*)(*(DWORD*)(debug_context->Esp + 0xC)));
   
}

void ChangeText(PCONTEXT debug_context) {
    char* text = (char*)(*(DWORD*)(debug_context->Esp + 0x8));
    int length = strlen(text);
    _snprintf(text, length, "WINSUN");
}

void __declspec(naked) ReturnOriginalFunc(void) {
    __asm {
        mov edi,edi
        jmp [func_addr_offset]
    }
}

LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) {
    if(ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) {
        if((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress == func_addr) {
            PCONTEXT debug_context = ExceptionInfo->ContextRecord;
            printf("Breakpoint hit!\n");
            debug_context->Eip=0x7629FD37;
            PrintParameters(debug_context);
            
            ChangeText(debug_context);
            debug_context->Eip = (DWORD)&ReturnOriginalFunc;
            return EXCEPTION_CONTINUE_EXECUTION;
        }
    }
    return EXCEPTION_CONTINUE_SEARCH;
}

void VEHHook(void)
{
    HANDLE hTool32 = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if(hTool32 != INVALID_HANDLE_VALUE)
    {
        THREADENTRY32 thread_entry32;
        thread_entry32.dwSize = sizeof(THREADENTRY32);
        FILETIME exit_time, kernel_time, user_time;
        FILETIME creation_time;
        FILETIME prev_creation_time;
        prev_creation_time.dwLowDateTime = 0xFFFFFFFF;
        prev_creation_time.dwHighDateTime = INT_MAX;
        HANDLE hMainThread = NULL;
        if(Thread32First(hTool32, &thread_entry32))
        {
   
            do { //取最早启动的线程作为hook对象
               
                if(thread_entry32.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(thread_entry32.th32OwnerProcessID)
                    && thread_entry32.th32OwnerProcessID == GetCurrentProcessId()
                    /*&& thread_entry32.th32ThreadID != GetCurrentThreadId()*/)
                {
                    HANDLE hThread = g_lpfnOpenThread(THREAD_SET_CONTEXT | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION,
                                                        FALSE, thread_entry32.th32ThreadID);
                    GetThreadTimes(hThread, &creation_time, &exit_time, &kernel_time, &user_time);
                    
                    if(CompareFileTime(&creation_time, &prev_creation_time) == -1)
                    {
                            //creation_time 小于 prev_creation_time时候为-1
                            memcpy(&prev_creation_time, &creation_time, sizeof(FILETIME));
                            if(hMainThread != NULL)
                                CloseHandle(hMainThread);
                            hMainThread = hThread;
                    }
                    else
                           CloseHandle(hThread);


                }
                thread_entry32.dwSize = sizeof(THREADENTRY32);
            } while(Thread32Next(hTool32, &thread_entry32));

            //(void)SetUnhandledExceptionFilter(ExceptionFilter);
            g_AddVectorExceptionHandler(1, ExceptionFilter);
            CONTEXT thread_context = {CONTEXT_DEBUG_REGISTERS};
            thread_context.Dr0 = func_addr;
            thread_context.Dr7 = (1 << 0);

            SetThreadContext(hMainThread, &thread_context);
            CloseHandle(hMainThread);
        }
        CloseHandle(hTool32);
    }
}

int APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID reserved)
{
    if(reason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);
        if(AllocConsole())
        {
            freopen("CONOUT$", "w", stdout);
            SetConsoleTitle("Console");
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
            printf("DLL loaded.\n");
        }

        HMODULE hDll = :oadLibrary("kernel32.dll");
        g_lpfnOpenThread =  (OPENTHREAD)::GetProcAddress(hDll, "OpenThread");
        func_addr = (DWORD)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
        func_addr_offset = func_addr+2;
        printf("MessageBoxA Addr: 0x%x\n",func_addr);
        g_AddVectorExceptionHandler = (ADDVECTOREEXCEPTIONHANDLER)GetProcAddress(GetModuleHandle("kernel32.dll"), "AddVectoredExceptionHandler");
        VEHHook();
    }
    return TRUE;
源码下载地址  http://share.weiyun.com/1256282fda6b84d0c886f2ae1f1ccec9
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 03:24 , Processed in 0.072482 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表