|
7 | 7 | #include <Windows.h> |
8 | 8 | #include <map> |
9 | 9 |
|
10 | | -#define _HOOK_DEFINE_INTERNAL(reT, reTm, name, args) \ |
11 | | - typedef reT (reTm *_orig ## name) args; \ |
12 | | - _orig ## name orig ## name; \ |
13 | | - __declspec(dllexport) reT reTm on ## name args; \ |
14 | | - __declspec(dllexport) static reT reTm _on ## name args; |
15 | | -#define HOOK_DEFINE_2(reT, reTm, name, arg1, arg2) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1, arg2)); |
16 | | -#define HOOK_DEFINE_5(reT, reTm, name, arg1, arg2, arg3, arg4, arg5) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1, arg2, arg3, arg4, arg5)); |
17 | | -#define HOOK_DEFINE_6(reT, reTm, name, arg1, arg2, arg3, arg4, arg5, arg6) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1, arg2, arg3, arg4, arg5, arg6)); |
18 | | -#define HOOK_DEFINE_8(reT, reTm, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)); |
19 | | -#define HOOK_DEFINE_10(reT, reTm, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10)); |
20 | | -#define HOOK_DEFINE_12(reT, reTm, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)); |
| 10 | +#define _HOOK_DEFINE_INTERNAL(reT, reTm, name, args, argnames) \ |
| 11 | + typedef reT (reTm *_orig ## name) args; /* define the function prototype */ \ |
| 12 | + _orig ## name orig ## name; /* create a pointer to the original function */ \ |
| 13 | + __declspec(dllexport) reT reTm on ## name args; /* declare the member-fucntion that will be called internal to the class */ \ |
| 14 | + __declspec(dllexport) static reT reTm _on ## name args /* declare the static function that acts as a hook callback and forwards the call into the member function */ \ |
| 15 | + { \ |
| 16 | + auto sg = getInstance()->lock->enterWithScopeGuard(); \ |
| 17 | + if (getInstance()->shouldIgnoreHooks()) \ |
| 18 | + return getInstance()->orig ## name argnames; \ |
| 19 | + else \ |
| 20 | + return getInstance()->on ## name argnames; \ |
| 21 | + } |
| 22 | + |
| 23 | +#define HOOK_DEFINE_1(reT, reTm, name, arg1) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1), (a1)); |
| 24 | +#define HOOK_DEFINE_2(reT, reTm, name, arg1, arg2) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1, arg2 a2), (a1, a2)); |
| 25 | +#define HOOK_DEFINE_3(reT, reTm, name, arg1, arg2, arg3) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1, arg2 a2, arg3 a3), (a1, a2, a3)); |
| 26 | +#define HOOK_DEFINE_4(reT, reTm, name, arg1, arg2, arg3, arg4) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1, arg2 a2, arg3 a3, arg4 a4), (a1, a2, a3, a4)); |
| 27 | +#define HOOK_DEFINE_5(reT, reTm, name, arg1, arg2, arg3, arg4, arg5) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1, arg2 a2, arg3 a3, arg4 a4, arg5 a5), (a1, a2, a3, a4, a5)); |
| 28 | +#define HOOK_DEFINE_6(reT, reTm, name, arg1, arg2, arg3, arg4, arg5, arg6) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1, arg2 a2, arg3 a3, arg4 a4, arg5 a5, arg6 a6), (a1, a2, a3, a4, a5, a6)); |
| 29 | +#define HOOK_DEFINE_7(reT, reTm, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1, arg2 a2, arg3 a3, arg4 a4, arg5 a5, arg6 a6, arg7 a7), (a1, a2, a3, a4, a5, a6, a7)); |
| 30 | +#define HOOK_DEFINE_8(reT, reTm, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1, arg2 a2, arg3 a3, arg4 a4, arg5 a5, arg6 a6, arg7 a7, arg8 a8), (a1, a2, a3, a4, a5, a6, a7, a8)); |
| 31 | +#define HOOK_DEFINE_10(reT, reTm, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1, arg2 a2, arg3 a3, arg4 a4, arg5 a5, arg6 a6, arg7 a7, arg8 a8, arg9 a9, arg10 a10), (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)); |
| 32 | +#define HOOK_DEFINE_12(reT, reTm, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12) _HOOK_DEFINE_INTERNAL(reT, reTm, name, (arg1 a1, arg2 a2, arg3 a3, arg4 a4, arg5 a5, arg6 a6, arg7 a7, arg8 a8, arg9 a9, arg10 a10, arg11 a11, arg12 a12), (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)); |
21 | 33 |
|
22 | 34 | #define HOOK_GET_ORIG(object, library, name) object->orig ## name = (_orig ## name)GetProcAddress(LoadLibraryA(library), #name); assert(object->orig ## name); |
23 | 35 | #define HOOK_SET(object, hooks, name) hooks->placeHook(&(PVOID&)object->orig ## name, &_on ## name); |
@@ -91,11 +103,17 @@ class UnpackingEngine |
91 | 103 |
|
92 | 104 | /* exception handler for hooking execution on tracked pages */ |
93 | 105 | long onShallowException(PEXCEPTION_POINTERS info); |
94 | | - static long __stdcall _onShallowException(PEXCEPTION_POINTERS info); |
| 106 | + static long __stdcall _onShallowException(PEXCEPTION_POINTERS info) |
| 107 | + { |
| 108 | + return UnpackingEngine::getInstance()->onShallowException(info); |
| 109 | + } |
95 | 110 |
|
96 | 111 | /* exception handler for detecting crashes */ |
97 | 112 | long onDeepException(PEXCEPTION_POINTERS info); |
98 | | - static long __stdcall _onDeepException(PEXCEPTION_POINTERS info); |
| 113 | + static long __stdcall _onDeepException(PEXCEPTION_POINTERS info) |
| 114 | + { |
| 115 | + return UnpackingEngine::getInstance()->onDeepException(info); |
| 116 | + } |
99 | 117 |
|
100 | 118 | }; |
101 | 119 |
|
0 commit comments