Repository files navigation

HookEngine API Overview

HookEngine is a professional hooking engine for instrumenting arbitrary Win32 functions, COM objects, and functions which symbols are located in program databases (PDBs). It can intercept unmanaged code in 32-bit and 64-bit applications. It is implemented as a native component, writed with C++. HookEngine created in 2013 and widely used in GameNet application.

HookEngine offers a unique programmer friendly API which resolves the complexities associated with binary instrumentation so that even software engineers without expertise in the field can use it. Deviare takes care of code injection and parameter marshalling. Intercepting applications is a complex task. We test multiple application environments to ensure that the end user has a trouble-free experience. HookEngine also has a focus on maximum ease of use as soon as possible.

It can be used in several like: tracing and debugging, sandboxing and browser security, malware analysis, video conference recording, and gaming.

Why HookEngine?

  • Used in real life application with vast geography and many millions of users.
  • Well tested
  • Supports stdcall, template, thiscall hooks out of box.
  • Simple - less then 5 minuted before you start.

Requirements

Microsoft Visual Studio 2010

Simple Usage

Let`s try to make hook for MessageBoxA function from

#include <HookEngine/HookEngine.h>
#include <Windows.h>
typedef int (__stdcall *fnMessageBox)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
// This function is almost same as original but calling convention is __fastcall now. Also It has two additional arguments.
// In second argument we expect original function address. First argument is unused.
int __fastcall MessageBoxAHook(int unused, fnMessageBox original, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return original(hWnd, "BAZINGA!", lpCaption, uType);
}
void main()
{
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
HMODULE user32 = GetModuleHandleA("User32.dll");
uint32_t original = (uint32_t)GetProcAddress(user32, "MessageBoxA");
HookEngine::instance()
->fasthook(original, (uint32_t)MessageBoxAHook);
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
}

And it can be even more simple:

#include <HookEngine/HookEngine.h>
#include <Windows.h>
void main()
{
auto messageBoxAHook = HookEngine::createHook<
HookEngine::Stdcall, // target function calling convention
int, // return type
HWND hWnd, //first argument type
LPCSTR, //second argument type
LPCSTR, //third argument type
UINT //fourth argument type
>("User32.dll", "MessageBoxA");
// Set hook function.
messageBoxAHook->assignHook([messageBoxAHook](HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) -> int {
messageBoxAHook->original(0, "Hello from my first Hook!", "Warning", MB_OK); //Call our payload
return messageBoxAHook->original(hWnd, lpText, lpCaption, uType); //and original
});
}

Advanced Usage

Look at Example folder for more examples of usage. Fill free to add Feature Request of question.

Credits

Originally HookEngine was written as a part of GameNet project by Ilya Tkachenko (ilyamsu at gmail.com) the lead developer of GameNet application.

License

Released under the MIT license.

About

No description, website, or topics provided.

Resources

Stars

33 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

HookEngine API Overview

HookEngine is a professional hooking engine for instrumenting arbitrary Win32 functions, COM objects, and functions which symbols are located in program databases (PDBs). It can intercept unmanaged code in 32-bit and 64-bit applications. It is implemented as a native component, writed with C++. HookEngine created in 2013 and widely used in GameNet application.

HookEngine offers a unique programmer friendly API which resolves the complexities associated with binary instrumentation so that even software engineers without expertise in the field can use it. Deviare takes care of code injection and parameter marshalling. Intercepting applications is a complex task. We test multiple application environments to ensure that the end user has a trouble-free experience. HookEngine also has a focus on maximum ease of use as soon as possible.

It can be used in several like: tracing and debugging, sandboxing and browser security, malware analysis, video conference recording, and gaming.

Why HookEngine?

  • Used in real life application with vast geography and many millions of users.
  • Well tested
  • Supports stdcall, template, thiscall hooks out of box.
  • Simple - less then 5 minuted before you start.

Requirements

Microsoft Visual Studio 2010

Simple Usage

Let`s try to make hook for MessageBoxA function from

#include <HookEngine/HookEngine.h>
#include <Windows.h>
typedef int (__stdcall *fnMessageBox)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
// This function is almost same as original but calling convention is __fastcall now. Also It has two additional arguments.
// In second argument we expect original function address. First argument is unused.
int __fastcall MessageBoxAHook(int unused, fnMessageBox original, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return original(hWnd, "BAZINGA!", lpCaption, uType);
}
void main()
{
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
HMODULE user32 = GetModuleHandleA("User32.dll");
uint32_t original = (uint32_t)GetProcAddress(user32, "MessageBoxA");
HookEngine::instance()
->fasthook(original, (uint32_t)MessageBoxAHook);
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
}

And it can be even more simple:

#include <HookEngine/HookEngine.h>
#include <Windows.h>
void main()
{
auto messageBoxAHook = HookEngine::createHook<
HookEngine::Stdcall, // target function calling convention
int, // return type
HWND hWnd, //first argument type
LPCSTR, //second argument type
LPCSTR, //third argument type
UINT //fourth argument type
>("User32.dll", "MessageBoxA");
// Set hook function.
messageBoxAHook->assignHook([messageBoxAHook](HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) -> int {
messageBoxAHook->original(0, "Hello from my first Hook!", "Warning", MB_OK); //Call our payload
return messageBoxAHook->original(hWnd, lpText, lpCaption, uType); //and original
});
}

Advanced Usage

Look at Example folder for more examples of usage. Fill free to add Feature Request of question.

Credits

Originally HookEngine was written as a part of GameNet project by Ilya Tkachenko (ilyamsu at gmail.com) the lead developer of GameNet application.

License

Released under the MIT license.

About

No description, website, or topics provided.

Resources

Stars

33 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

HookEngine API Overview

HookEngine is a professional hooking engine for instrumenting arbitrary Win32 functions, COM objects, and functions which symbols are located in program databases (PDBs). It can intercept unmanaged code in 32-bit and 64-bit applications. It is implemented as a native component, writed with C++. HookEngine created in 2013 and widely used in GameNet application.

HookEngine offers a unique programmer friendly API which resolves the complexities associated with binary instrumentation so that even software engineers without expertise in the field can use it. Deviare takes care of code injection and parameter marshalling. Intercepting applications is a complex task. We test multiple application environments to ensure that the end user has a trouble-free experience. HookEngine also has a focus on maximum ease of use as soon as possible.

It can be used in several like: tracing and debugging, sandboxing and browser security, malware analysis, video conference recording, and gaming.

Why HookEngine?

  • Used in real life application with vast geography and many millions of users.
  • Well tested
  • Supports stdcall, template, thiscall hooks out of box.
  • Simple - less then 5 minuted before you start.

Requirements

Microsoft Visual Studio 2010

Simple Usage

Let`s try to make hook for MessageBoxA function from

#include <HookEngine/HookEngine.h>
#include <Windows.h>
typedef int (__stdcall *fnMessageBox)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
// This function is almost same as original but calling convention is __fastcall now. Also It has two additional arguments.
// In second argument we expect original function address. First argument is unused.
int __fastcall MessageBoxAHook(int unused, fnMessageBox original, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return original(hWnd, "BAZINGA!", lpCaption, uType);
}
void main()
{
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
HMODULE user32 = GetModuleHandleA("User32.dll");
uint32_t original = (uint32_t)GetProcAddress(user32, "MessageBoxA");
HookEngine::instance()
->fasthook(original, (uint32_t)MessageBoxAHook);
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
}

And it can be even more simple:

#include <HookEngine/HookEngine.h>
#include <Windows.h>
void main()
{
auto messageBoxAHook = HookEngine::createHook<
HookEngine::Stdcall, // target function calling convention
int, // return type
HWND hWnd, //first argument type
LPCSTR, //second argument type
LPCSTR, //third argument type
UINT //fourth argument type
>("User32.dll", "MessageBoxA");
// Set hook function.
messageBoxAHook->assignHook([messageBoxAHook](HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) -> int {
messageBoxAHook->original(0, "Hello from my first Hook!", "Warning", MB_OK); //Call our payload
return messageBoxAHook->original(hWnd, lpText, lpCaption, uType); //and original
});
}

Advanced Usage

Look at Example folder for more examples of usage. Fill free to add Feature Request of question.

Credits

Originally HookEngine was written as a part of GameNet project by Ilya Tkachenko (ilyamsu at gmail.com) the lead developer of GameNet application.

License

Released under the MIT license.

About

No description, website, or topics provided.

Resources

Stars

33 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

HookEngine API Overview

HookEngine is a professional hooking engine for instrumenting arbitrary Win32 functions, COM objects, and functions which symbols are located in program databases (PDBs). It can intercept unmanaged code in 32-bit and 64-bit applications. It is implemented as a native component, writed with C++. HookEngine created in 2013 and widely used in GameNet application.

HookEngine offers a unique programmer friendly API which resolves the complexities associated with binary instrumentation so that even software engineers without expertise in the field can use it. Deviare takes care of code injection and parameter marshalling. Intercepting applications is a complex task. We test multiple application environments to ensure that the end user has a trouble-free experience. HookEngine also has a focus on maximum ease of use as soon as possible.

It can be used in several like: tracing and debugging, sandboxing and browser security, malware analysis, video conference recording, and gaming.

Why HookEngine?

  • Used in real life application with vast geography and many millions of users.
  • Well tested
  • Supports stdcall, template, thiscall hooks out of box.
  • Simple - less then 5 minuted before you start.

Requirements

Microsoft Visual Studio 2010

Simple Usage

Let`s try to make hook for MessageBoxA function from

#include <HookEngine/HookEngine.h>
#include <Windows.h>
typedef int (__stdcall *fnMessageBox)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
// This function is almost same as original but calling convention is __fastcall now. Also It has two additional arguments.
// In second argument we expect original function address. First argument is unused.
int __fastcall MessageBoxAHook(int unused, fnMessageBox original, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return original(hWnd, "BAZINGA!", lpCaption, uType);
}
void main()
{
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
HMODULE user32 = GetModuleHandleA("User32.dll");
uint32_t original = (uint32_t)GetProcAddress(user32, "MessageBoxA");
HookEngine::instance()
->fasthook(original, (uint32_t)MessageBoxAHook);
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
}

And it can be even more simple:

#include <HookEngine/HookEngine.h>
#include <Windows.h>
void main()
{
auto messageBoxAHook = HookEngine::createHook<
HookEngine::Stdcall, // target function calling convention
int, // return type
HWND hWnd, //first argument type
LPCSTR, //second argument type
LPCSTR, //third argument type
UINT //fourth argument type
>("User32.dll", "MessageBoxA");
// Set hook function.
messageBoxAHook->assignHook([messageBoxAHook](HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) -> int {
messageBoxAHook->original(0, "Hello from my first Hook!", "Warning", MB_OK); //Call our payload
return messageBoxAHook->original(hWnd, lpText, lpCaption, uType); //and original
});
}

Advanced Usage

Look at Example folder for more examples of usage. Fill free to add Feature Request of question.

Credits

Originally HookEngine was written as a part of GameNet project by Ilya Tkachenko (ilyamsu at gmail.com) the lead developer of GameNet application.

License

Released under the MIT license.

About

No description, website, or topics provided.

Resources

Stars

33 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

HookEngine API Overview

HookEngine is a professional hooking engine for instrumenting arbitrary Win32 functions, COM objects, and functions which symbols are located in program databases (PDBs). It can intercept unmanaged code in 32-bit and 64-bit applications. It is implemented as a native component, writed with C++. HookEngine created in 2013 and widely used in GameNet application.

HookEngine offers a unique programmer friendly API which resolves the complexities associated with binary instrumentation so that even software engineers without expertise in the field can use it. Deviare takes care of code injection and parameter marshalling. Intercepting applications is a complex task. We test multiple application environments to ensure that the end user has a trouble-free experience. HookEngine also has a focus on maximum ease of use as soon as possible.

It can be used in several like: tracing and debugging, sandboxing and browser security, malware analysis, video conference recording, and gaming.

Why HookEngine?

  • Used in real life application with vast geography and many millions of users.
  • Well tested
  • Supports stdcall, template, thiscall hooks out of box.
  • Simple - less then 5 minuted before you start.

Requirements

Microsoft Visual Studio 2010

Simple Usage

Let`s try to make hook for MessageBoxA function from

#include <HookEngine/HookEngine.h>
#include <Windows.h>
typedef int (__stdcall *fnMessageBox)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
// This function is almost same as original but calling convention is __fastcall now. Also It has two additional arguments.
// In second argument we expect original function address. First argument is unused.
int __fastcall MessageBoxAHook(int unused, fnMessageBox original, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return original(hWnd, "BAZINGA!", lpCaption, uType);
}
void main()
{
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
HMODULE user32 = GetModuleHandleA("User32.dll");
uint32_t original = (uint32_t)GetProcAddress(user32, "MessageBoxA");
HookEngine::instance()
->fasthook(original, (uint32_t)MessageBoxAHook);
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
}

And it can be even more simple:

#include <HookEngine/HookEngine.h>
#include <Windows.h>
void main()
{
auto messageBoxAHook = HookEngine::createHook<
HookEngine::Stdcall, // target function calling convention
int, // return type
HWND hWnd, //first argument type
LPCSTR, //second argument type
LPCSTR, //third argument type
UINT //fourth argument type
>("User32.dll", "MessageBoxA");
// Set hook function.
messageBoxAHook->assignHook([messageBoxAHook](HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) -> int {
messageBoxAHook->original(0, "Hello from my first Hook!", "Warning", MB_OK); //Call our payload
return messageBoxAHook->original(hWnd, lpText, lpCaption, uType); //and original
});
}

Advanced Usage

Look at Example folder for more examples of usage. Fill free to add Feature Request of question.

Credits

Originally HookEngine was written as a part of GameNet project by Ilya Tkachenko (ilyamsu at gmail.com) the lead developer of GameNet application.

License

Released under the MIT license.

About

No description, website, or topics provided.

Resources

Stars

33 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

HookEngine API Overview

HookEngine is a professional hooking engine for instrumenting arbitrary Win32 functions, COM objects, and functions which symbols are located in program databases (PDBs). It can intercept unmanaged code in 32-bit and 64-bit applications. It is implemented as a native component, writed with C++. HookEngine created in 2013 and widely used in GameNet application.

HookEngine offers a unique programmer friendly API which resolves the complexities associated with binary instrumentation so that even software engineers without expertise in the field can use it. Deviare takes care of code injection and parameter marshalling. Intercepting applications is a complex task. We test multiple application environments to ensure that the end user has a trouble-free experience. HookEngine also has a focus on maximum ease of use as soon as possible.

It can be used in several like: tracing and debugging, sandboxing and browser security, malware analysis, video conference recording, and gaming.

Why HookEngine?

  • Used in real life application with vast geography and many millions of users.
  • Well tested
  • Supports stdcall, template, thiscall hooks out of box.
  • Simple - less then 5 minuted before you start.

Requirements

Microsoft Visual Studio 2010

Simple Usage

Let`s try to make hook for MessageBoxA function from

#include <HookEngine/HookEngine.h>
#include <Windows.h>
typedef int (__stdcall *fnMessageBox)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
// This function is almost same as original but calling convention is __fastcall now. Also It has two additional arguments.
// In second argument we expect original function address. First argument is unused.
int __fastcall MessageBoxAHook(int unused, fnMessageBox original, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return original(hWnd, "BAZINGA!", lpCaption, uType);
}
void main()
{
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
HMODULE user32 = GetModuleHandleA("User32.dll");
uint32_t original = (uint32_t)GetProcAddress(user32, "MessageBoxA");
HookEngine::instance()
->fasthook(original, (uint32_t)MessageBoxAHook);
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
}

And it can be even more simple:

#include <HookEngine/HookEngine.h>
#include <Windows.h>
void main()
{
auto messageBoxAHook = HookEngine::createHook<
HookEngine::Stdcall, // target function calling convention
int, // return type
HWND hWnd, //first argument type
LPCSTR, //second argument type
LPCSTR, //third argument type
UINT //fourth argument type
>("User32.dll", "MessageBoxA");
// Set hook function.
messageBoxAHook->assignHook([messageBoxAHook](HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) -> int {
messageBoxAHook->original(0, "Hello from my first Hook!", "Warning", MB_OK); //Call our payload
return messageBoxAHook->original(hWnd, lpText, lpCaption, uType); //and original
});
}

Advanced Usage

Look at Example folder for more examples of usage. Fill free to add Feature Request of question.

Credits

Originally HookEngine was written as a part of GameNet project by Ilya Tkachenko (ilyamsu at gmail.com) the lead developer of GameNet application.

License

Released under the MIT license.

About

No description, website, or topics provided.

Resources

Stars

33 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

HookEngine API Overview

HookEngine is a professional hooking engine for instrumenting arbitrary Win32 functions, COM objects, and functions which symbols are located in program databases (PDBs). It can intercept unmanaged code in 32-bit and 64-bit applications. It is implemented as a native component, writed with C++. HookEngine created in 2013 and widely used in GameNet application.

HookEngine offers a unique programmer friendly API which resolves the complexities associated with binary instrumentation so that even software engineers without expertise in the field can use it. Deviare takes care of code injection and parameter marshalling. Intercepting applications is a complex task. We test multiple application environments to ensure that the end user has a trouble-free experience. HookEngine also has a focus on maximum ease of use as soon as possible.

It can be used in several like: tracing and debugging, sandboxing and browser security, malware analysis, video conference recording, and gaming.

Why HookEngine?

  • Used in real life application with vast geography and many millions of users.
  • Well tested
  • Supports stdcall, template, thiscall hooks out of box.
  • Simple - less then 5 minuted before you start.

Requirements

Microsoft Visual Studio 2010

Simple Usage

Let`s try to make hook for MessageBoxA function from

#include <HookEngine/HookEngine.h>
#include <Windows.h>
typedef int (__stdcall *fnMessageBox)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
// This function is almost same as original but calling convention is __fastcall now. Also It has two additional arguments.
// In second argument we expect original function address. First argument is unused.
int __fastcall MessageBoxAHook(int unused, fnMessageBox original, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return original(hWnd, "BAZINGA!", lpCaption, uType);
}
void main()
{
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
HMODULE user32 = GetModuleHandleA("User32.dll");
uint32_t original = (uint32_t)GetProcAddress(user32, "MessageBoxA");
HookEngine::instance()
->fasthook(original, (uint32_t)MessageBoxAHook);
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
}

And it can be even more simple:

#include <HookEngine/HookEngine.h>
#include <Windows.h>
void main()
{
auto messageBoxAHook = HookEngine::createHook<
HookEngine::Stdcall, // target function calling convention
int, // return type
HWND hWnd, //first argument type
LPCSTR, //second argument type
LPCSTR, //third argument type
UINT //fourth argument type
>("User32.dll", "MessageBoxA");
// Set hook function.
messageBoxAHook->assignHook([messageBoxAHook](HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) -> int {
messageBoxAHook->original(0, "Hello from my first Hook!", "Warning", MB_OK); //Call our payload
return messageBoxAHook->original(hWnd, lpText, lpCaption, uType); //and original
});
}

Advanced Usage

Look at Example folder for more examples of usage. Fill free to add Feature Request of question.

Credits

Originally HookEngine was written as a part of GameNet project by Ilya Tkachenko (ilyamsu at gmail.com) the lead developer of GameNet application.

License

Released under the MIT license.

About

No description, website, or topics provided.

Resources

Stars

33 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

HookEngine API Overview

HookEngine is a professional hooking engine for instrumenting arbitrary Win32 functions, COM objects, and functions which symbols are located in program databases (PDBs). It can intercept unmanaged code in 32-bit and 64-bit applications. It is implemented as a native component, writed with C++. HookEngine created in 2013 and widely used in GameNet application.

HookEngine offers a unique programmer friendly API which resolves the complexities associated with binary instrumentation so that even software engineers without expertise in the field can use it. Deviare takes care of code injection and parameter marshalling. Intercepting applications is a complex task. We test multiple application environments to ensure that the end user has a trouble-free experience. HookEngine also has a focus on maximum ease of use as soon as possible.

It can be used in several like: tracing and debugging, sandboxing and browser security, malware analysis, video conference recording, and gaming.

Why HookEngine?

  • Used in real life application with vast geography and many millions of users.
  • Well tested
  • Supports stdcall, template, thiscall hooks out of box.
  • Simple - less then 5 minuted before you start.

Requirements

Microsoft Visual Studio 2010

Simple Usage

Let`s try to make hook for MessageBoxA function from

#include <HookEngine/HookEngine.h>
#include <Windows.h>
typedef int (__stdcall *fnMessageBox)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
// This function is almost same as original but calling convention is __fastcall now. Also It has two additional arguments.
// In second argument we expect original function address. First argument is unused.
int __fastcall MessageBoxAHook(int unused, fnMessageBox original, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return original(hWnd, "BAZINGA!", lpCaption, uType);
}
void main()
{
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
HMODULE user32 = GetModuleHandleA("User32.dll");
uint32_t original = (uint32_t)GetProcAddress(user32, "MessageBoxA");
HookEngine::instance()
->fasthook(original, (uint32_t)MessageBoxAHook);
MessageBoxA(0, "Not hooked yet", "Warning", MB_OK);
}

And it can be even more simple:

#include <HookEngine/HookEngine.h>
#include <Windows.h>
void main()
{
auto messageBoxAHook = HookEngine::createHook<
HookEngine::Stdcall, // target function calling convention
int, // return type
HWND hWnd, //first argument type
LPCSTR, //second argument type
LPCSTR, //third argument type
UINT //fourth argument type
>("User32.dll", "MessageBoxA");
// Set hook function.
messageBoxAHook->assignHook([messageBoxAHook](HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) -> int {
messageBoxAHook->original(0, "Hello from my first Hook!", "Warning", MB_OK); //Call our payload
return messageBoxAHook->original(hWnd, lpText, lpCaption, uType); //and original
});
}

Advanced Usage

Look at Example folder for more examples of usage. Fill free to add Feature Request of question.

Credits

Originally HookEngine was written as a part of GameNet project by Ilya Tkachenko (ilyamsu at gmail.com) the lead developer of GameNet application.

License

Released under the MIT license.

About

No description, website, or topics provided.

Resources

Stars

33 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages