Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to create a trampoline function for hook
    primarykey
    data
    text
    <p>I'm interested in hooking and I decided to see if I could hook some functions. I wasn't interested in using a library like detours because I want to have the experience of doing it on my own. With some sources I found on the internet, I was able to create the code below. It's basic, but it works alright. However when hooking functions that are called by multiple threads it proves to be extremely unstable. If two calls are made at nearly the same time, it'll crash. After some research I think I need to create a trampoline function. After looking for hours all I was not able to find anything other that a general description on what a trampoline was. I could not find anything specifically about writing a trampoline function, or how they really worked. If any one could help me write one, post some sources, or at least point me in the right direction by recommending some articles, sites, books, etc. I would greatly appreciate it.</p> <p>Below is the code I've written. It's really basic but I hope others might learn from it.</p> <p>test.cpp</p> <pre><code>#include "stdafx.h" Hook hook; typedef int (WINAPI *tMessageBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); DWORD hMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) { hook.removeHook(); tMessageBox oMessageBox = (tMessageBox)hook.funcPtr; int ret =oMessageBox(hWnd, lpText, "Hooked!", uType); hook.applyHook(&amp;hMessageBox); return ret; } void hookMessageBox() { printf("Hooking MessageBox...\n"); if(hook.findFunc("User32.dll", "MessageBoxA")) { if(hook.applyHook(&amp;hMessageBox)) { printf("hook applied! \n\n"); } else printf("hook could not be applied\n"); } } </code></pre> <p>hook.cpp</p> <pre><code>#include "stdafx.h" bool Hook::findFunc(char* libName, char* funcName) { Hook::funcPtr = (void*)GetProcAddress(GetModuleHandleA(libName), funcName); return (Hook::funcPtr != NULL); } bool Hook::removeHook() { DWORD dwProtect; if(VirtualProtect(Hook::funcPtr, 6, PAGE_EXECUTE_READWRITE, &amp;dwProtect)) { WriteProcessMemory(GetCurrentProcess(), (LPVOID)Hook::funcPtr, Hook::origData, 6, 0); VirtualProtect(Hook::funcPtr, 6, dwProtect, NULL); return true; } else return false; } bool Hook::reapplyHook() { DWORD dwProtect; if(VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &amp;dwProtect)) { WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::hookData, 6, 0); VirtualProtect(funcPtr, 6, dwProtect, NULL); return true; } else return false; } bool Hook::applyHook(void* hook) { return setHookAtAddress(Hook::funcPtr, hook); } bool Hook::setHookAtAddress(void* funcPtr, void* hook) { Hook::funcPtr = funcPtr; BYTE jmp[6] = { 0xE9, //jmp 0x00, 0x00, 0x00, 0x00, //address 0xC3 //retn }; DWORD dwProtect; if(VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &amp;dwProtect)) // make memory writable { ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::origData, 6, 0); // save old data DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5); //((to)-(from)-5) memcpy(&amp;jmp[1], &amp;offset, 4); // write address into jmp memcpy(Hook::hookData, jmp, 6); // save hook data WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, jmp, 6, 0); // write jmp VirtualProtect(funcPtr, 6, dwProtect, NULL); // reprotect return true; } else return false; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload