├── README.md ├── UC-VtableFunctionHook.sln ├── UC-VtableFunctionHook ├── DriverMain.cpp ├── UC-VtableFunctionHook.vcxproj ├── UC-VtableFunctionHook.vcxproj.filters └── UC-VtableFunctionHook.vcxproj.user └── UC-VtableFunctionHookClient ├── ClientMain.cpp ├── UC-VtableFunctionHookClient.vcxproj ├── UC-VtableFunctionHookClient.vcxproj.filters └── UC-VtableFunctionHookClient.vcxproj.user /README.md: -------------------------------------------------------------------------------- 1 | # VTableKFunctionHook 2 | This project will give you an example how you can hook a kernel vtable function that cannot be directly called. 3 | 4 | Showcase: https://i.vgy.me/yZYhXt.png 5 | -------------------------------------------------------------------------------- /UC-VtableFunctionHook.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.32002.261 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UC-VtableFunctionHook", "UC-VtableFunctionHook\UC-VtableFunctionHook.vcxproj", "{384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UC-VtableFunctionHookClient", "UC-VtableFunctionHookClient\UC-VtableFunctionHookClient.vcxproj", "{C351C29A-C590-47FD-83DA-F1F1FAF52888}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|ARM = Debug|ARM 13 | Debug|ARM64 = Debug|ARM64 14 | Debug|x64 = Debug|x64 15 | Debug|x86 = Debug|x86 16 | Release|ARM = Release|ARM 17 | Release|ARM64 = Release|ARM64 18 | Release|x64 = Release|x64 19 | Release|x86 = Release|x86 20 | EndGlobalSection 21 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 22 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|ARM.ActiveCfg = Debug|ARM 23 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|ARM.Build.0 = Debug|ARM 24 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|ARM.Deploy.0 = Debug|ARM 25 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|ARM64.ActiveCfg = Debug|ARM64 26 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|ARM64.Build.0 = Debug|ARM64 27 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|ARM64.Deploy.0 = Debug|ARM64 28 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|x64.ActiveCfg = Debug|x64 29 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|x64.Build.0 = Debug|x64 30 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|x64.Deploy.0 = Debug|x64 31 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|x86.ActiveCfg = Debug|Win32 32 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|x86.Build.0 = Debug|Win32 33 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Debug|x86.Deploy.0 = Debug|Win32 34 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|ARM.ActiveCfg = Release|ARM 35 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|ARM.Build.0 = Release|ARM 36 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|ARM.Deploy.0 = Release|ARM 37 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|ARM64.ActiveCfg = Release|ARM64 38 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|ARM64.Build.0 = Release|ARM64 39 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|ARM64.Deploy.0 = Release|ARM64 40 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|x64.ActiveCfg = Release|x64 41 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|x64.Build.0 = Release|x64 42 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|x64.Deploy.0 = Release|x64 43 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|x86.ActiveCfg = Release|Win32 44 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|x86.Build.0 = Release|Win32 45 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4}.Release|x86.Deploy.0 = Release|Win32 46 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Debug|ARM.ActiveCfg = Debug|Win32 47 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Debug|ARM64.ActiveCfg = Debug|Win32 48 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Debug|x64.ActiveCfg = Debug|x64 49 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Debug|x64.Build.0 = Debug|x64 50 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Debug|x86.ActiveCfg = Debug|Win32 51 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Debug|x86.Build.0 = Debug|Win32 52 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Release|ARM.ActiveCfg = Release|Win32 53 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Release|ARM64.ActiveCfg = Release|Win32 54 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Release|x64.ActiveCfg = Release|x64 55 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Release|x64.Build.0 = Release|x64 56 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Release|x86.ActiveCfg = Release|Win32 57 | {C351C29A-C590-47FD-83DA-F1F1FAF52888}.Release|x86.Build.0 = Release|Win32 58 | EndGlobalSection 59 | GlobalSection(SolutionProperties) = preSolution 60 | HideSolutionNode = FALSE 61 | EndGlobalSection 62 | GlobalSection(ExtensibilityGlobals) = postSolution 63 | SolutionGuid = {18383812-498F-4846-81BD-51D87B5CF81D} 64 | EndGlobalSection 65 | EndGlobal 66 | -------------------------------------------------------------------------------- /UC-VtableFunctionHook/DriverMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #define dbgprint(format, ...) DbgPrintEx(0, 0, format, __VA_ARGS__) 7 | #define RVA(addr, size) ((uintptr_t)((uintptr_t)(addr) + *(PINT)((uintptr_t)(addr) + ((size) - sizeof(INT))) + (size))) 8 | 9 | typedef struct _SYSTEM_MODULE_ENTRY { 10 | HANDLE Section; 11 | PVOID MappedBase; 12 | PVOID ImageBase; 13 | ULONG ImageSize; 14 | ULONG Flags; 15 | USHORT LoadOrderIndex; 16 | USHORT InitOrderIndex; 17 | USHORT LoadCount; 18 | USHORT OffsetToFileName; 19 | UCHAR FullPathName[256]; 20 | } SYSTEM_MODULE_ENTRY, * PSYSTEM_MODULE_ENTRY; 21 | 22 | typedef struct _SYSTEM_MODULE_INFORMATION { 23 | ULONG Count; 24 | SYSTEM_MODULE_ENTRY Module[1]; 25 | } SYSTEM_MODULE_INFORMATION, * PSYSTEM_MODULE_INFORMATION; 26 | 27 | extern "C" { 28 | NTSTATUS NTAPI ZwQuerySystemInformation(_In_ ULONG SystemInformationClass, _Inout_ PVOID SystemInformation, _In_ ULONG SystemInformationLength, _Out_opt_ PULONG ReturnLength); 29 | }; 30 | 31 | NTSTATUS find_kernel_module(const char* moduleName, uintptr_t* moduleStart, size_t* moduleSize) { 32 | DWORD size = 0x0; 33 | ZwQuerySystemInformation((0xB), nullptr, size, reinterpret_cast(&size)); 34 | 35 | auto listHeader = ExAllocatePool(NonPagedPool, size); 36 | 37 | if (!listHeader) 38 | return STATUS_MEMORY_NOT_ALLOCATED; 39 | 40 | 41 | if (const auto status = ZwQuerySystemInformation((0xB), listHeader, size, reinterpret_cast(&size))) { 42 | ExFreePoolWithTag(listHeader, 0); 43 | return status; 44 | } 45 | 46 | auto currentModule = reinterpret_cast(listHeader)->Module; 47 | 48 | for (size_t i{}; i < reinterpret_cast(listHeader)->Count; ++i, ++currentModule) { 49 | const auto currentModuleName = reinterpret_cast(currentModule->FullPathName + currentModule->OffsetToFileName); 50 | if (!strcmp(moduleName, currentModuleName)) { 51 | *moduleStart = reinterpret_cast(currentModule->ImageBase); 52 | *moduleSize = currentModule->ImageSize; 53 | ExFreePoolWithTag(listHeader, 0); 54 | return STATUS_SUCCESS; 55 | } 56 | } 57 | ExFreePoolWithTag(listHeader, 0); 58 | return STATUS_NOT_FOUND; 59 | } 60 | 61 | bool data_compare(const char* pdata, const char* bmask, const char* szmask) 62 | { 63 | for (; *szmask; ++szmask, ++pdata, ++bmask) 64 | { 65 | if (*szmask == ("x")[0] && *pdata != *bmask) 66 | return false; 67 | } 68 | 69 | return !*szmask; 70 | } 71 | 72 | __forceinline uintptr_t find_pattern(const uintptr_t base, const size_t size, const char* bmask, const char* szmask) 73 | { 74 | for (size_t i = 0; i < size; ++i) 75 | if (data_compare(reinterpret_cast(base + i), bmask, szmask)) 76 | return base + i; 77 | 78 | return 0; 79 | } 80 | #define index 16 //MAX 25 OR START AT 0 (26 == index[0], 27 == index[1]) 81 | 82 | typedef struct RequestData { 83 | uint8_t type; 84 | PVOID args; 85 | }*pRequestData; 86 | 87 | NTSTATUS(__fastcall* OriginalFunction)(ULONG64 arg0, UINT arg1, PVOID arg2, PVOID arg3, ULONG64 arg4); 88 | NTSTATUS __fastcall HookFunction(ULONG64 arg0, UINT arg1, PVOID arg2, PVOID arg3, ULONG64 arg4) { 89 | dbgprint("HookFunction Call\n"); 90 | 91 | if (arg4 == (0xDEAD420)) { 92 | if (pRequestData data = reinterpret_cast(arg2)) { 93 | dbgprint("data->type: %i\n", data->type); 94 | dbgprint("data->args: 0x%llx\n", *(int*)data->args); 95 | *(int*)data->args = 0x99; 96 | } 97 | return STATUS_SUCCESS; 98 | } 99 | return OriginalFunction(arg0, arg1, arg2, arg3, arg4); 100 | } 101 | 102 | NTSTATUS InstallHook(const ULONG64 vtable_inst) { 103 | ULONG64 vtable_addr = RVA(vtable_inst, (7)); 104 | ULONG64* vtable = (ULONG64*)vtable_addr; 105 | BYTE vindex = (((BYTE)index + (6)) & (0x1F)); 106 | if (MmIsAddressValid((void*)vtable[vindex])) { 107 | *(ULONG64*)&OriginalFunction = vtable[vindex]; 108 | 109 | // disable write protect bit in cr0... 110 | /* { 111 | auto cr0 = __readcr0(); 112 | cr0 &= (0xfffffffffffeffff); 113 | __writecr0(cr0); 114 | _disable(); 115 | }*/ 116 | dbgprint("vtable[vindex]: 0x%llx\n", vtable[vindex]); 117 | vtable[vindex] = (ULONG64)HookFunction; 118 | 119 | // enable write protect bit in cr0... 120 | /* { 121 | auto cr0 = __readcr0(); 122 | cr0 |= (0x10000); 123 | _enable(); 124 | __writecr0(cr0); 125 | }*/ 126 | return STATUS_SUCCESS; 127 | } 128 | return STATUS_UNSUCCESSFUL; 129 | } 130 | 131 | 132 | NTSTATUS DrvEntry(ULONG64 base_address) { 133 | uintptr_t drvbase; 134 | size_t drvsize; 135 | const auto driver_status = find_kernel_module("win32kfull.sys", &drvbase, &drvsize); 136 | if (NT_SUCCESS(driver_status)) { 137 | auto vtable_inst = find_pattern(drvbase, drvsize, "\x48\x8D\x05\x00\x00\x00\x00\x41\x83\xC2\x06\x41\x83\xE2\x1F\x4A\x8B\x04\xD0\x4C\x8B\x54\x24\x00\x4C\x89\x54\x24\x00\xFF\x15\x00\x00\x00\x00\x48\x83\xC4\x38\xC3", "xxx????xxxxxxxxxxxxxxxx?xxxx?xx????xxxxx"); 138 | if (MmIsAddressValid((void*)vtable_inst) && vtable_inst != 0) { 139 | return InstallHook(vtable_inst); 140 | } 141 | else { 142 | vtable_inst = find_pattern(drvbase, drvsize, "\x48\x8D\x05\x00\x00\x00\x00\x41\x83\xC1\x06\x41\x83\xE1\x1F\x4A\x8B\x04\xC8\x4C\x8B\x44\x24\x00\x8B\xD7", "xxx????xxxxxxxxxxxxxxxx?xx"); 143 | if (MmIsAddressValid((void*)vtable_inst)) { 144 | return InstallHook(vtable_inst); 145 | } 146 | } 147 | } 148 | return STATUS_UNSUCCESSFUL; 149 | } 150 | -------------------------------------------------------------------------------- /UC-VtableFunctionHook/UC-VtableFunctionHook.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | Debug 22 | ARM 23 | 24 | 25 | Release 26 | ARM 27 | 28 | 29 | Debug 30 | ARM64 31 | 32 | 33 | Release 34 | ARM64 35 | 36 | 37 | 38 | {384B53AE-DCAF-4CAC-A810-EF8FA95A3AF4} 39 | {1bc93793-694f-48fe-9372-81e2b05556fd} 40 | v4.5 41 | 12.0 42 | Debug 43 | Win32 44 | UC_VtableFunctionHook 45 | $(LatestTargetPlatformVersion) 46 | 47 | 48 | 49 | Windows10 50 | true 51 | WindowsKernelModeDriver10.0 52 | Driver 53 | KMDF 54 | Universal 55 | 56 | 57 | Windows10 58 | false 59 | WindowsKernelModeDriver10.0 60 | Driver 61 | KMDF 62 | Universal 63 | 64 | 65 | Windows10 66 | true 67 | WindowsKernelModeDriver10.0 68 | Driver 69 | KMDF 70 | Universal 71 | 72 | 73 | Windows10 74 | false 75 | WindowsKernelModeDriver10.0 76 | Driver 77 | KMDF 78 | Universal 79 | false 80 | 81 | 82 | Windows10 83 | true 84 | WindowsKernelModeDriver10.0 85 | Driver 86 | KMDF 87 | Universal 88 | 89 | 90 | Windows10 91 | false 92 | WindowsKernelModeDriver10.0 93 | Driver 94 | KMDF 95 | Universal 96 | 97 | 98 | Windows10 99 | true 100 | WindowsKernelModeDriver10.0 101 | Driver 102 | KMDF 103 | Universal 104 | 105 | 106 | Windows10 107 | false 108 | WindowsKernelModeDriver10.0 109 | Driver 110 | KMDF 111 | Universal 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | DbgengKernelDebugger 123 | 124 | 125 | DbgengKernelDebugger 126 | 127 | 128 | DbgengKernelDebugger 129 | 130 | 131 | DbgengKernelDebugger 132 | false 133 | 134 | 135 | DbgengKernelDebugger 136 | 137 | 138 | DbgengKernelDebugger 139 | 140 | 141 | DbgengKernelDebugger 142 | 143 | 144 | DbgengKernelDebugger 145 | 146 | 147 | 148 | sha256 149 | 150 | 151 | 152 | 153 | sha256 154 | 155 | 156 | 157 | 158 | sha256 159 | 160 | 161 | 162 | 163 | sha256 164 | 165 | 166 | false 167 | 168 | 169 | false 170 | Full 171 | false 172 | false 173 | false 174 | stdcpp17 175 | TurnOffAllWarnings 176 | 177 | 178 | DrvEntry 179 | 180 | 181 | 182 | 183 | sha256 184 | 185 | 186 | 187 | 188 | sha256 189 | 190 | 191 | 192 | 193 | sha256 194 | 195 | 196 | 197 | 198 | sha256 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | -------------------------------------------------------------------------------- /UC-VtableFunctionHook/UC-VtableFunctionHook.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | {8E41214B-6785-4CFE-B992-037D68949A14} 18 | inf;inv;inx;mof;mc; 19 | 20 | 21 | 22 | 23 | Source Files 24 | 25 | 26 | -------------------------------------------------------------------------------- /UC-VtableFunctionHook/UC-VtableFunctionHook.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Off 5 | 6 | -------------------------------------------------------------------------------- /UC-VtableFunctionHookClient/ClientMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | typedef struct RequestData { 7 | uint8_t type; 8 | PVOID args; 9 | }*pRequestData; 10 | 11 | NTSTATUS(*NtUserMessageCall)(HWND hWnd, UINT msg, PVOID wParam, PVOID lParam, ULONG_PTR ResultInfo, DWORD dwType, BOOLEAN bAnsi) = nullptr; 12 | HWND ValidHwnd; 13 | UINT MsgKey; 14 | 15 | bool InitHandles() { 16 | LoadLibraryA("user32.dll"); 17 | LoadLibraryA("win32u.dll"); 18 | LoadLibraryA("ntdll.dll"); 19 | 20 | *(PVOID*)&NtUserMessageCall = GetProcAddress( 21 | GetModuleHandleA("win32u.dll"), 22 | "NtUserMessageCall" 23 | ); 24 | if (!NtUserMessageCall) 25 | return false; 26 | 27 | srand(GetTickCount64() * GetCurrentProcessId() * GetCurrentThreadId()); 28 | MsgKey = 0xbd4 + (rand() % 0x1ffff); 29 | 30 | ValidHwnd = FindWindowA("WorkerW", 0); 31 | if (INVALID_HANDLE_VALUE != ValidHwnd) 32 | return true; 33 | return false; 34 | } 35 | 36 | template 37 | NTSTATUS syscall(PVOID args) { 38 | RequestData data = { 39 | type, 40 | args 41 | }; 42 | return NtUserMessageCall(ValidHwnd, MsgKey, &data, 0, 0xDEAD420, 16, 0); 43 | } 44 | 45 | NTSTATUS main() { 46 | printf("InitHandles!\n"); 47 | if (InitHandles()) { 48 | int ret = 0x420; 49 | const auto status = syscall<3>(&ret); 50 | printf("ret: 0x%llx | 0x%llx\n", ret, status); 51 | system("pause"); 52 | return STATUS_SUCCESS; 53 | } 54 | return STATUS_UNSUCCESSFUL; 55 | } -------------------------------------------------------------------------------- /UC-VtableFunctionHookClient/UC-VtableFunctionHookClient.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 16.0 23 | Win32Proj 24 | {c351c29a-c590-47fd-83da-f1f1faf52888} 25 | UCVtableFunctionHookClient 26 | 10.0 27 | 28 | 29 | 30 | Application 31 | true 32 | v142 33 | Unicode 34 | 35 | 36 | Application 37 | false 38 | v142 39 | true 40 | Unicode 41 | 42 | 43 | Application 44 | true 45 | v142 46 | Unicode 47 | 48 | 49 | Application 50 | false 51 | v142 52 | true 53 | Unicode 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | true 75 | 76 | 77 | false 78 | 79 | 80 | true 81 | 82 | 83 | false 84 | 85 | 86 | 87 | Level3 88 | true 89 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 90 | true 91 | 92 | 93 | Console 94 | true 95 | 96 | 97 | 98 | 99 | Level3 100 | true 101 | true 102 | true 103 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 104 | true 105 | 106 | 107 | Console 108 | true 109 | true 110 | true 111 | 112 | 113 | 114 | 115 | Level3 116 | true 117 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions) 118 | true 119 | 120 | 121 | Console 122 | true 123 | 124 | 125 | 126 | 127 | Level3 128 | true 129 | true 130 | true 131 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 132 | true 133 | 134 | 135 | Console 136 | true 137 | true 138 | true 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /UC-VtableFunctionHookClient/UC-VtableFunctionHookClient.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /UC-VtableFunctionHookClient/UC-VtableFunctionHookClient.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | --------------------------------------------------------------------------------