C++ x86 Hooking (function detouring)

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
kmode exception
Seçkin Üye
Katılım
18 Tem 2022
Mesajlar
325
Çözümler
9
Tepki puanı
87
Ödüller
3
Sosyal
3 HİZMET YILI
C++:
#include <windows.h>
#include <iostream>
#include "pch.h"


bool Hooking(void* TargetAddress, void* MyFunction, int byteLength)
{
    if (byteLength >= 5)
    {
        DWORD OldProtection;
        VirtualProtect(TargetAddress, byteLength, PAGE_EXECUTE_READWRITE, &OldProtection); //Bellek bölgesi artık okunabilir&yazılabilir

        DWORD RelevantAddress = ((DWORD)MyFunction - (DWORD)TargetAddress) - 5; //İki adres arasındaki farkı al, 5 çıkar.
        //x86 assembly'de CALL JMP gibi komutlar 5 byte'dır
        
        *(BYTE*)TargetAddress = 0xE9;  // 0xE9 = assembly x86 jmp
        *(DWORD*)((DWORD)TargetAddress + 1) = RelevantAddress; // JMP komutunun addresini belirler
        //x86 assembly'de Belirli bir bayt'ı değiştirmek için 1 ekleriz.

        DWORD TempProtection;
        VirtualProtect(TargetAddress, byteLength, OldProtection, &TempProtection); // Programın çökmemesi için koruma seviyesini eski haline alır

        return true;
    }
    else
    {
        return false;
    }
}


DWORD jmp;

_declspec(naked) void MyFunction() // yerine geçicek fonksiyonumuz
{
    _asm
    {
        sub eax, 07
        jmp [jmp]
    }
}

DWORD WINAPI MainThread(LPVOID parameter)
{
    int HookLength = 8; // byte zıplama uzunluğu

    DWORD HookAddress = 0x123456; // adres
    jmp = HookAddress + HookLength;

    if (Hooking((void*)HookAddress, MyFunction, HookLength))
        MessageBoxA(NULL, "yep", "hook completed", NULL);
    else
    {
        MessageBoxA(NULL, "nah", "fail!", NULL);
    }

    while (true)
    {
        if (GetAsyncKeyState(VK_END))
        {
            break;
        }

        Sleep(60);
    }

    MessageBoxA(NULL, "cya", "bye", NULL);
    FreeLibraryAndExitThread((HMODULE)parameter, 0);

    return 0;
}

BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
            CreateThread(NULL, NULL, MainThread, hModule, NULL, NULL);
            break;
    }

    return TRUE;
}
 
Seçkin Üye
Katılım
12 Kas 2017
Mesajlar
320
Tepki puanı
14
Ödüller
8
Yaş
31
8 HİZMET YILI
Eline sağlık kardeşim aranıyordu güzel olmuş paylaşman
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst