kmode exception
Seçkin Üye
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;
}