Re[3]: Процесс, пославший TerminateProcess.
От: xmen  
Дата: 08.12.08 20:44
Оценка: +1
Здравствуйте, kregheck, Вы писали:

K>Здравствуйте, Аноним, Вы писали:


А>>без перехвата — никак


K>А можно поподробнее. Есть идеи как это реализовать?


/**************************************************************
 * Project: Hook API function TerminateProcess
 * 
 * Copyright 2008 xmen
 **************************************************************/

#pragma comment(linker, "-entry:DllEntryPoint")
#pragma comment(lib, "kernel32")
#pragma comment(lib, "user32")
#pragma warning(disable: 4508)

#include <windows.h>

extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);

SetHook();
UnHook();

//-----------------
#pragma pack(push)
#pragma pack(1)
typedef struct {
    BYTE    OpPush;
    LPVOID  addr;
    BYTE    OpRet;
} jmp;
#pragma pack(pop)

jmp buf, old;
//-----------------

BOOL
WINAPI
xxxTerminateProcess(
    IN HANDLE hProcess,
    IN UINT uExitCode
    )
{
    DWORD CurrPid =  GetProcessId(GetCurrentProcess());
    
    CHAR strCurrPid[0x20] = {0};
    wsprintf(strCurrPid, "Current PID: %d", CurrPid);
    
    HANDLE hProcess1;
    DuplicateHandle(GetCurrentProcess(),
                    hProcess,
                    GetCurrentProcess(),
                    &hProcess1,
                    PROCESS_QUERY_INFORMATION,
                    TRUE,
                    0);

    DWORD TermPid =  GetProcessId(hProcess1);
    CHAR strTermPid[0x20] = {0};
    wsprintf(strTermPid, "TerminateProcess(PID: %d)", TermPid);
    
    MessageBox(NULL, strTermPid, strCurrPid, 0x40);
    
    UnHook();
    
    BOOL r = TerminateProcess(hProcess, uExitCode);
    
    SetHook();
    
    return r;
}

SetHook()
{
    jmp *pbuf = &buf;
    
    pbuf->OpPush = 0x68;
    pbuf->addr   = &xxxTerminateProcess;
    pbuf->OpRet  = 0xC3;
    
    WriteProcessMemory(INVALID_HANDLE_VALUE,
                       &TerminateProcess,
                       &buf,
                       sizeof(jmp),
                       0);
}

UnHook()
{
    WriteProcessMemory(INVALID_HANDLE_VALUE,
                       &TerminateProcess,
                       &old,
                       sizeof(jmp),
                       0);
}

BOOL WINAPI
DllEntryPoint(HINSTANCE hInstance, ULONG ulReason, LPVOID pv)
{
    switch(ulReason)
    {
        case DLL_PROCESS_ATTACH:
            ReadProcessMemory(INVALID_HANDLE_VALUE,
                              &TerminateProcess,
                              &old,
                              sizeof(jmp),
                              0);
            SetHook();
            break;
        
        case DLL_PROCESS_DETACH:
            UnHook();
            break;
    }
    
    return TRUE;
}


http://files.rsdn.ru/59750/HTP.rar
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.