├── Input_dll ├── Input_dll.vcxproj ├── Input_dll.vcxproj.filters ├── dll_x64.h ├── dll_x86.h └── main.cpp ├── Loader ├── Loader.vcxproj ├── Loader.vcxproj.filters └── loader.cpp ├── MemLoadDll.h ├── README.md ├── _global.cpp ├── _global.h ├── driver_inject.cpp ├── driver_inject.sln ├── driver_inject.v12.suo ├── driver_inject.vcxproj ├── driver_inject.vcxproj.filters ├── hooklib.cpp ├── hooklib.h ├── misc.cpp ├── misc.h ├── ntdll.cpp ├── ntdll.h ├── pe.cpp ├── pe.h ├── readme.md ├── ssdt.cpp ├── ssdt.h ├── undocumented.cpp └── undocumented.h /Input_dll/Input_dll.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | 14 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637} 15 | Win32Proj 16 | Input_dll 17 | 18 | 19 | 20 | Application 21 | true 22 | v120 23 | Unicode 24 | 25 | 26 | Application 27 | false 28 | v120 29 | true 30 | Unicode 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | true 44 | $(SolutionDir)\Bin\ 45 | $(SolutionDir)\Temp\$(Configuration)\ 46 | $(ProjectName)_d 47 | 48 | 49 | false 50 | $(SolutionDir)\Bin\ 51 | $(SolutionDir)\Temp\$(Configuration)\ 52 | 53 | 54 | 55 | 56 | 57 | Level3 58 | Disabled 59 | WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) 60 | 61 | 62 | Console 63 | true 64 | 65 | 66 | 67 | 68 | Level3 69 | 70 | 71 | MaxSpeed 72 | true 73 | true 74 | WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) 75 | MultiThreaded 76 | 77 | 78 | Console 79 | false 80 | true 81 | true 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /Input_dll/Input_dll.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;hh;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 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /Input_dll/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "dll_x86.h" 6 | #include "dll_x64.h" 7 | 8 | 9 | #define IOCTL_SET_INJECT_X86DLL \ 10 | CTL_CODE(FILE_DEVICE_UNKNOWN, 0x900, METHOD_IN_DIRECT, FILE_ANY_ACCESS) 11 | 12 | #define IOCTL_SET_INJECT_X64DLL \ 13 | CTL_CODE(FILE_DEVICE_UNKNOWN, 0x901, METHOD_IN_DIRECT, FILE_ANY_ACCESS) 14 | 15 | 16 | 17 | int main() 18 | { 19 | BOOL result; 20 | DWORD returnLen; 21 | char output; 22 | 23 | HANDLE hDevice = CreateFile(L"\\\\.\\CrashDumpUpload", 24 | NULL, 25 | NULL, 26 | NULL, 27 | OPEN_EXISTING, 28 | NULL, 29 | NULL); 30 | 31 | if (hDevice == INVALID_HANDLE_VALUE) 32 | { 33 | std::cout << "connect device fail." << std::endl; 34 | goto __exit; 35 | } 36 | 37 | result = DeviceIoControl(hDevice, 38 | IOCTL_SET_INJECT_X86DLL, 39 | &dll_x86, 40 | sizeof(dll_x86), 41 | &output, 42 | sizeof(char), 43 | &returnLen, 44 | NULL); 45 | 46 | std::cout << (result ? "ok x86dll" : "fail x86dll") << std::endl; 47 | 48 | result = DeviceIoControl(hDevice, 49 | IOCTL_SET_INJECT_X64DLL, 50 | &dll_x64, 51 | sizeof(dll_x64), 52 | &output, 53 | sizeof(char), 54 | &returnLen, 55 | NULL); 56 | 57 | std::cout << (result ? "ok x64dll" : "fail x64dll") << std::endl; 58 | 59 | 60 | __exit: 61 | getchar(); 62 | return 0; 63 | } -------------------------------------------------------------------------------- /Loader/Loader.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | {29392CD7-AAFC-434B-8395-A7016A677011} 23 | Win32Proj 24 | Loader 25 | 26 | 27 | 28 | Application 29 | true 30 | v120 31 | Unicode 32 | 33 | 34 | Application 35 | true 36 | v120 37 | Unicode 38 | 39 | 40 | Application 41 | false 42 | v120_xp 43 | true 44 | Unicode 45 | 46 | 47 | Application 48 | false 49 | v120_xp 50 | true 51 | Unicode 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | true 71 | $(SolutionDir)\Bin\ 72 | Temp\$(ProjectName)\$(Platform)\$(ConfigurationName)\ 73 | $(TargetName.Replace(' ',''))_d 74 | 75 | 76 | true 77 | $(SolutionDir)\Bin\ 78 | Temp\$(ProjectName)\$(Platform)\$(ConfigurationName)\ 79 | $(TargetName.Replace(' ',''))_x64_d 80 | 81 | 82 | false 83 | $(SolutionDir)\Bin\ 84 | $(SolutionDir)\Temp\$(Configuration)\ 85 | $(TargetName.Replace(' ','')) 86 | 87 | 88 | false 89 | $(SolutionDir)\Bin\ 90 | $(SolutionDir)\Temp\$(Configuration)\ 91 | $(TargetName.Replace(' ',''))_x64 92 | 93 | 94 | 95 | 96 | 97 | Level3 98 | Disabled 99 | WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) 100 | 101 | 102 | Windows 103 | true 104 | 105 | 106 | 107 | 108 | 109 | 110 | Level3 111 | Disabled 112 | WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) 113 | 114 | 115 | Windows 116 | true 117 | 118 | 119 | 120 | 121 | Level3 122 | 123 | 124 | Disabled 125 | true 126 | false 127 | WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) 128 | false 129 | false 130 | MultiThreaded 131 | 132 | 133 | Windows 134 | true 135 | true 136 | true 137 | false 138 | Loader 139 | 140 | 141 | 142 | 143 | Level3 144 | 145 | 146 | Disabled 147 | true 148 | false 149 | WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) 150 | false 151 | false 152 | MultiThreaded 153 | 154 | 155 | Windows 156 | true 157 | true 158 | true 159 | false 160 | Loader 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /Loader/Loader.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;hh;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 | 18 | 19 | 源文件 20 | 21 | 22 | -------------------------------------------------------------------------------- /Loader/loader.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haidragon/DriverInjectDll/274489b7a548fe2cb3769d121e4d4787b2bb1e3e/Loader/loader.cpp -------------------------------------------------------------------------------- /MemLoadDll.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef _MEMLOAD_SHELLCODE_H 3 | #define _MEMLOAD_SHELLCODE_H 4 | 5 | unsigned char MemLoadShellcode_x86[] = { 6 | 7 | 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x54, 0xC7, 0x45, 0xC4, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x45, 0xC0, 8 | 0x00, 0x00, 0x00, 0x00, 0xC7, 0x45, 0xCC, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x45, 0xBC, 0x00, 0x00, 9 | 0x00, 0x00, 0x8B, 0x45, 0x08, 0x0F, 0xB7, 0x08, 0x81, 0xF9, 0x4D, 0x5A, 0x00, 0x00, 0x74, 0x07, 10 | 0x33, 0xC0, 0xE9, 0xEE, 0x06, 0x00, 0x00, 0x8B, 0x55, 0x08, 0x8B, 0x45, 0x08, 0x03, 0x42, 0x3C, 11 | 0x89, 0x45, 0xD8, 0x8B, 0x4D, 0xD8, 0x81, 0x39, 0x50, 0x45, 0x00, 0x00, 0x74, 0x07, 0x33, 0xC0, 12 | 0xE9, 0xD0, 0x06, 0x00, 0x00, 0x64, 0x8B, 0x15, 0x30, 0x00, 0x00, 0x00, 0x89, 0x55, 0xF8, 0x8B, 13 | 0x45, 0xF8, 0x8B, 0x48, 0x0C, 0x89, 0x4D, 0xF8, 0x8B, 0x55, 0xF8, 0x8B, 0x42, 0x14, 0x89, 0x45, 14 | 0xF4, 0x83, 0x7D, 0xF4, 0x00, 0x0F, 0x84, 0x89, 0x02, 0x00, 0x00, 0x8B, 0x4D, 0xF4, 0x8B, 0x51, 15 | 0x28, 0x89, 0x55, 0xE8, 0x8B, 0x45, 0xF4, 0x66, 0x8B, 0x48, 0x24, 0x66, 0x89, 0x4D, 0xFC, 0xC7, 16 | 0x45, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x55, 0xF0, 0x52, 0xE8, 0xD1, 0x06, 0x00, 0x00, 0x83, 17 | 0xC4, 0x04, 0x89, 0x45, 0xF0, 0x8B, 0x45, 0xE8, 0x0F, 0xB6, 0x08, 0x83, 0xF9, 0x61, 0x7C, 0x12, 18 | 0x8B, 0x55, 0xE8, 0x0F, 0xB6, 0x02, 0x8B, 0x4D, 0xF0, 0x8D, 0x54, 0x01, 0xE0, 0x89, 0x55, 0xF0, 19 | 0xEB, 0x0C, 0x8B, 0x45, 0xE8, 0x0F, 0xB6, 0x08, 0x03, 0x4D, 0xF0, 0x89, 0x4D, 0xF0, 0x8B, 0x55, 20 | 0xE8, 0x83, 0xC2, 0x01, 0x89, 0x55, 0xE8, 0x66, 0x8B, 0x45, 0xFC, 0x66, 0x83, 0xE8, 0x01, 0x66, 21 | 0x89, 0x45, 0xFC, 0x0F, 0xB7, 0x4D, 0xFC, 0x85, 0xC9, 0x75, 0xAB, 0x81, 0x7D, 0xF0, 0x5B, 0xBC, 22 | 0x4A, 0x6A, 0x0F, 0x85, 0x11, 0x01, 0x00, 0x00, 0x8B, 0x55, 0xF4, 0x8B, 0x42, 0x10, 0x89, 0x45, 23 | 0xF8, 0x8B, 0x4D, 0xF8, 0x8B, 0x55, 0xF8, 0x03, 0x51, 0x3C, 0x89, 0x55, 0xE4, 0xB8, 0x08, 0x00, 24 | 0x00, 0x00, 0x6B, 0xC8, 0x00, 0x8B, 0x55, 0xE4, 0x8D, 0x44, 0x0A, 0x78, 0x89, 0x45, 0xE0, 0x8B, 25 | 0x4D, 0xE0, 0x8B, 0x55, 0xF8, 0x03, 0x11, 0x89, 0x55, 0xE4, 0x8B, 0x45, 0xE4, 0x8B, 0x4D, 0xF8, 26 | 0x03, 0x48, 0x20, 0x89, 0x4D, 0xE0, 0x8B, 0x55, 0xE4, 0x8B, 0x45, 0xF8, 0x03, 0x42, 0x24, 0x89, 27 | 0x45, 0xD0, 0xB9, 0x03, 0x00, 0x00, 0x00, 0x66, 0x89, 0x4D, 0xFC, 0x0F, 0xB7, 0x55, 0xFC, 0x85, 28 | 0xD2, 0x0F, 0x8E, 0xAD, 0x00, 0x00, 0x00, 0x8B, 0x45, 0xE0, 0x8B, 0x4D, 0xF8, 0x03, 0x08, 0x51, 29 | 0xE8, 0xCB, 0x05, 0x00, 0x00, 0x83, 0xC4, 0x04, 0x89, 0x45, 0xD4, 0x81, 0x7D, 0xD4, 0x8E, 0x4E, 30 | 0x0E, 0xEC, 0x74, 0x12, 0x81, 0x7D, 0xD4, 0xAA, 0xFC, 0x0D, 0x7C, 0x74, 0x09, 0x81, 0x7D, 0xD4, 31 | 0x54, 0xCA, 0xAF, 0x91, 0x75, 0x67, 0x8B, 0x55, 0xE4, 0x8B, 0x45, 0xF8, 0x03, 0x42, 0x1C, 0x89, 32 | 0x45, 0xDC, 0x8B, 0x4D, 0xD0, 0x0F, 0xB7, 0x11, 0x8B, 0x45, 0xDC, 0x8D, 0x0C, 0x90, 0x89, 0x4D, 33 | 0xDC, 0x81, 0x7D, 0xD4, 0x8E, 0x4E, 0x0E, 0xEC, 0x75, 0x0D, 0x8B, 0x55, 0xDC, 0x8B, 0x45, 0xF8, 34 | 0x03, 0x02, 0x89, 0x45, 0xC4, 0xEB, 0x2A, 0x81, 0x7D, 0xD4, 0xAA, 0xFC, 0x0D, 0x7C, 0x75, 0x0D, 35 | 0x8B, 0x4D, 0xDC, 0x8B, 0x55, 0xF8, 0x03, 0x11, 0x89, 0x55, 0xC0, 0xEB, 0x14, 0x81, 0x7D, 0xD4, 36 | 0x54, 0xCA, 0xAF, 0x91, 0x75, 0x0B, 0x8B, 0x45, 0xDC, 0x8B, 0x4D, 0xF8, 0x03, 0x08, 0x89, 0x4D, 37 | 0xCC, 0x66, 0x8B, 0x55, 0xFC, 0x66, 0x83, 0xEA, 0x01, 0x66, 0x89, 0x55, 0xFC, 0x8B, 0x45, 0xE0, 38 | 0x83, 0xC0, 0x04, 0x89, 0x45, 0xE0, 0x8B, 0x4D, 0xD0, 0x83, 0xC1, 0x02, 0x89, 0x4D, 0xD0, 0xE9, 39 | 0x47, 0xFF, 0xFF, 0xFF, 0xE9, 0xD4, 0x00, 0x00, 0x00, 0x81, 0x7D, 0xF0, 0x5D, 0x68, 0xFA, 0x3C, 40 | 0x0F, 0x85, 0xC7, 0x00, 0x00, 0x00, 0x8B, 0x55, 0xF4, 0x8B, 0x42, 0x10, 0x89, 0x45, 0xF8, 0x8B, 41 | 0x4D, 0xF8, 0x8B, 0x55, 0xF8, 0x03, 0x51, 0x3C, 0x89, 0x55, 0xE4, 0xB8, 0x08, 0x00, 0x00, 0x00, 42 | 0x6B, 0xC8, 0x00, 0x8B, 0x55, 0xE4, 0x8D, 0x44, 0x0A, 0x78, 0x89, 0x45, 0xE0, 0x8B, 0x4D, 0xE0, 43 | 0x8B, 0x55, 0xF8, 0x03, 0x11, 0x89, 0x55, 0xE4, 0x8B, 0x45, 0xE4, 0x8B, 0x4D, 0xF8, 0x03, 0x48, 44 | 0x20, 0x89, 0x4D, 0xE0, 0x8B, 0x55, 0xE4, 0x8B, 0x45, 0xF8, 0x03, 0x42, 0x24, 0x89, 0x45, 0xD0, 45 | 0xB9, 0x01, 0x00, 0x00, 0x00, 0x66, 0x89, 0x4D, 0xFC, 0x0F, 0xB7, 0x55, 0xFC, 0x85, 0xD2, 0x7E, 46 | 0x6C, 0x8B, 0x45, 0xE0, 0x8B, 0x4D, 0xF8, 0x03, 0x08, 0x51, 0xE8, 0xB1, 0x04, 0x00, 0x00, 0x83, 47 | 0xC4, 0x04, 0x89, 0x45, 0xD4, 0x81, 0x7D, 0xD4, 0xB8, 0x0A, 0x4C, 0x53, 0x75, 0x3B, 0x8B, 0x55, 48 | 0xE4, 0x8B, 0x45, 0xF8, 0x03, 0x42, 0x1C, 0x89, 0x45, 0xDC, 0x8B, 0x4D, 0xD0, 0x0F, 0xB7, 0x11, 49 | 0x8B, 0x45, 0xDC, 0x8D, 0x0C, 0x90, 0x89, 0x4D, 0xDC, 0x81, 0x7D, 0xD4, 0xB8, 0x0A, 0x4C, 0x53, 50 | 0x75, 0x0B, 0x8B, 0x55, 0xDC, 0x8B, 0x45, 0xF8, 0x03, 0x02, 0x89, 0x45, 0xBC, 0x66, 0x8B, 0x4D, 51 | 0xFC, 0x66, 0x83, 0xE9, 0x01, 0x66, 0x89, 0x4D, 0xFC, 0x8B, 0x55, 0xE0, 0x83, 0xC2, 0x04, 0x89, 52 | 0x55, 0xE0, 0x8B, 0x45, 0xD0, 0x83, 0xC0, 0x02, 0x89, 0x45, 0xD0, 0xEB, 0x8C, 0x83, 0x7D, 0xC4, 53 | 0x00, 0x74, 0x14, 0x83, 0x7D, 0xC0, 0x00, 0x74, 0x0E, 0x83, 0x7D, 0xCC, 0x00, 0x74, 0x08, 0x83, 54 | 0x7D, 0xBC, 0x00, 0x74, 0x02, 0xEB, 0x0D, 0x8B, 0x4D, 0xF4, 0x8B, 0x11, 0x89, 0x55, 0xF4, 0xE9, 55 | 0x6D, 0xFD, 0xFF, 0xFF, 0x8B, 0x45, 0x08, 0x0F, 0xB7, 0x08, 0x81, 0xF9, 0x4D, 0x5A, 0x00, 0x00, 56 | 0x74, 0x07, 0x33, 0xC0, 0xE9, 0x0C, 0x04, 0x00, 0x00, 0x8B, 0x55, 0x08, 0x8B, 0x45, 0x08, 0x03, 57 | 0x42, 0x3C, 0x89, 0x45, 0xD8, 0x8B, 0x4D, 0xD8, 0x81, 0x39, 0x50, 0x45, 0x00, 0x00, 0x74, 0x07, 58 | 0x33, 0xC0, 0xE9, 0xEE, 0x03, 0x00, 0x00, 0x6A, 0x40, 0x68, 0x00, 0x30, 0x00, 0x00, 0x8B, 0x55, 59 | 0xD8, 0x8B, 0x42, 0x50, 0x50, 0x6A, 0x00, 0xFF, 0x55, 0xCC, 0x89, 0x45, 0xF8, 0x8B, 0x4D, 0xD8, 60 | 0x8B, 0x51, 0x54, 0x89, 0x55, 0xF4, 0x8B, 0x45, 0x08, 0x89, 0x45, 0xE8, 0x8B, 0x4D, 0xF8, 0x89, 61 | 0x4D, 0xF0, 0x8B, 0x55, 0xF4, 0x89, 0x55, 0xB8, 0x8B, 0x45, 0xF4, 0x83, 0xE8, 0x01, 0x89, 0x45, 62 | 0xF4, 0x83, 0x7D, 0xB8, 0x00, 0x74, 0x1E, 0x8B, 0x4D, 0xF0, 0x8B, 0x55, 0xE8, 0x8A, 0x02, 0x88, 63 | 0x01, 0x8B, 0x4D, 0xF0, 0x83, 0xC1, 0x01, 0x89, 0x4D, 0xF0, 0x8B, 0x55, 0xE8, 0x83, 0xC2, 0x01, 64 | 0x89, 0x55, 0xE8, 0xEB, 0xCD, 0x8B, 0x45, 0xD8, 0x0F, 0xB7, 0x48, 0x14, 0x8B, 0x55, 0xD8, 0x8D, 65 | 0x44, 0x0A, 0x18, 0x89, 0x45, 0xF4, 0x8B, 0x4D, 0xD8, 0x0F, 0xB7, 0x51, 0x06, 0x89, 0x55, 0xC8, 66 | 0x8B, 0x45, 0xC8, 0x89, 0x45, 0xB4, 0x8B, 0x4D, 0xC8, 0x83, 0xE9, 0x01, 0x89, 0x4D, 0xC8, 0x83, 67 | 0x7D, 0xB4, 0x00, 0x74, 0x5F, 0x8B, 0x55, 0xF4, 0x8B, 0x45, 0xF8, 0x03, 0x42, 0x0C, 0x89, 0x45, 68 | 0xE8, 0x8B, 0x4D, 0xF4, 0x8B, 0x55, 0x08, 0x03, 0x51, 0x14, 0x89, 0x55, 0xF0, 0x8B, 0x45, 0xF4, 69 | 0x8B, 0x48, 0x10, 0x89, 0x4D, 0xEC, 0x8B, 0x55, 0xEC, 0x89, 0x55, 0xB0, 0x8B, 0x45, 0xEC, 0x83, 70 | 0xE8, 0x01, 0x89, 0x45, 0xEC, 0x83, 0x7D, 0xB0, 0x00, 0x74, 0x1E, 0x8B, 0x4D, 0xE8, 0x8B, 0x55, 71 | 0xF0, 0x8A, 0x02, 0x88, 0x01, 0x8B, 0x4D, 0xE8, 0x83, 0xC1, 0x01, 0x89, 0x4D, 0xE8, 0x8B, 0x55, 72 | 0xF0, 0x83, 0xC2, 0x01, 0x89, 0x55, 0xF0, 0xEB, 0xCD, 0x8B, 0x45, 0xF4, 0x83, 0xC0, 0x28, 0x89, 73 | 0x45, 0xF4, 0xEB, 0x8C, 0xB9, 0x08, 0x00, 0x00, 0x00, 0xC1, 0xE1, 0x00, 0x8B, 0x55, 0xD8, 0x8D, 74 | 0x44, 0x0A, 0x78, 0x89, 0x45, 0xE8, 0x8B, 0x4D, 0xE8, 0x8B, 0x55, 0xF8, 0x03, 0x11, 0x89, 0x55, 75 | 0xF0, 0x8B, 0x45, 0xF0, 0x83, 0x78, 0x0C, 0x00, 0x0F, 0x84, 0xEB, 0x00, 0x00, 0x00, 0x8B, 0x4D, 76 | 0xF0, 0x8B, 0x55, 0xF8, 0x03, 0x51, 0x0C, 0x52, 0xFF, 0x55, 0xC4, 0x89, 0x45, 0x08, 0x8B, 0x45, 77 | 0xF0, 0x8B, 0x4D, 0xF8, 0x03, 0x08, 0x89, 0x4D, 0xEC, 0x8B, 0x55, 0xF0, 0x8B, 0x45, 0xF8, 0x03, 78 | 0x42, 0x10, 0x89, 0x45, 0xF4, 0x8B, 0x4D, 0xF4, 0x83, 0x39, 0x00, 0x0F, 0x84, 0xAA, 0x00, 0x00, 79 | 0x00, 0x83, 0x7D, 0xEC, 0x00, 0x74, 0x69, 0x8B, 0x55, 0xEC, 0x8B, 0x02, 0x25, 0x00, 0x00, 0x00, 80 | 0x80, 0x74, 0x5D, 0x8B, 0x4D, 0x08, 0x8B, 0x55, 0x08, 0x03, 0x51, 0x3C, 0x89, 0x55, 0xE4, 0xB8, 81 | 0x08, 0x00, 0x00, 0x00, 0x6B, 0xC8, 0x00, 0x8B, 0x55, 0xE4, 0x8D, 0x44, 0x0A, 0x78, 0x89, 0x45, 82 | 0xE0, 0x8B, 0x4D, 0xE0, 0x8B, 0x55, 0x08, 0x03, 0x11, 0x89, 0x55, 0xE4, 0x8B, 0x45, 0xE4, 0x8B, 83 | 0x4D, 0x08, 0x03, 0x48, 0x1C, 0x89, 0x4D, 0xDC, 0x8B, 0x55, 0xEC, 0x8B, 0x02, 0x25, 0xFF, 0xFF, 84 | 0x00, 0x00, 0x8B, 0x4D, 0xE4, 0x2B, 0x41, 0x10, 0x8B, 0x55, 0xDC, 0x8D, 0x04, 0x82, 0x89, 0x45, 85 | 0xDC, 0x8B, 0x4D, 0xDC, 0x8B, 0x55, 0x08, 0x03, 0x11, 0x8B, 0x45, 0xF4, 0x89, 0x10, 0xEB, 0x1E, 86 | 0x8B, 0x4D, 0xF4, 0x8B, 0x55, 0xF8, 0x03, 0x11, 0x89, 0x55, 0xE8, 0x8B, 0x45, 0xE8, 0x83, 0xC0, 87 | 0x02, 0x50, 0x8B, 0x4D, 0x08, 0x51, 0xFF, 0x55, 0xC0, 0x8B, 0x55, 0xF4, 0x89, 0x02, 0x8B, 0x45, 88 | 0xF4, 0x83, 0xC0, 0x04, 0x89, 0x45, 0xF4, 0x83, 0x7D, 0xEC, 0x00, 0x74, 0x09, 0x8B, 0x4D, 0xEC, 89 | 0x83, 0xC1, 0x04, 0x89, 0x4D, 0xEC, 0xE9, 0x4A, 0xFF, 0xFF, 0xFF, 0x8B, 0x55, 0xF0, 0x83, 0xC2, 90 | 0x14, 0x89, 0x55, 0xF0, 0xE9, 0x08, 0xFF, 0xFF, 0xFF, 0x8B, 0x45, 0xD8, 0x8B, 0x4D, 0xF8, 0x2B, 91 | 0x48, 0x34, 0x89, 0x4D, 0x08, 0xBA, 0x08, 0x00, 0x00, 0x00, 0x6B, 0xC2, 0x05, 0x8B, 0x4D, 0xD8, 92 | 0x8D, 0x54, 0x01, 0x78, 0x89, 0x55, 0xE8, 0x8B, 0x45, 0xE8, 0x83, 0x78, 0x04, 0x00, 0x0F, 0x84, 93 | 0x9E, 0x01, 0x00, 0x00, 0x8B, 0x4D, 0xE8, 0x8B, 0x55, 0xF8, 0x03, 0x11, 0x89, 0x55, 0xF0, 0x8B, 94 | 0x45, 0xF0, 0x83, 0x78, 0x04, 0x00, 0x0F, 0x84, 0x86, 0x01, 0x00, 0x00, 0x8B, 0x4D, 0xF0, 0x8B, 95 | 0x55, 0xF8, 0x03, 0x11, 0x89, 0x55, 0xF4, 0x8B, 0x45, 0xF0, 0x8B, 0x48, 0x04, 0x83, 0xE9, 0x08, 96 | 0xD1, 0xE9, 0x89, 0x4D, 0xE8, 0x8B, 0x55, 0xF0, 0x83, 0xC2, 0x08, 0x89, 0x55, 0xEC, 0x8B, 0x45, 97 | 0xE8, 0x89, 0x45, 0xAC, 0x8B, 0x4D, 0xE8, 0x83, 0xE9, 0x01, 0x89, 0x4D, 0xE8, 0x83, 0x7D, 0xAC, 98 | 0x00, 0x0F, 0x84, 0x3A, 0x01, 0x00, 0x00, 0x8B, 0x55, 0xEC, 0x66, 0x8B, 0x02, 0x66, 0xC1, 0xE8, 99 | 0x0C, 0x66, 0x83, 0xE0, 0x0F, 0x0F, 0xB7, 0xC8, 0x83, 0xF9, 0x0A, 0x75, 0x30, 0xBA, 0xFF, 0x0F, 100 | 0x00, 0x00, 0x8B, 0x45, 0xEC, 0x66, 0x23, 0x10, 0x0F, 0xB7, 0xCA, 0x8B, 0x55, 0xF4, 0x8B, 0x04, 101 | 0x0A, 0x03, 0x45, 0x08, 0xB9, 0xFF, 0x0F, 0x00, 0x00, 0x8B, 0x55, 0xEC, 0x66, 0x23, 0x0A, 0x0F, 102 | 0xB7, 0xC9, 0x8B, 0x55, 0xF4, 0x89, 0x04, 0x0A, 0xE9, 0xE6, 0x00, 0x00, 0x00, 0x8B, 0x45, 0xEC, 103 | 0x66, 0x8B, 0x08, 0x66, 0xC1, 0xE9, 0x0C, 0x66, 0x83, 0xE1, 0x0F, 0x0F, 0xB7, 0xD1, 0x83, 0xFA, 104 | 0x03, 0x75, 0x30, 0xB8, 0xFF, 0x0F, 0x00, 0x00, 0x8B, 0x4D, 0xEC, 0x66, 0x23, 0x01, 0x0F, 0xB7, 105 | 0xD0, 0x8B, 0x45, 0xF4, 0x8B, 0x0C, 0x10, 0x03, 0x4D, 0x08, 0xBA, 0xFF, 0x0F, 0x00, 0x00, 0x8B, 106 | 0x45, 0xEC, 0x66, 0x23, 0x10, 0x0F, 0xB7, 0xD2, 0x8B, 0x45, 0xF4, 0x89, 0x0C, 0x10, 0xE9, 0xA0, 107 | 0x00, 0x00, 0x00, 0x8B, 0x4D, 0xEC, 0x66, 0x8B, 0x11, 0x66, 0xC1, 0xEA, 0x0C, 0x66, 0x83, 0xE2, 108 | 0x0F, 0x0F, 0xB7, 0xC2, 0x83, 0xF8, 0x01, 0x75, 0x3D, 0xB9, 0xFF, 0x0F, 0x00, 0x00, 0x8B, 0x55, 109 | 0xEC, 0x66, 0x23, 0x0A, 0x0F, 0xB7, 0xC1, 0x8B, 0x4D, 0x08, 0xC1, 0xE9, 0x10, 0x81, 0xE1, 0xFF, 110 | 0xFF, 0x00, 0x00, 0x0F, 0xB7, 0xD1, 0x8B, 0x4D, 0xF4, 0x0F, 0xB7, 0x04, 0x01, 0x03, 0xC2, 0xB9, 111 | 0xFF, 0x0F, 0x00, 0x00, 0x8B, 0x55, 0xEC, 0x66, 0x23, 0x0A, 0x0F, 0xB7, 0xC9, 0x8B, 0x55, 0xF4, 112 | 0x66, 0x89, 0x04, 0x0A, 0xEB, 0x4D, 0x8B, 0x45, 0xEC, 0x66, 0x8B, 0x08, 0x66, 0xC1, 0xE9, 0x0C, 113 | 0x66, 0x83, 0xE1, 0x0F, 0x0F, 0xB7, 0xD1, 0x83, 0xFA, 0x02, 0x75, 0x37, 0xB8, 0xFF, 0x0F, 0x00, 114 | 0x00, 0x8B, 0x4D, 0xEC, 0x66, 0x23, 0x01, 0x0F, 0xB7, 0xD0, 0x8B, 0x45, 0x08, 0x25, 0xFF, 0xFF, 115 | 0x00, 0x00, 0x0F, 0xB7, 0xC8, 0x8B, 0x45, 0xF4, 0x0F, 0xB7, 0x14, 0x10, 0x03, 0xD1, 0xB8, 0xFF, 116 | 0x0F, 0x00, 0x00, 0x8B, 0x4D, 0xEC, 0x66, 0x23, 0x01, 0x0F, 0xB7, 0xC0, 0x8B, 0x4D, 0xF4, 0x66, 117 | 0x89, 0x14, 0x01, 0x8B, 0x55, 0xEC, 0x83, 0xC2, 0x02, 0x89, 0x55, 0xEC, 0xE9, 0xAD, 0xFE, 0xFF, 118 | 0xFF, 0x8B, 0x45, 0xF0, 0x8B, 0x4D, 0xF0, 0x03, 0x48, 0x04, 0x89, 0x4D, 0xF0, 0xE9, 0x6D, 0xFE, 119 | 0xFF, 0xFF, 0x8B, 0x55, 0xD8, 0x8B, 0x45, 0xF8, 0x03, 0x42, 0x28, 0x89, 0x45, 0xF4, 0x6A, 0x00, 120 | 0x6A, 0x00, 0x6A, 0xFF, 0xFF, 0x55, 0xBC, 0x6A, 0x00, 0x6A, 0x01, 0x8B, 0x4D, 0xF8, 0x51, 0xFF, 121 | 0x55, 0xF4, 0x8B, 0x45, 0xF8, 0x8B, 0xE5, 0x5D, 0xC2, 0x04, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 122 | 0x55, 0x8B, 0xEC, 0x51, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x45, 0xFC, 0x50, 0xE8, 123 | 0x2C, 0x00, 0x00, 0x00, 0x83, 0xC4, 0x04, 0x89, 0x45, 0xFC, 0x8B, 0x4D, 0x08, 0x0F, 0xBE, 0x11, 124 | 0x03, 0x55, 0xFC, 0x89, 0x55, 0xFC, 0x8B, 0x45, 0x08, 0x83, 0xC0, 0x01, 0x89, 0x45, 0x08, 0x8B, 125 | 0x4D, 0x08, 0x0F, 0xBE, 0x11, 0x85, 0xD2, 0x75, 0xD2, 0x8B, 0x45, 0xFC, 0x8B, 0xE5, 0x5D, 0xC3, 126 | 0x55, 0x8B, 0xEC, 0x8B, 0x45, 0x08, 0xC1, 0xC8, 0x0D, 0x5D, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 127 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 128 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 129 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 130 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 131 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 132 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 133 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 134 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 135 | 136 | 137 | }; 138 | 139 | 140 | unsigned char MemLoadShellcode_x64[] = { 141 | 142 | 143 | 0x48, 0x89, 0x4C, 0x24, 0x08, 0x48, 0x81, 0xEC, 0xD8, 0x00, 0x00, 0x00, 0x48, 0xC7, 0x84, 0x24, 144 | 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xC7, 0x84, 0x24, 0x80, 0x00, 0x00, 0x00, 145 | 0x00, 0x00, 0x00, 0x00, 0x48, 0xC7, 0x84, 0x24, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 146 | 0x48, 0xC7, 0x84, 0x24, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x84, 0x24, 147 | 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xB7, 0x00, 0x3D, 0x4D, 0x5A, 0x00, 0x00, 0x74, 0x07, 0x33, 0xC0, 148 | 0xE9, 0x19, 0x0B, 0x00, 0x00, 0x48, 0x8B, 0x84, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x63, 0x40, 149 | 0x3C, 0x48, 0x8B, 0x8C, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 150 | 0x89, 0x44, 0x24, 0x70, 0x48, 0x8B, 0x44, 0x24, 0x70, 0x81, 0x38, 0x50, 0x45, 0x00, 0x00, 0x74, 151 | 0x07, 0x33, 0xC0, 0xE9, 0xE6, 0x0A, 0x00, 0x00, 0x65, 0x48, 0x8B, 0x04, 0x25, 0x60, 0x00, 0x00, 152 | 0x00, 0x48, 0x89, 0x44, 0x24, 0x28, 0x48, 0x8B, 0x44, 0x24, 0x28, 0x48, 0x8B, 0x40, 0x18, 0x48, 153 | 0x89, 0x44, 0x24, 0x28, 0x48, 0x8B, 0x44, 0x24, 0x28, 0x48, 0x8B, 0x40, 0x20, 0x48, 0x89, 0x44, 154 | 0x24, 0x30, 0x48, 0x83, 0x7C, 0x24, 0x30, 0x00, 0x0F, 0x84, 0xF1, 0x03, 0x00, 0x00, 0x48, 0x8B, 155 | 0x44, 0x24, 0x30, 0x48, 0x8B, 0x40, 0x50, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x44, 0x24, 156 | 0x30, 0x0F, 0xB7, 0x40, 0x48, 0x66, 0x89, 0x44, 0x24, 0x20, 0x48, 0xC7, 0x44, 0x24, 0x38, 0x00, 157 | 0x00, 0x00, 0x00, 0x8B, 0x4C, 0x24, 0x38, 0xE8, 0xF4, 0x0A, 0x00, 0x00, 0x8B, 0xC0, 0x48, 0x89, 158 | 0x44, 0x24, 0x38, 0x48, 0x8B, 0x44, 0x24, 0x48, 0x0F, 0xB6, 0x00, 0x83, 0xF8, 0x61, 0x7C, 0x1F, 159 | 0x48, 0x8B, 0x44, 0x24, 0x48, 0x0F, 0xB6, 0x00, 0x83, 0xE8, 0x20, 0x48, 0x98, 0x48, 0x8B, 0x4C, 160 | 0x24, 0x38, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x38, 0xEB, 0x18, 0x48, 161 | 0x8B, 0x44, 0x24, 0x48, 0x0F, 0xB6, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x38, 0x48, 0x03, 0xC8, 0x48, 162 | 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x38, 0x48, 0x8B, 0x44, 0x24, 0x48, 0x48, 0xFF, 0xC0, 0x48, 163 | 0x89, 0x44, 0x24, 0x48, 0x0F, 0xB7, 0x44, 0x24, 0x20, 0x66, 0xFF, 0xC8, 0x66, 0x89, 0x44, 0x24, 164 | 0x20, 0x0F, 0xB7, 0x44, 0x24, 0x20, 0x85, 0xC0, 0x75, 0x89, 0x81, 0x7C, 0x24, 0x38, 0x5B, 0xBC, 165 | 0x4A, 0x6A, 0x0F, 0x85, 0xB1, 0x01, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x48, 0x8B, 0x40, 166 | 0x20, 0x48, 0x89, 0x44, 0x24, 0x28, 0x48, 0x8B, 0x44, 0x24, 0x28, 0x48, 0x63, 0x40, 0x3C, 0x48, 167 | 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x58, 0xB8, 168 | 0x08, 0x00, 0x00, 0x00, 0x48, 0x6B, 0xC0, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x58, 0x48, 0x8D, 0x84, 169 | 0x01, 0x88, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x60, 0x48, 0x8B, 0x44, 0x24, 0x60, 0x8B, 170 | 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 171 | 0x58, 0x48, 0x8B, 0x44, 0x24, 0x58, 0x8B, 0x40, 0x20, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 172 | 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x60, 0x48, 0x8B, 0x44, 0x24, 0x58, 0x8B, 0x40, 173 | 0x24, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 174 | 0x78, 0xB8, 0x03, 0x00, 0x00, 0x00, 0x66, 0x89, 0x44, 0x24, 0x20, 0x0F, 0xB7, 0x44, 0x24, 0x20, 175 | 0x85, 0xC0, 0x0F, 0x8E, 0x0C, 0x01, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x60, 0x8B, 0x00, 0x48, 176 | 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x8B, 0xC8, 0xE8, 0x5E, 0x09, 177 | 0x00, 0x00, 0x89, 0x44, 0x24, 0x50, 0x81, 0x7C, 0x24, 0x50, 0x8E, 0x4E, 0x0E, 0xEC, 0x74, 0x18, 178 | 0x81, 0x7C, 0x24, 0x50, 0xAA, 0xFC, 0x0D, 0x7C, 0x74, 0x0E, 0x81, 0x7C, 0x24, 0x50, 0x54, 0xCA, 179 | 0xAF, 0x91, 0x0F, 0x85, 0xAB, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x58, 0x8B, 0x40, 0x1C, 180 | 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x68, 181 | 0x48, 0x8B, 0x44, 0x24, 0x78, 0x0F, 0xB7, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x68, 0x48, 0x8D, 0x04, 182 | 0x81, 0x48, 0x89, 0x44, 0x24, 0x68, 0x81, 0x7C, 0x24, 0x50, 0x8E, 0x4E, 0x0E, 0xEC, 0x75, 0x1C, 183 | 0x48, 0x8B, 0x44, 0x24, 0x68, 0x8B, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 184 | 0x8B, 0xC1, 0x48, 0x89, 0x84, 0x24, 0x98, 0x00, 0x00, 0x00, 0xEB, 0x4A, 0x81, 0x7C, 0x24, 0x50, 185 | 0xAA, 0xFC, 0x0D, 0x7C, 0x75, 0x1C, 0x48, 0x8B, 0x44, 0x24, 0x68, 0x8B, 0x00, 0x48, 0x8B, 0x4C, 186 | 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x84, 0x24, 0x80, 0x00, 0x00, 0x00, 187 | 0xEB, 0x24, 0x81, 0x7C, 0x24, 0x50, 0x54, 0xCA, 0xAF, 0x91, 0x75, 0x1A, 0x48, 0x8B, 0x44, 0x24, 188 | 0x68, 0x8B, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 189 | 0x84, 0x24, 0x90, 0x00, 0x00, 0x00, 0x0F, 0xB7, 0x44, 0x24, 0x20, 0x66, 0xFF, 0xC8, 0x66, 0x89, 190 | 0x44, 0x24, 0x20, 0x48, 0x8B, 0x44, 0x24, 0x60, 0x48, 0x83, 0xC0, 0x04, 0x48, 0x89, 0x44, 0x24, 191 | 0x60, 0x48, 0x8B, 0x44, 0x24, 0x78, 0x48, 0x83, 0xC0, 0x02, 0x48, 0x89, 0x44, 0x24, 0x78, 0xE9, 192 | 0xE7, 0xFE, 0xFF, 0xFF, 0xE9, 0x56, 0x01, 0x00, 0x00, 0x81, 0x7C, 0x24, 0x38, 0x5D, 0x68, 0xFA, 193 | 0x3C, 0x0F, 0x85, 0x48, 0x01, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x48, 0x8B, 0x40, 0x20, 194 | 0x48, 0x89, 0x44, 0x24, 0x28, 0x48, 0x8B, 0x44, 0x24, 0x28, 0x48, 0x63, 0x40, 0x3C, 0x48, 0x8B, 195 | 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x58, 0xB8, 0x08, 196 | 0x00, 0x00, 0x00, 0x48, 0x6B, 0xC0, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x58, 0x48, 0x8D, 0x84, 0x01, 197 | 0x88, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x60, 0x48, 0x8B, 0x44, 0x24, 0x60, 0x8B, 0x00, 198 | 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x58, 199 | 0x48, 0x8B, 0x44, 0x24, 0x58, 0x8B, 0x40, 0x20, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 200 | 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x60, 0x48, 0x8B, 0x44, 0x24, 0x58, 0x8B, 0x40, 0x24, 201 | 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x78, 202 | 0xB8, 0x01, 0x00, 0x00, 0x00, 0x66, 0x89, 0x44, 0x24, 0x20, 0x0F, 0xB7, 0x44, 0x24, 0x20, 0x85, 203 | 0xC0, 0x0F, 0x8E, 0xA8, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x60, 0x8B, 0x00, 0x48, 0x8B, 204 | 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x8B, 0xC8, 0xE8, 0x9F, 0x07, 0x00, 205 | 0x00, 0x89, 0x44, 0x24, 0x50, 0x81, 0x7C, 0x24, 0x50, 0xB8, 0x0A, 0x4C, 0x53, 0x75, 0x5F, 0x48, 206 | 0x8B, 0x44, 0x24, 0x58, 0x8B, 0x40, 0x1C, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 207 | 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x68, 0x48, 0x8B, 0x44, 0x24, 0x78, 0x0F, 0xB7, 0x00, 0x48, 208 | 0x8B, 0x4C, 0x24, 0x68, 0x48, 0x8D, 0x04, 0x81, 0x48, 0x89, 0x44, 0x24, 0x68, 0x81, 0x7C, 0x24, 209 | 0x50, 0xB8, 0x0A, 0x4C, 0x53, 0x75, 0x1A, 0x48, 0x8B, 0x44, 0x24, 0x68, 0x8B, 0x00, 0x48, 0x8B, 210 | 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x84, 0x24, 0x88, 0x00, 0x00, 211 | 0x00, 0x0F, 0xB7, 0x44, 0x24, 0x20, 0x66, 0xFF, 0xC8, 0x66, 0x89, 0x44, 0x24, 0x20, 0x48, 0x8B, 212 | 0x44, 0x24, 0x60, 0x48, 0x83, 0xC0, 0x04, 0x48, 0x89, 0x44, 0x24, 0x60, 0x48, 0x8B, 0x44, 0x24, 213 | 0x78, 0x48, 0x83, 0xC0, 0x02, 0x48, 0x89, 0x44, 0x24, 0x78, 0xE9, 0x4B, 0xFF, 0xFF, 0xFF, 0x48, 214 | 0x83, 0xBC, 0x24, 0x98, 0x00, 0x00, 0x00, 0x00, 0x74, 0x23, 0x48, 0x83, 0xBC, 0x24, 0x80, 0x00, 215 | 0x00, 0x00, 0x00, 0x74, 0x18, 0x48, 0x83, 0xBC, 0x24, 0x90, 0x00, 0x00, 0x00, 0x00, 0x74, 0x0D, 216 | 0x48, 0x83, 0xBC, 0x24, 0x88, 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0xEB, 0x12, 0x48, 0x8B, 0x44, 217 | 0x24, 0x30, 0x48, 0x8B, 0x00, 0x48, 0x89, 0x44, 0x24, 0x30, 0xE9, 0x03, 0xFC, 0xFF, 0xFF, 0x48, 218 | 0x8B, 0x84, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xB7, 0x00, 0x3D, 0x4D, 0x5A, 0x00, 0x00, 0x74, 219 | 0x07, 0x33, 0xC0, 0xE9, 0xA6, 0x06, 0x00, 0x00, 0x48, 0x8B, 0x84, 0x24, 0xE0, 0x00, 0x00, 0x00, 220 | 0x48, 0x63, 0x40, 0x3C, 0x48, 0x8B, 0x8C, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x03, 0xC8, 0x48, 221 | 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x70, 0x48, 0x8B, 0x44, 0x24, 0x70, 0x81, 0x38, 0x50, 0x45, 222 | 0x00, 0x00, 0x74, 0x07, 0x33, 0xC0, 0xE9, 0x73, 0x06, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x70, 223 | 0x8B, 0x40, 0x50, 0x41, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x41, 0xB8, 0x00, 0x30, 0x00, 0x00, 0x8B, 224 | 0xD0, 0x33, 0xC9, 0xFF, 0x94, 0x24, 0x90, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x28, 0x48, 225 | 0x8B, 0x44, 0x24, 0x70, 0x8B, 0x40, 0x54, 0x48, 0x89, 0x44, 0x24, 0x30, 0x48, 0x8B, 0x84, 0x24, 226 | 0xE0, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x44, 0x24, 0x28, 0x48, 0x89, 227 | 0x44, 0x24, 0x38, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x48, 0x89, 0x84, 0x24, 0xA8, 0x00, 0x00, 0x00, 228 | 0x48, 0x8B, 0x44, 0x24, 0x30, 0x48, 0xFF, 0xC8, 0x48, 0x89, 0x44, 0x24, 0x30, 0x48, 0x83, 0xBC, 229 | 0x24, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x74, 0x2B, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x48, 0x8B, 0x4C, 230 | 0x24, 0x48, 0x0F, 0xB6, 0x09, 0x88, 0x08, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x48, 0xFF, 0xC0, 0x48, 231 | 0x89, 0x44, 0x24, 0x38, 0x48, 0x8B, 0x44, 0x24, 0x48, 0x48, 0xFF, 0xC0, 0x48, 0x89, 0x44, 0x24, 232 | 0x48, 0xEB, 0xB0, 0x48, 0x8B, 0x44, 0x24, 0x70, 0x0F, 0xB7, 0x40, 0x14, 0x48, 0x8B, 0x4C, 0x24, 233 | 0x70, 0x48, 0x8D, 0x44, 0x01, 0x18, 0x48, 0x89, 0x44, 0x24, 0x30, 0x48, 0x8B, 0x44, 0x24, 0x70, 234 | 0x0F, 0xB7, 0x40, 0x06, 0x48, 0x89, 0x84, 0x24, 0xA0, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x84, 0x24, 235 | 0xA0, 0x00, 0x00, 0x00, 0x48, 0x89, 0x84, 0x24, 0xB8, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x84, 0x24, 236 | 0xA0, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xC8, 0x48, 0x89, 0x84, 0x24, 0xA0, 0x00, 0x00, 0x00, 0x48, 237 | 0x83, 0xBC, 0x24, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0xA3, 0x00, 0x00, 0x00, 0x48, 0x8B, 238 | 0x44, 0x24, 0x30, 0x8B, 0x40, 0x0C, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 239 | 0xC1, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x8B, 0x40, 0x14, 0x48, 0x8B, 240 | 0x8C, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 241 | 0x38, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x8B, 0x40, 0x10, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 242 | 0x44, 0x24, 0x40, 0x48, 0x89, 0x84, 0x24, 0xB0, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x40, 243 | 0x48, 0xFF, 0xC8, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x83, 0xBC, 0x24, 0xB0, 0x00, 0x00, 0x00, 244 | 0x00, 0x74, 0x2B, 0x48, 0x8B, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x4C, 0x24, 0x38, 0x0F, 0xB6, 0x09, 245 | 0x88, 0x08, 0x48, 0x8B, 0x44, 0x24, 0x48, 0x48, 0xFF, 0xC0, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 246 | 0x8B, 0x44, 0x24, 0x38, 0x48, 0xFF, 0xC0, 0x48, 0x89, 0x44, 0x24, 0x38, 0xEB, 0xB0, 0x48, 0x8B, 247 | 0x44, 0x24, 0x30, 0x48, 0x83, 0xC0, 0x28, 0x48, 0x89, 0x44, 0x24, 0x30, 0xE9, 0x2B, 0xFF, 0xFF, 248 | 0xFF, 0xB8, 0x08, 0x00, 0x00, 0x00, 0x48, 0x6B, 0xC0, 0x01, 0x48, 0x8B, 0x4C, 0x24, 0x70, 0x48, 249 | 0x8D, 0x84, 0x01, 0x88, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x44, 0x24, 250 | 0x48, 0x8B, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 251 | 0x44, 0x24, 0x38, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x83, 0x78, 0x0C, 0x00, 0x0F, 0x84, 0xB9, 0x01, 252 | 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x8B, 0x40, 0x0C, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 253 | 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x8B, 0xC8, 0xFF, 0x94, 0x24, 0x98, 0x00, 0x00, 0x00, 0x48, 254 | 0x89, 0x84, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x8B, 0x00, 0x48, 0x8B, 255 | 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 256 | 0x44, 0x24, 0x38, 0x8B, 0x40, 0x10, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 257 | 0xC1, 0x48, 0x89, 0x44, 0x24, 0x30, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x48, 0x83, 0x38, 0x00, 0x0F, 258 | 0x84, 0x43, 0x01, 0x00, 0x00, 0x48, 0x83, 0x7C, 0x24, 0x40, 0x00, 0x0F, 0x84, 0xD3, 0x00, 0x00, 259 | 0x00, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x48, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 260 | 0x48, 0x8B, 0x00, 0x48, 0x23, 0xC1, 0x48, 0x85, 0xC0, 0x0F, 0x84, 0xB5, 0x00, 0x00, 0x00, 0x48, 261 | 0x8B, 0x84, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x63, 0x40, 0x3C, 0x48, 0x8B, 0x8C, 0x24, 0xE0, 262 | 0x00, 0x00, 0x00, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x58, 0xB8, 0x08, 263 | 0x00, 0x00, 0x00, 0x48, 0x6B, 0xC0, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x58, 0x48, 0x8D, 0x84, 0x01, 264 | 0x88, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x60, 0x48, 0x8B, 0x44, 0x24, 0x60, 0x8B, 0x00, 265 | 0x48, 0x8B, 0x8C, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 266 | 0x44, 0x24, 0x58, 0x48, 0x8B, 0x44, 0x24, 0x58, 0x8B, 0x40, 0x1C, 0x48, 0x8B, 0x8C, 0x24, 0xE0, 267 | 0x00, 0x00, 0x00, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x68, 0x48, 0x8B, 268 | 0x44, 0x24, 0x40, 0x48, 0x8B, 0x00, 0x48, 0x25, 0xFF, 0xFF, 0x00, 0x00, 0x48, 0x8B, 0x4C, 0x24, 269 | 0x58, 0x8B, 0x49, 0x10, 0x48, 0x2B, 0xC1, 0x48, 0x8B, 0x4C, 0x24, 0x68, 0x48, 0x8D, 0x04, 0x81, 270 | 0x48, 0x89, 0x44, 0x24, 0x68, 0x48, 0x8B, 0x44, 0x24, 0x68, 0x8B, 0x00, 0x48, 0x8B, 0x8C, 0x24, 271 | 0xE0, 0x00, 0x00, 0x00, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x8B, 0x4C, 0x24, 0x30, 0x48, 272 | 0x89, 0x01, 0xEB, 0x3B, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x48, 0x8B, 0x00, 0x48, 0x8B, 0x4C, 0x24, 273 | 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x44, 0x24, 274 | 0x48, 0x48, 0x83, 0xC0, 0x02, 0x48, 0x8B, 0xD0, 0x48, 0x8B, 0x8C, 0x24, 0xE0, 0x00, 0x00, 0x00, 275 | 0xFF, 0x94, 0x24, 0x80, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x30, 0x48, 0x89, 0x01, 0x48, 276 | 0x8B, 0x44, 0x24, 0x30, 0x48, 0x83, 0xC0, 0x08, 0x48, 0x89, 0x44, 0x24, 0x30, 0x48, 0x83, 0x7C, 277 | 0x24, 0x40, 0x00, 0x74, 0x0E, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x48, 0x83, 0xC0, 0x08, 0x48, 0x89, 278 | 0x44, 0x24, 0x40, 0xE9, 0xAE, 0xFE, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x48, 0x83, 0xC0, 279 | 0x14, 0x48, 0x89, 0x44, 0x24, 0x38, 0xE9, 0x38, 0xFE, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x70, 280 | 0x48, 0x8B, 0x40, 0x30, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x2B, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 281 | 0x89, 0x84, 0x24, 0xE0, 0x00, 0x00, 0x00, 0xB8, 0x08, 0x00, 0x00, 0x00, 0x48, 0x6B, 0xC0, 0x05, 282 | 0x48, 0x8B, 0x4C, 0x24, 0x70, 0x48, 0x8D, 0x84, 0x01, 0x88, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 283 | 0x24, 0x48, 0x48, 0x8B, 0x44, 0x24, 0x48, 0x83, 0x78, 0x04, 0x00, 0x0F, 0x84, 0x5C, 0x02, 0x00, 284 | 0x00, 0x48, 0x8B, 0x44, 0x24, 0x48, 0x8B, 0x00, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 285 | 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x38, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x83, 0x78, 0x04, 286 | 0x00, 0x0F, 0x84, 0x36, 0x02, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x8B, 0x00, 0x48, 0x8B, 287 | 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x30, 0x48, 0x8B, 288 | 0x44, 0x24, 0x38, 0x8B, 0x40, 0x04, 0x48, 0x83, 0xE8, 0x08, 0x33, 0xD2, 0xB9, 0x02, 0x00, 0x00, 289 | 0x00, 0x48, 0xF7, 0xF1, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x48, 0x83, 290 | 0xC0, 0x08, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 0x44, 0x24, 0x48, 0x48, 0x89, 0x84, 0x24, 291 | 0xC0, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x48, 0x48, 0xFF, 0xC8, 0x48, 0x89, 0x44, 0x24, 292 | 0x48, 0x48, 0x83, 0xBC, 0x24, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0xB0, 0x01, 0x00, 0x00, 293 | 0x48, 0x8B, 0x44, 0x24, 0x40, 0x0F, 0xB7, 0x00, 0x66, 0xC1, 0xE8, 0x0C, 0x66, 0x83, 0xE0, 0x0F, 294 | 0x0F, 0xB7, 0xC0, 0x83, 0xF8, 0x0A, 0x75, 0x4B, 0xB8, 0xFF, 0x0F, 0x00, 0x00, 0x48, 0x8B, 0x4C, 295 | 0x24, 0x40, 0x0F, 0xB7, 0x09, 0x66, 0x23, 0xC8, 0x0F, 0xB7, 0xC1, 0x0F, 0xB7, 0xC0, 0x48, 0x8B, 296 | 0x4C, 0x24, 0x30, 0x48, 0x8B, 0x04, 0x01, 0x48, 0x03, 0x84, 0x24, 0xE0, 0x00, 0x00, 0x00, 0xB9, 297 | 0xFF, 0x0F, 0x00, 0x00, 0x48, 0x8B, 0x54, 0x24, 0x40, 0x0F, 0xB7, 0x12, 0x66, 0x23, 0xD1, 0x0F, 298 | 0xB7, 0xCA, 0x0F, 0xB7, 0xC9, 0x48, 0x8B, 0x54, 0x24, 0x30, 0x48, 0x89, 0x04, 0x0A, 0xE9, 0x3A, 299 | 0x01, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x0F, 0xB7, 0x00, 0x66, 0xC1, 0xE8, 0x0C, 0x66, 300 | 0x83, 0xE0, 0x0F, 0x0F, 0xB7, 0xC0, 0x83, 0xF8, 0x03, 0x75, 0x48, 0xB8, 0xFF, 0x0F, 0x00, 0x00, 301 | 0x48, 0x8B, 0x4C, 0x24, 0x40, 0x0F, 0xB7, 0x09, 0x66, 0x23, 0xC8, 0x0F, 0xB7, 0xC1, 0x0F, 0xB7, 302 | 0xC0, 0x48, 0x8B, 0x4C, 0x24, 0x30, 0x8B, 0x04, 0x01, 0x03, 0x84, 0x24, 0xE0, 0x00, 0x00, 0x00, 303 | 0xB9, 0xFF, 0x0F, 0x00, 0x00, 0x48, 0x8B, 0x54, 0x24, 0x40, 0x0F, 0xB7, 0x12, 0x66, 0x23, 0xD1, 304 | 0x0F, 0xB7, 0xCA, 0x0F, 0xB7, 0xC9, 0x48, 0x8B, 0x54, 0x24, 0x30, 0x89, 0x04, 0x0A, 0xE9, 0xDA, 305 | 0x00, 0x00, 0x00, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x0F, 0xB7, 0x00, 0x66, 0xC1, 0xE8, 0x0C, 0x66, 306 | 0x83, 0xE0, 0x0F, 0x0F, 0xB7, 0xC0, 0x83, 0xF8, 0x01, 0x75, 0x58, 0xB8, 0xFF, 0x0F, 0x00, 0x00, 307 | 0x48, 0x8B, 0x4C, 0x24, 0x40, 0x0F, 0xB7, 0x09, 0x66, 0x23, 0xC8, 0x0F, 0xB7, 0xC1, 0x0F, 0xB7, 308 | 0xC0, 0x48, 0x8B, 0x8C, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x48, 0xC1, 0xE9, 0x10, 0x48, 0x81, 0xE1, 309 | 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xB7, 0xC9, 0x48, 0x8B, 0x54, 0x24, 0x30, 0x0F, 0xB7, 0x04, 0x02, 310 | 0x03, 0xC1, 0xB9, 0xFF, 0x0F, 0x00, 0x00, 0x48, 0x8B, 0x54, 0x24, 0x40, 0x0F, 0xB7, 0x12, 0x66, 311 | 0x23, 0xD1, 0x0F, 0xB7, 0xCA, 0x0F, 0xB7, 0xC9, 0x48, 0x8B, 0x54, 0x24, 0x30, 0x66, 0x89, 0x04, 312 | 0x0A, 0xEB, 0x6A, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x0F, 0xB7, 0x00, 0x66, 0xC1, 0xE8, 0x0C, 0x66, 313 | 0x83, 0xE0, 0x0F, 0x0F, 0xB7, 0xC0, 0x83, 0xF8, 0x02, 0x75, 0x52, 0xB8, 0xFF, 0x0F, 0x00, 0x00, 314 | 0x48, 0x8B, 0x4C, 0x24, 0x40, 0x0F, 0xB7, 0x09, 0x66, 0x23, 0xC8, 0x0F, 0xB7, 0xC1, 0x0F, 0xB7, 315 | 0xC0, 0x48, 0x8B, 0x8C, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x81, 0xE1, 0xFF, 0xFF, 0x00, 0x00, 316 | 0x0F, 0xB7, 0xC9, 0x48, 0x8B, 0x54, 0x24, 0x30, 0x0F, 0xB7, 0x04, 0x02, 0x03, 0xC1, 0xB9, 0xFF, 317 | 0x0F, 0x00, 0x00, 0x48, 0x8B, 0x54, 0x24, 0x40, 0x0F, 0xB7, 0x12, 0x66, 0x23, 0xD1, 0x0F, 0xB7, 318 | 0xCA, 0x0F, 0xB7, 0xC9, 0x48, 0x8B, 0x54, 0x24, 0x30, 0x66, 0x89, 0x04, 0x0A, 0x48, 0x8B, 0x44, 319 | 0x24, 0x40, 0x48, 0x83, 0xC0, 0x02, 0x48, 0x89, 0x44, 0x24, 0x40, 0xE9, 0x27, 0xFE, 0xFF, 0xFF, 320 | 0x48, 0x8B, 0x44, 0x24, 0x38, 0x8B, 0x40, 0x04, 0x48, 0x8B, 0x4C, 0x24, 0x38, 0x48, 0x03, 0xC8, 321 | 0x48, 0x8B, 0xC1, 0x48, 0x89, 0x44, 0x24, 0x38, 0xE9, 0xBB, 0xFD, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 322 | 0x24, 0x70, 0x8B, 0x40, 0x28, 0x48, 0x8B, 0x4C, 0x24, 0x28, 0x48, 0x03, 0xC8, 0x48, 0x8B, 0xC1, 323 | 0x48, 0x89, 0x44, 0x24, 0x30, 0x45, 0x33, 0xC0, 0x33, 0xD2, 0x48, 0xC7, 0xC1, 0xFF, 0xFF, 0xFF, 324 | 0xFF, 0xFF, 0x94, 0x24, 0x88, 0x00, 0x00, 0x00, 0x45, 0x33, 0xC0, 0xBA, 0x01, 0x00, 0x00, 0x00, 325 | 0x48, 0x8B, 0x4C, 0x24, 0x28, 0xFF, 0x54, 0x24, 0x30, 0x48, 0x8B, 0x44, 0x24, 0x28, 0x48, 0x81, 326 | 0xC4, 0xD8, 0x00, 0x00, 0x00, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 327 | 0x48, 0x89, 0x4C, 0x24, 0x08, 0x48, 0x83, 0xEC, 0x38, 0xC7, 0x44, 0x24, 0x20, 0x00, 0x00, 0x00, 328 | 0x00, 0x8B, 0x4C, 0x24, 0x20, 0xE8, 0x46, 0x00, 0x00, 0x00, 0x89, 0x44, 0x24, 0x20, 0x48, 0x8B, 329 | 0x44, 0x24, 0x40, 0x0F, 0xBE, 0x00, 0x8B, 0x4C, 0x24, 0x20, 0x03, 0xC8, 0x8B, 0xC1, 0x89, 0x44, 330 | 0x24, 0x20, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x48, 0xFF, 0xC0, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 331 | 0x8B, 0x44, 0x24, 0x40, 0x0F, 0xBE, 0x00, 0x85, 0xC0, 0x75, 0xC6, 0x8B, 0x44, 0x24, 0x20, 0x48, 332 | 0x83, 0xC4, 0x38, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 333 | 0x89, 0x4C, 0x24, 0x08, 0x8B, 0x44, 0x24, 0x08, 0xC1, 0xC8, 0x0D, 0xC3, 0x00, 0x00, 0x00, 0x00, 334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 335 | 0x00, 0x00, 0x00, 0x00, 0x24, 0xD9, 0x29, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 336 | 0x54, 0x00, 0x00, 0x00, 0x38, 0x20, 0x00, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 337 | 0x24, 0xD9, 0x29, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 338 | 0x8C, 0x20, 0x00, 0x00, 0x8C, 0x10, 0x00, 0x00, 0x52, 0x53, 0x44, 0x53, 0x45, 0x16, 0xB7, 0x56, 339 | 0x5A, 0x59, 0xCF, 0x4A, 0xA1, 0xCD, 0xB1, 0xA7, 0xB6, 0x5E, 0x15, 0xCE, 0x02, 0x00, 0x00, 0x00 340 | 341 | 342 | }; 343 | 344 | 345 | #endif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DriverInjectDll 2 | InjectDll 3 | -------------------------------------------------------------------------------- /_global.cpp: -------------------------------------------------------------------------------- 1 | #include "_global.h" 2 | 3 | void* RtlAllocateMemory(bool InZeroMemory, SIZE_T InSize) 4 | { 5 | void* Result = ExAllocatePoolWithTag(NonPagedPool, InSize, 'HIDE'); 6 | if(InZeroMemory && (Result != NULL)) 7 | RtlZeroMemory(Result, InSize); 8 | return Result; 9 | } 10 | 11 | void RtlFreeMemory(void* InPointer) 12 | { 13 | ExFreePool(InPointer); 14 | } 15 | 16 | //Based on: http://leguanyuan.blogspot.nl/2013/09/x64-inline-hook-zwcreatesection.html 17 | NTSTATUS RtlSuperCopyMemory(IN VOID UNALIGNED* Destination, IN CONST VOID UNALIGNED* Source, IN ULONG Length) 18 | { 19 | //Change memory properties. 20 | PMDL g_pmdl = IoAllocateMdl(Destination, Length, 0, 0, NULL); 21 | if(!g_pmdl) 22 | return STATUS_UNSUCCESSFUL; 23 | MmBuildMdlForNonPagedPool(g_pmdl); 24 | unsigned int* Mapped = (unsigned int*)MmMapLockedPages(g_pmdl, KernelMode); 25 | if(!Mapped) 26 | { 27 | IoFreeMdl(g_pmdl); 28 | return STATUS_UNSUCCESSFUL; 29 | } 30 | KIRQL kirql = KeRaiseIrqlToDpcLevel(); 31 | RtlCopyMemory(Mapped, Source, Length); 32 | KeLowerIrql(kirql); 33 | //Restore memory properties. 34 | MmUnmapLockedPages((PVOID)Mapped, g_pmdl); 35 | IoFreeMdl(g_pmdl); 36 | return STATUS_SUCCESS; 37 | } -------------------------------------------------------------------------------- /_global.h: -------------------------------------------------------------------------------- 1 | #ifndef _GLOBAL_H 2 | #define _GLOBAL_H 3 | 4 | #ifndef _WIN32_WINNT 5 | #define _WIN32_WINNT 0x0501 6 | #endif 7 | 8 | #ifdef __cplusplus 9 | extern "C" 10 | { 11 | #endif 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | #ifdef __cplusplus 21 | } 22 | #endif 23 | 24 | void* RtlAllocateMemory(bool InZeroMemory, SIZE_T InSize); 25 | void RtlFreeMemory(void* InPointer); 26 | NTSTATUS RtlSuperCopyMemory(IN VOID UNALIGNED* Destination, IN CONST VOID UNALIGNED* Source, IN ULONG Length); 27 | 28 | #endif -------------------------------------------------------------------------------- /driver_inject.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haidragon/DriverInjectDll/274489b7a548fe2cb3769d121e4d4787b2bb1e3e/driver_inject.cpp -------------------------------------------------------------------------------- /driver_inject.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.40629.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "driver_inject", "driver_inject.vcxproj", "{95EEC86A-C34A-4076-A55C-859BE9BFBDBF}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Input_dll", "Input_dll\Input_dll.vcxproj", "{4B797ED2-6D2A-41A8-AF02-FD3F41F43637}" 9 | EndProject 10 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Loader", "Loader\Loader.vcxproj", "{29392CD7-AAFC-434B-8395-A7016A677011}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Win32 = Debug|Win32 15 | Debug|x64 = Debug|x64 16 | Release|Win32 = Release|Win32 17 | Release|x64 = Release|x64 18 | Win7 Debug|Win32 = Win7 Debug|Win32 19 | Win7 Debug|x64 = Win7 Debug|x64 20 | Win7 Release|Win32 = Win7 Release|Win32 21 | Win7 Release|x64 = Win7 Release|x64 22 | EndGlobalSection 23 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 24 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Debug|Win32.ActiveCfg = Win7 Debug|Win32 25 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Debug|Win32.Build.0 = Win7 Debug|Win32 26 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Debug|x64.ActiveCfg = Win7 Debug|x64 27 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Debug|x64.Build.0 = Win7 Debug|x64 28 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Release|Win32.ActiveCfg = Win7 Release|Win32 29 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Release|Win32.Build.0 = Win7 Release|Win32 30 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Release|x64.ActiveCfg = Win7 Release|x64 31 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Release|x64.Build.0 = Win7 Release|x64 32 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 33 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 34 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 35 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 36 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 37 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 38 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 39 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 40 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Release|x64.Build.0 = Win7 Release|x64 41 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 42 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Debug|Win32.ActiveCfg = Debug|Win32 43 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Debug|Win32.Build.0 = Debug|Win32 44 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Debug|x64.ActiveCfg = Debug|Win32 45 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Release|Win32.ActiveCfg = Release|Win32 46 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Release|Win32.Build.0 = Release|Win32 47 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Release|x64.ActiveCfg = Release|Win32 48 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Win7 Debug|Win32.ActiveCfg = Debug|Win32 49 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Win7 Debug|Win32.Build.0 = Debug|Win32 50 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Win7 Debug|x64.ActiveCfg = Debug|Win32 51 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Win7 Release|Win32.ActiveCfg = Release|Win32 52 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Win7 Release|Win32.Build.0 = Release|Win32 53 | {4B797ED2-6D2A-41A8-AF02-FD3F41F43637}.Win7 Release|x64.ActiveCfg = Release|Win32 54 | {29392CD7-AAFC-434B-8395-A7016A677011}.Debug|Win32.ActiveCfg = Debug|Win32 55 | {29392CD7-AAFC-434B-8395-A7016A677011}.Debug|Win32.Build.0 = Debug|Win32 56 | {29392CD7-AAFC-434B-8395-A7016A677011}.Debug|x64.ActiveCfg = Debug|x64 57 | {29392CD7-AAFC-434B-8395-A7016A677011}.Debug|x64.Build.0 = Debug|x64 58 | {29392CD7-AAFC-434B-8395-A7016A677011}.Release|Win32.ActiveCfg = Release|Win32 59 | {29392CD7-AAFC-434B-8395-A7016A677011}.Release|Win32.Build.0 = Release|Win32 60 | {29392CD7-AAFC-434B-8395-A7016A677011}.Release|x64.ActiveCfg = Release|x64 61 | {29392CD7-AAFC-434B-8395-A7016A677011}.Release|x64.Build.0 = Release|x64 62 | {29392CD7-AAFC-434B-8395-A7016A677011}.Win7 Debug|Win32.ActiveCfg = Debug|Win32 63 | {29392CD7-AAFC-434B-8395-A7016A677011}.Win7 Debug|Win32.Build.0 = Debug|Win32 64 | {29392CD7-AAFC-434B-8395-A7016A677011}.Win7 Debug|x64.ActiveCfg = Debug|x64 65 | {29392CD7-AAFC-434B-8395-A7016A677011}.Win7 Debug|x64.Build.0 = Debug|x64 66 | {29392CD7-AAFC-434B-8395-A7016A677011}.Win7 Release|Win32.ActiveCfg = Release|Win32 67 | {29392CD7-AAFC-434B-8395-A7016A677011}.Win7 Release|Win32.Build.0 = Release|Win32 68 | {29392CD7-AAFC-434B-8395-A7016A677011}.Win7 Release|x64.ActiveCfg = Release|x64 69 | {29392CD7-AAFC-434B-8395-A7016A677011}.Win7 Release|x64.Build.0 = Release|x64 70 | EndGlobalSection 71 | GlobalSection(SolutionProperties) = preSolution 72 | HideSolutionNode = FALSE 73 | EndGlobalSection 74 | EndGlobal 75 | -------------------------------------------------------------------------------- /driver_inject.v12.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haidragon/DriverInjectDll/274489b7a548fe2cb3769d121e4d4787b2bb1e3e/driver_inject.v12.suo -------------------------------------------------------------------------------- /driver_inject.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Win7 Debug 6 | Win32 7 | 8 | 9 | Win7 Release 10 | Win32 11 | 12 | 13 | Win7 Debug 14 | x64 15 | 16 | 17 | Win7 Release 18 | x64 19 | 20 | 21 | 22 | {95EEC86A-C34A-4076-A55C-859BE9BFBDBF} 23 | {1bc93793-694f-48fe-9372-81e2b05556fd} 24 | v4.5 25 | 11.0 26 | Win8.1 Debug 27 | Win32 28 | TitanHide 29 | driver_inject 30 | 31 | 32 | 33 | Windows7 34 | true 35 | WindowsKernelModeDriver8.1 36 | Driver 37 | WDM 38 | 39 | 40 | Windows7 41 | false 42 | WindowsKernelModeDriver8.1 43 | Driver 44 | WDM 45 | 46 | 47 | Windows7 48 | true 49 | WindowsKernelModeDriver8.1 50 | Driver 51 | WDM 52 | 53 | 54 | Windows7 55 | false 56 | WindowsKernelModeDriver8.1 57 | Driver 58 | WDM 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | DbgengKernelDebugger 69 | Temp\$(ProjectName)\$(Platform)\$(ConfigurationName)\ 70 | $(SolutionDir)\Bin\ 71 | 72 | 73 | DbgengKernelDebugger 74 | Temp\$(ProjectName)\$(Platform)\$(ConfigurationName)\ 75 | $(SolutionDir)\Bin\ 76 | 77 | 78 | DbgengKernelDebugger 79 | $(SolutionDir)\Bin\ 80 | Temp\$(ProjectName)\$(Platform)\$(ConfigurationName)\ 81 | $(TargetName.Replace(' ',''))_x64_d 82 | 83 | 84 | DbgengKernelDebugger 85 | $(TargetName.Replace(' ',''))_x64 86 | Temp\$(ProjectName)\$(Platform)\$(ConfigurationName)\ 87 | $(SolutionDir)\Bin\ 88 | 89 | 90 | 91 | false 92 | trace.h 93 | true 94 | false 95 | _DEBUG;_X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions) 96 | 97 | 98 | 5.01 99 | 100 | false 101 | 102 | 103 | 104 | 105 | false 106 | trace.h 107 | true 108 | false 109 | 110 | 111 | 5.01 112 | 113 | false 114 | false 115 | 116 | 117 | 118 | 119 | false 120 | trace.h 121 | true 122 | false 123 | _DEBUG;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions) 124 | 125 | 126 | 5.01 127 | 128 | false 129 | 130 | 131 | 132 | 133 | false 134 | trace.h 135 | true 136 | false 137 | 138 | 139 | 5.01 140 | 141 | false 142 | false 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /driver_inject.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 | 18 | 19 | Header Files 20 | 21 | 22 | Header Files 23 | 24 | 25 | Header Files 26 | 27 | 28 | Header Files 29 | 30 | 31 | Header Files 32 | 33 | 34 | Header Files 35 | 36 | 37 | Header Files 38 | 39 | 40 | Header Files 41 | 42 | 43 | Header Files 44 | 45 | 46 | 47 | 48 | Source Files 49 | 50 | 51 | Source Files 52 | 53 | 54 | Source Files 55 | 56 | 57 | Source Files 58 | 59 | 60 | Source Files 61 | 62 | 63 | Source Files 64 | 65 | 66 | Source Files 67 | 68 | 69 | Source Files 70 | 71 | 72 | -------------------------------------------------------------------------------- /hooklib.cpp: -------------------------------------------------------------------------------- 1 | #include "hooklib.h" 2 | 3 | 4 | static HOOK hook_internal(ULONG_PTR addr, void* newfunc) 5 | { 6 | //allocate structure 7 | HOOK hook = (HOOK)RtlAllocateMemory(true, sizeof(HOOKSTRUCT)); 8 | //set hooking address 9 | hook->addr = addr; 10 | //set hooking opcode 11 | #ifdef _WIN64 12 | hook->hook.mov = 0xB848; 13 | #else 14 | hook->hook.mov = 0xB8; 15 | #endif 16 | hook->hook.addr = (ULONG_PTR)newfunc; 17 | hook->hook.push = 0x50; 18 | hook->hook.ret = 0xc3; 19 | //set original data 20 | RtlCopyMemory(&hook->orig, (const void*)addr, sizeof(HOOKOPCODES)); 21 | if(!NT_SUCCESS(RtlSuperCopyMemory((void*)addr, &hook->hook, sizeof(HOOKOPCODES)))) 22 | { 23 | RtlFreeMemory(hook); 24 | return 0; 25 | } 26 | return hook; 27 | } 28 | 29 | HOOK Hooklib::Hook(PVOID api, void* newfunc) 30 | { 31 | ULONG_PTR addr = (ULONG_PTR)api; 32 | if(!addr) 33 | return 0; 34 | DbgPrint("[DeugMessage] hook(0x%p, 0x%p)\r\n", addr, newfunc); 35 | return hook_internal(addr, newfunc); 36 | } 37 | 38 | bool Hooklib::Hook(HOOK hook) 39 | { 40 | if(!hook) 41 | return false; 42 | return (NT_SUCCESS(RtlSuperCopyMemory((void*)hook->addr, &hook->hook, sizeof(HOOKOPCODES)))); 43 | } 44 | 45 | bool Hooklib::Unhook(HOOK hook, bool free) 46 | { 47 | if(!hook || !hook->addr) 48 | return false; 49 | if(NT_SUCCESS(RtlSuperCopyMemory((void*)hook->addr, hook->orig, sizeof(HOOKOPCODES)))) 50 | { 51 | if(free) 52 | RtlFreeMemory(hook); 53 | return true; 54 | } 55 | return false; 56 | } 57 | -------------------------------------------------------------------------------- /hooklib.h: -------------------------------------------------------------------------------- 1 | #ifndef _HOOKLIB_H_ 2 | #define _HOOKLIB_H_ 3 | 4 | #include "_global.h" 5 | 6 | #pragma pack(push,1) 7 | struct HOOKOPCODES 8 | { 9 | #ifdef _WIN64 10 | unsigned short int mov; 11 | #else 12 | unsigned char mov; 13 | #endif 14 | ULONG_PTR addr; 15 | unsigned char push; 16 | unsigned char ret; 17 | }; 18 | #pragma pack(pop) 19 | 20 | typedef struct HOOKSTRUCT 21 | { 22 | ULONG_PTR addr; 23 | HOOKOPCODES hook; 24 | unsigned char orig[sizeof(HOOKOPCODES)]; 25 | //SSDT extension 26 | int SSDTindex; 27 | LONG SSDTold; 28 | LONG SSDTnew; 29 | ULONG_PTR SSDTaddress; 30 | }* HOOK; 31 | 32 | class Hooklib 33 | { 34 | public: 35 | static HOOK Hook(PVOID api, void* newfunc); 36 | static bool Hook(HOOK hook); 37 | static bool Unhook(HOOK hook, bool free = false); 38 | }; 39 | 40 | #endif //_HOOKLIB_H_ 41 | -------------------------------------------------------------------------------- /misc.cpp: -------------------------------------------------------------------------------- 1 | #include "misc.h" 2 | #include "undocumented.h" 3 | 4 | ULONG Misc::GetProcessIDFromProcessHandle(HANDLE ProcessHandle) 5 | { 6 | PROCESS_BASIC_INFORMATION PBI; 7 | if(NT_SUCCESS(Undocumented::ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, &PBI, sizeof(PBI), NULL))) 8 | return (ULONG)PBI.UniqueProcessId; 9 | else 10 | return 0; 11 | } 12 | 13 | ULONG Misc::GetProcessIDFromThreadHandle(HANDLE ThreadHandle) 14 | { 15 | typedef struct _THREAD_BASIC_INFORMATION 16 | { 17 | NTSTATUS ExitStatus; 18 | PVOID TebBaseAddress; 19 | CLIENT_ID ClientId; 20 | KAFFINITY AffinityMask; 21 | KPRIORITY Priority; 22 | KPRIORITY BasePriority; 23 | } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; 24 | THREAD_BASIC_INFORMATION TBI; 25 | if(NT_SUCCESS(Undocumented::ZwQueryInformationThread(ThreadHandle, ThreadBasicInformation, &TBI, sizeof(TBI), NULL))) 26 | return (ULONG)TBI.ClientId.UniqueProcess; 27 | else 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /misc.h: -------------------------------------------------------------------------------- 1 | #ifndef _MISC_H 2 | #define _MISC_H 3 | 4 | #include "_global.h" 5 | 6 | class Misc 7 | { 8 | public: 9 | static ULONG GetProcessIDFromProcessHandle(HANDLE ProcessHandle); 10 | static ULONG GetProcessIDFromThreadHandle(HANDLE ThreadHandle); 11 | }; 12 | 13 | #endif -------------------------------------------------------------------------------- /ntdll.cpp: -------------------------------------------------------------------------------- 1 | #include "ntdll.h" 2 | 3 | #include "pe.h" 4 | 5 | unsigned char* NTDLL::FileData = 0; 6 | ULONG NTDLL::FileSize = 0; 7 | 8 | NTSTATUS NTDLL::Initialize() 9 | { 10 | UNICODE_STRING FileName; 11 | OBJECT_ATTRIBUTES ObjectAttributes; 12 | RtlInitUnicodeString(&FileName, L"\\SystemRoot\\system32\\ntdll.dll"); 13 | InitializeObjectAttributes(&ObjectAttributes, &FileName, 14 | OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 15 | NULL, NULL); 16 | 17 | if(KeGetCurrentIrql() != PASSIVE_LEVEL) 18 | { 19 | #ifdef _DEBUG 20 | DbgPrint("[DeugMessage] KeGetCurrentIrql != PASSIVE_LEVEL!\n"); 21 | #endif 22 | return STATUS_UNSUCCESSFUL; 23 | } 24 | 25 | HANDLE FileHandle; 26 | IO_STATUS_BLOCK IoStatusBlock; 27 | NTSTATUS NtStatus = ZwCreateFile(&FileHandle, 28 | GENERIC_READ, 29 | &ObjectAttributes, 30 | &IoStatusBlock, NULL, 31 | FILE_ATTRIBUTE_NORMAL, 32 | FILE_SHARE_READ, 33 | FILE_OPEN, 34 | FILE_SYNCHRONOUS_IO_NONALERT, 35 | NULL, 0); 36 | if(NT_SUCCESS(NtStatus)) 37 | { 38 | FILE_STANDARD_INFORMATION StandardInformation = { 0 }; 39 | NtStatus = ZwQueryInformationFile(FileHandle, &IoStatusBlock, &StandardInformation, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation); 40 | if(NT_SUCCESS(NtStatus)) 41 | { 42 | FileSize = StandardInformation.EndOfFile.LowPart; 43 | DbgPrint("[DeugMessage] FileSize of ntdll.dll is %08X!\r\n", StandardInformation.EndOfFile.LowPart); 44 | FileData = (unsigned char*)RtlAllocateMemory(true, FileSize); 45 | 46 | LARGE_INTEGER ByteOffset; 47 | ByteOffset.LowPart = ByteOffset.HighPart = 0; 48 | NtStatus = ZwReadFile(FileHandle, 49 | NULL, NULL, NULL, 50 | &IoStatusBlock, 51 | FileData, 52 | FileSize, 53 | &ByteOffset, NULL); 54 | 55 | if(!NT_SUCCESS(NtStatus)) 56 | { 57 | RtlFreeMemory(FileData); 58 | DbgPrint("[DeugMessage] ZwReadFile failed with status %08X...\r\n", NtStatus); 59 | } 60 | } 61 | else 62 | DbgPrint("[DeugMessage] ZwQueryInformationFile failed with status %08X...\r\n", NtStatus); 63 | ZwClose(FileHandle); 64 | } 65 | else 66 | DbgPrint("[DeugMessage] ZwCreateFile failed with status %08X...\r\n", NtStatus); 67 | return NtStatus; 68 | } 69 | 70 | void NTDLL::Deinitialize() 71 | { 72 | RtlFreeMemory(FileData); 73 | } 74 | 75 | int NTDLL::GetExportSsdtIndex(const char* ExportName) 76 | { 77 | ULONG_PTR ExportOffset = PE::GetExportOffset(FileData, FileSize, ExportName); 78 | if(ExportOffset == PE_ERROR_VALUE) 79 | return -1; 80 | 81 | int SsdtOffset = -1; 82 | unsigned char* ExportData = FileData + ExportOffset; 83 | for(int i = 0; i < 32 && ExportOffset + i < FileSize; i++) 84 | { 85 | if(ExportData[i] == 0xC2 || ExportData[i] == 0xC3) //RET 86 | break; 87 | if(ExportData[i] == 0xB8) //mov eax,X 88 | { 89 | SsdtOffset = *(int*)(ExportData + i + 1); 90 | break; 91 | } 92 | } 93 | 94 | if(SsdtOffset == -1) 95 | { 96 | DbgPrint("[DeugMessage] SSDT Offset for %s not found...\r\n", ExportName); 97 | } 98 | 99 | return SsdtOffset; 100 | } -------------------------------------------------------------------------------- /ntdll.h: -------------------------------------------------------------------------------- 1 | #ifndef _NTDLL_H 2 | #define _NTDLL_H 3 | 4 | #include "_global.h" 5 | 6 | class NTDLL 7 | { 8 | public: 9 | static NTSTATUS Initialize(); 10 | static void Deinitialize(); 11 | static int GetExportSsdtIndex(const char* ExportName); 12 | 13 | private: 14 | static unsigned char* FileData; 15 | static ULONG FileSize; 16 | }; 17 | 18 | #endif //_NTDLL_H -------------------------------------------------------------------------------- /pe.cpp: -------------------------------------------------------------------------------- 1 | #include "pe.h" 2 | 3 | 4 | static ULONG RvaToSection(IMAGE_NT_HEADERS* pNtHdr, ULONG dwRVA) 5 | { 6 | USHORT wSections; 7 | PIMAGE_SECTION_HEADER pSectionHdr; 8 | pSectionHdr = IMAGE_FIRST_SECTION(pNtHdr); 9 | wSections = pNtHdr->FileHeader.NumberOfSections; 10 | for(int i = 0; i < wSections; i++) 11 | { 12 | if(pSectionHdr[i].VirtualAddress <= dwRVA) 13 | if((pSectionHdr[i].VirtualAddress + pSectionHdr[i].Misc.VirtualSize) > dwRVA) 14 | { 15 | return i; 16 | } 17 | } 18 | return (ULONG) - 1; 19 | } 20 | 21 | static ULONG RvaToOffset(PIMAGE_NT_HEADERS pnth, ULONG Rva, ULONG FileSize) 22 | { 23 | PIMAGE_SECTION_HEADER psh = IMAGE_FIRST_SECTION(pnth); 24 | USHORT NumberOfSections = pnth->FileHeader.NumberOfSections; 25 | for(int i = 0; i < NumberOfSections; i++) 26 | { 27 | if(psh->VirtualAddress <= Rva) 28 | { 29 | if((psh->VirtualAddress + psh->Misc.VirtualSize) > Rva) 30 | { 31 | Rva -= psh->VirtualAddress; 32 | Rva += psh->PointerToRawData; 33 | return Rva < FileSize ? Rva : PE_ERROR_VALUE; 34 | } 35 | } 36 | psh++; 37 | } 38 | return PE_ERROR_VALUE; 39 | } 40 | 41 | ULONG PE::GetExportOffset(const unsigned char* FileData, ULONG FileSize, const char* ExportName) 42 | { 43 | //Verify DOS Header 44 | PIMAGE_DOS_HEADER pdh = (PIMAGE_DOS_HEADER)FileData; 45 | if(pdh->e_magic != IMAGE_DOS_SIGNATURE) 46 | { 47 | DbgPrint("[DeugMessage] Invalid IMAGE_DOS_SIGNATURE!\r\n"); 48 | return PE_ERROR_VALUE; 49 | } 50 | 51 | //Verify PE Header 52 | PIMAGE_NT_HEADERS pnth = (PIMAGE_NT_HEADERS)(FileData + pdh->e_lfanew); 53 | if(pnth->Signature != IMAGE_NT_SIGNATURE) 54 | { 55 | DbgPrint("[DeugMessage] Invalid IMAGE_NT_SIGNATURE!\r\n"); 56 | return PE_ERROR_VALUE; 57 | } 58 | 59 | //Verify Export Directory 60 | PIMAGE_DATA_DIRECTORY pdd = NULL; 61 | if(pnth->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) 62 | pdd = ((PIMAGE_NT_HEADERS64)pnth)->OptionalHeader.DataDirectory; 63 | else 64 | pdd = ((PIMAGE_NT_HEADERS32)pnth)->OptionalHeader.DataDirectory; 65 | ULONG ExportDirRva = pdd[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; 66 | ULONG ExportDirSize = pdd[IMAGE_DIRECTORY_ENTRY_EXPORT].Size; 67 | ULONG ExportDirOffset = RvaToOffset(pnth, ExportDirRva, FileSize); 68 | if(ExportDirOffset == PE_ERROR_VALUE) 69 | { 70 | DbgPrint("[DeugMessage] Invalid Export Directory!\r\n"); 71 | return PE_ERROR_VALUE; 72 | } 73 | 74 | //Read Export Directory 75 | PIMAGE_EXPORT_DIRECTORY ExportDir = (PIMAGE_EXPORT_DIRECTORY)(FileData + ExportDirOffset); 76 | ULONG NumberOfNames = ExportDir->NumberOfNames; 77 | ULONG AddressOfFunctionsOffset = RvaToOffset(pnth, ExportDir->AddressOfFunctions, FileSize); 78 | ULONG AddressOfNameOrdinalsOffset = RvaToOffset(pnth, ExportDir->AddressOfNameOrdinals, FileSize); 79 | ULONG AddressOfNamesOffset = RvaToOffset(pnth, ExportDir->AddressOfNames, FileSize); 80 | if(AddressOfFunctionsOffset == PE_ERROR_VALUE || 81 | AddressOfNameOrdinalsOffset == PE_ERROR_VALUE || 82 | AddressOfNamesOffset == PE_ERROR_VALUE) 83 | { 84 | DbgPrint("[DeugMessage] Invalid Export Directory Contents!\r\n"); 85 | return PE_ERROR_VALUE; 86 | } 87 | ULONG* AddressOfFunctions = (ULONG*)(FileData + AddressOfFunctionsOffset); 88 | USHORT* AddressOfNameOrdinals = (USHORT*)(FileData + AddressOfNameOrdinalsOffset); 89 | ULONG* AddressOfNames = (ULONG*)(FileData + AddressOfNamesOffset); 90 | 91 | //Find Export 92 | ULONG ExportOffset = PE_ERROR_VALUE; 93 | for(ULONG i = 0; i < NumberOfNames; i++) 94 | { 95 | ULONG CurrentNameOffset = RvaToOffset(pnth, AddressOfNames[i], FileSize); 96 | if(CurrentNameOffset == PE_ERROR_VALUE) 97 | continue; 98 | const char* CurrentName = (const char*)(FileData + CurrentNameOffset); 99 | ULONG CurrentFunctionRva = AddressOfFunctions[AddressOfNameOrdinals[i]]; 100 | if(CurrentFunctionRva >= ExportDirRva && CurrentFunctionRva < ExportDirRva + ExportDirSize) 101 | continue; //we ignore forwarded exports 102 | if(!strcmp(CurrentName, ExportName)) //compare the export name to the requested export 103 | { 104 | ExportOffset = RvaToOffset(pnth, CurrentFunctionRva, FileSize); 105 | break; 106 | } 107 | } 108 | 109 | if(ExportOffset == PE_ERROR_VALUE) 110 | { 111 | DbgPrint("[DeugMessage] Export %s not found in export table!\r\n", ExportName); 112 | } 113 | 114 | return ExportOffset; 115 | } 116 | 117 | PVOID PE::GetPageBase(PVOID lpHeader, ULONG* Size, PVOID ptr) 118 | { 119 | if((unsigned char*)ptr < (unsigned char*)lpHeader) 120 | return 0; 121 | ULONG dwRva = (ULONG)((unsigned char*)ptr - (unsigned char*)lpHeader); 122 | IMAGE_DOS_HEADER* pdh = (IMAGE_DOS_HEADER*)lpHeader; 123 | if(pdh->e_magic != IMAGE_DOS_SIGNATURE) 124 | return 0; 125 | IMAGE_NT_HEADERS* pnth = (IMAGE_NT_HEADERS*)((unsigned char*)lpHeader + pdh->e_lfanew); 126 | if(pnth->Signature != IMAGE_NT_SIGNATURE) 127 | return 0; 128 | IMAGE_SECTION_HEADER* psh = IMAGE_FIRST_SECTION(pnth); 129 | int section = RvaToSection(pnth, dwRva); 130 | if(section == -1) 131 | return 0; 132 | if(Size) 133 | *Size = psh[section].SizeOfRawData; 134 | return (PVOID)((unsigned char*)lpHeader + psh[section].VirtualAddress); 135 | } -------------------------------------------------------------------------------- /pe.h: -------------------------------------------------------------------------------- 1 | #ifndef _PE_H 2 | #define _PE_H 3 | 4 | #include "_global.h" 5 | 6 | #define PE_ERROR_VALUE (ULONG)-1 7 | 8 | class PE 9 | { 10 | public: 11 | static PVOID GetPageBase(PVOID lpHeader, ULONG* Size, PVOID ptr); 12 | static ULONG GetExportOffset(const unsigned char* FileData, ULONG FileSize, const char* ExportName); 13 | }; 14 | 15 | #endif -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Driver Memory Inject Dll 2 | 3 | -------------------------------------------------------------------------------- /ssdt.cpp: -------------------------------------------------------------------------------- 1 | #include "ssdt.h" 2 | #include "undocumented.h" 3 | #include "pe.h" 4 | 5 | #include "ntdll.h" 6 | 7 | //structures 8 | struct SSDTStruct 9 | { 10 | LONG* pServiceTable; 11 | PVOID pCounterTable; 12 | #ifdef _WIN64 13 | ULONGLONG NumberOfServices; 14 | #else 15 | ULONG NumberOfServices; 16 | #endif 17 | PCHAR pArgumentTable; 18 | }; 19 | 20 | //Based on: https://github.com/hfiref0x/WinObjEx64 21 | static SSDTStruct* SSDTfind() 22 | { 23 | static SSDTStruct* SSDT = 0; 24 | if(!SSDT) 25 | { 26 | #ifndef _WIN64 27 | //x86 code 28 | UNICODE_STRING routineName; 29 | RtlInitUnicodeString(&routineName, L"KeServiceDescriptorTable"); 30 | SSDT = (SSDTStruct*)MmGetSystemRoutineAddress(&routineName); 31 | #else 32 | //x64 code 33 | ULONG kernelSize; 34 | ULONG_PTR kernelBase = (ULONG_PTR)Undocumented::GetKernelBase(&kernelSize); 35 | if(kernelBase == 0 || kernelSize == 0) 36 | return NULL; 37 | 38 | // Find KiSystemServiceStart 39 | const unsigned char KiSystemServiceStartPattern[] = { 0x8B, 0xF8, 0xC1, 0xEF, 0x07, 0x83, 0xE7, 0x20, 0x25, 0xFF, 0x0F, 0x00, 0x00 }; 40 | const ULONG signatureSize = sizeof(KiSystemServiceStartPattern); 41 | bool found = false; 42 | ULONG KiSSSOffset; 43 | for(KiSSSOffset = 0; KiSSSOffset < kernelSize - signatureSize; KiSSSOffset++) 44 | { 45 | if(RtlCompareMemory(((unsigned char*)kernelBase + KiSSSOffset), KiSystemServiceStartPattern, signatureSize) == signatureSize) 46 | { 47 | found = true; 48 | break; 49 | } 50 | } 51 | if(!found) 52 | return NULL; 53 | 54 | // lea r10, KeServiceDescriptorTable 55 | ULONG_PTR address = kernelBase + KiSSSOffset + signatureSize; 56 | LONG relativeOffset = 0; 57 | if((*(unsigned char*)address == 0x4c) && 58 | (*(unsigned char*)(address + 1) == 0x8d) && 59 | (*(unsigned char*)(address + 2) == 0x15)) 60 | { 61 | relativeOffset = *(LONG*)(address + 3); 62 | } 63 | if(relativeOffset == 0) 64 | return NULL; 65 | 66 | SSDT = (SSDTStruct*)(address + relativeOffset + 7); 67 | #endif 68 | } 69 | return SSDT; 70 | } 71 | 72 | PVOID SSDT::GetFunctionAddress(const char* apiname) 73 | { 74 | //read address from SSDT 75 | SSDTStruct* SSDT = SSDTfind(); 76 | if(!SSDT) 77 | { 78 | DbgPrint("[DeugMessage] SSDT not found...\r\n"); 79 | return 0; 80 | } 81 | ULONG_PTR SSDTbase = (ULONG_PTR)SSDT->pServiceTable; 82 | if(!SSDTbase) 83 | { 84 | DbgPrint("[DeugMessage] ServiceTable not found...\r\n"); 85 | return 0; 86 | } 87 | ULONG readOffset = NTDLL::GetExportSsdtIndex(apiname); 88 | if(readOffset == -1) 89 | return 0; 90 | if(readOffset >= SSDT->NumberOfServices) 91 | { 92 | DbgPrint("[DeugMessage] Invalid read offset...\r\n"); 93 | return 0; 94 | } 95 | #ifdef _WIN64 96 | return (PVOID)((SSDT->pServiceTable[readOffset] >> 4) + SSDTbase); 97 | #else 98 | return (PVOID)SSDT->pServiceTable[readOffset]; 99 | #endif 100 | } 101 | 102 | static void InterlockedSet(LONG* Destination, LONG Source) 103 | { 104 | //Change memory properties. 105 | PMDL g_pmdl = IoAllocateMdl(Destination, sizeof(LONG), 0, 0, NULL); 106 | if(!g_pmdl) 107 | return; 108 | MmBuildMdlForNonPagedPool(g_pmdl); 109 | LONG* Mapped = (LONG*)MmMapLockedPages(g_pmdl, KernelMode); 110 | if(!Mapped) 111 | { 112 | IoFreeMdl(g_pmdl); 113 | return; 114 | } 115 | InterlockedExchange(Mapped, Source); 116 | //Restore memory properties. 117 | MmUnmapLockedPages((PVOID)Mapped, g_pmdl); 118 | IoFreeMdl(g_pmdl); 119 | } 120 | 121 | #ifdef _WIN64 122 | static PVOID FindCaveAddress(PVOID CodeStart, ULONG CodeSize, ULONG CaveSize) 123 | { 124 | unsigned char* Code = (unsigned char*)CodeStart; 125 | 126 | for(unsigned int i = 0, j = 0; i < CodeSize; i++) 127 | { 128 | if(Code[i] == 0x90 || Code[i] == 0xCC) //NOP or INT3 129 | j++; 130 | else 131 | j = 0; 132 | if(j == CaveSize) 133 | return (PVOID)((ULONG_PTR)CodeStart + i - CaveSize + 1); 134 | } 135 | return 0; 136 | } 137 | #endif //_WIN64 138 | 139 | HOOK SSDT::Hook(const char* apiname, void* newfunc) 140 | { 141 | SSDTStruct* SSDT = SSDTfind(); 142 | if(!SSDT) 143 | { 144 | DbgPrint("[DeugMessage] SSDT not found...\r\n"); 145 | return 0; 146 | } 147 | ULONG_PTR SSDTbase = (ULONG_PTR)SSDT->pServiceTable; 148 | if(!SSDTbase) 149 | { 150 | DbgPrint("[DeugMessage] ServiceTable not found...\r\n"); 151 | return 0; 152 | } 153 | int FunctionIndex = NTDLL::GetExportSsdtIndex(apiname); 154 | if(FunctionIndex == -1) 155 | return 0; 156 | if((ULONGLONG)FunctionIndex >= SSDT->NumberOfServices) 157 | { 158 | DbgPrint("[DeugMessage] Invalid API offset...\r\n"); 159 | return 0; 160 | } 161 | 162 | HOOK hHook = 0; 163 | LONG oldValue = SSDT->pServiceTable[FunctionIndex]; 164 | LONG newValue; 165 | 166 | #ifdef _WIN64 167 | /* 168 | x64 SSDT Hook; 169 | 1) find API addr 170 | 2) get code page+size 171 | 3) find cave address 172 | 4) hook cave address (using hooklib) 173 | 5) change SSDT value 174 | */ 175 | 176 | static ULONG CodeSize = 0; 177 | static PVOID CodeStart = 0; 178 | if(!CodeStart) 179 | { 180 | ULONG_PTR Lowest = SSDTbase; 181 | ULONG_PTR Highest = Lowest + 0x0FFFFFFF; 182 | DbgPrint("[DeugMessage] Range: 0x%p-0x%p\r\n", Lowest, Highest); 183 | CodeSize = 0; 184 | CodeStart = PE::GetPageBase(Undocumented::GetKernelBase(), &CodeSize, (PVOID)((oldValue >> 4) + SSDTbase)); 185 | if(!CodeStart || !CodeSize) 186 | { 187 | DbgPrint("[DeugMessage] PeGetPageBase failed...\r\n"); 188 | return 0; 189 | } 190 | DbgPrint("[DeugMessage] CodeStart: 0x%p, CodeSize: 0x%X\r\n", CodeStart, CodeSize); 191 | if((ULONG_PTR)CodeStart < Lowest) //start of the page is out of range (impossible, but whatever) 192 | { 193 | CodeSize -= (ULONG)(Lowest - (ULONG_PTR)CodeStart); 194 | CodeStart = (PVOID)Lowest; 195 | DbgPrint("[DeugMessage] CodeStart: 0x%p, CodeSize: 0x%X\r\n", CodeStart, CodeSize); 196 | } 197 | DbgPrint("[DeugMessage] Range: 0x%p-0x%p\r\n", CodeStart, (ULONG_PTR)CodeStart + CodeSize); 198 | } 199 | 200 | PVOID CaveAddress = FindCaveAddress(CodeStart, CodeSize, sizeof(HOOKOPCODES)); 201 | if(!CaveAddress) 202 | { 203 | DbgPrint("[DeugMessage] FindCaveAddress failed...\r\n"); 204 | return 0; 205 | } 206 | DbgPrint("[DeugMessage] CaveAddress: 0x%p\r\n", CaveAddress); 207 | 208 | hHook = Hooklib::Hook(CaveAddress, (void*)newfunc); 209 | if(!hHook) 210 | return 0; 211 | 212 | newValue = (LONG)((ULONG_PTR)CaveAddress - SSDTbase); 213 | newValue = (newValue << 4) | oldValue & 0xF; 214 | 215 | //update HOOK structure 216 | hHook->SSDTindex = FunctionIndex; 217 | hHook->SSDTold = oldValue; 218 | hHook->SSDTnew = newValue; 219 | hHook->SSDTaddress = (oldValue >> 4) + SSDTbase; 220 | 221 | #else 222 | /* 223 | x86 SSDT Hook: 224 | 1) change SSDT value 225 | */ 226 | newValue = (ULONG)newfunc; 227 | 228 | hHook = (HOOK)RtlAllocateMemory(true, sizeof(HOOKSTRUCT)); 229 | 230 | //update HOOK structure 231 | hHook->SSDTindex = FunctionIndex; 232 | hHook->SSDTold = oldValue; 233 | hHook->SSDTnew = newValue; 234 | hHook->SSDTaddress = oldValue; 235 | 236 | #endif 237 | 238 | InterlockedSet(&SSDT->pServiceTable[FunctionIndex], newValue); 239 | 240 | DbgPrint("[DeugMessage] SSDThook(%s:0x%p, 0x%p)\r\n", apiname, hHook->SSDTold, hHook->SSDTnew); 241 | 242 | return hHook; 243 | } 244 | 245 | void SSDT::Hook(HOOK hHook) 246 | { 247 | if(!hHook) 248 | return; 249 | SSDTStruct* SSDT = SSDTfind(); 250 | if(!SSDT) 251 | { 252 | DbgPrint("[DeugMessage] SSDT not found...\r\n"); 253 | return; 254 | } 255 | LONG* SSDT_Table = SSDT->pServiceTable; 256 | if(!SSDT_Table) 257 | { 258 | DbgPrint("[DeugMessage] ServiceTable not found...\r\n"); 259 | return; 260 | } 261 | InterlockedSet(&SSDT_Table[hHook->SSDTindex], hHook->SSDTnew); 262 | } 263 | 264 | void SSDT::Unhook(HOOK hHook, bool free) 265 | { 266 | if(!hHook) 267 | return; 268 | SSDTStruct* SSDT = SSDTfind(); 269 | if(!SSDT) 270 | { 271 | DbgPrint("[DeugMessage] SSDT not found...\r\n"); 272 | return; 273 | } 274 | LONG* SSDT_Table = SSDT->pServiceTable; 275 | if(!SSDT_Table) 276 | { 277 | DbgPrint("[DeugMessage] ServiceTable not found...\r\n"); 278 | return; 279 | } 280 | InterlockedSet(&SSDT_Table[hHook->SSDTindex], hHook->SSDTold); 281 | #ifdef _WIN64 282 | if(free) 283 | Hooklib::Unhook(hHook, true); 284 | #else 285 | if(free) 286 | RtlFreeMemory(hHook); 287 | #endif 288 | } -------------------------------------------------------------------------------- /ssdt.h: -------------------------------------------------------------------------------- 1 | #ifndef _SSDT_H 2 | #define _SSDT_H 3 | 4 | #include "_global.h" 5 | #include "hooklib.h" 6 | 7 | class SSDT 8 | { 9 | public: 10 | static PVOID GetFunctionAddress(const char* apiname); 11 | static HOOK Hook(const char* apiname, void* newfunc); 12 | static void Hook(HOOK hHook); 13 | static void Unhook(HOOK hHook, bool free = false); 14 | }; 15 | 16 | #endif -------------------------------------------------------------------------------- /undocumented.cpp: -------------------------------------------------------------------------------- 1 | #include "undocumented.h" 2 | #include "ssdt.h" 3 | 4 | 5 | typedef NTSTATUS(NTAPI* ZWQUERYINFORMATIONPROCESS)( 6 | IN HANDLE ProcessHandle, 7 | IN PROCESSINFOCLASS ProcessInformationClass, 8 | OUT PVOID ProcessInformation, 9 | IN ULONG ProcessInformationLength, 10 | OUT PULONG ReturnLength OPTIONAL 11 | ); 12 | 13 | typedef NTSTATUS(NTAPI* ZWQUERYINFORMATIONTHREAD)( 14 | IN HANDLE ThreadHandle, 15 | IN THREADINFOCLASS ThreadInformationClass, 16 | IN OUT PVOID ThreadInformation, 17 | IN ULONG ThreadInformationLength, 18 | OUT PULONG ReturnLength OPTIONAL 19 | ); 20 | 21 | typedef NTSTATUS(NTAPI* NTQUERYOBJECT)( 22 | IN HANDLE Handle OPTIONAL, 23 | IN OBJECT_INFORMATION_CLASS ObjectInformationClass, 24 | OUT PVOID ObjectInformation OPTIONAL, 25 | IN ULONG ObjectInformationLength, 26 | OUT PULONG ReturnLength OPTIONAL 27 | ); 28 | 29 | typedef NTSTATUS(NTAPI* ZWQUERYSYSTEMINFORMATION)( 30 | IN SYSTEM_INFORMATION_CLASS SystemInformationClass, 31 | OUT PVOID SystemInformation, 32 | IN ULONG SystemInformationLength, 33 | OUT PULONG ReturnLength OPTIONAL 34 | ); 35 | 36 | typedef NTSTATUS(NTAPI* NTQUERYSYSTEMINFORMATION)( 37 | IN SYSTEM_INFORMATION_CLASS SystemInformationClass, 38 | OUT PVOID SystemInformation, 39 | IN ULONG SystemInformationLength, 40 | OUT PULONG ReturnLength OPTIONAL 41 | ); 42 | 43 | typedef NTSTATUS(NTAPI* NTCLOSE)( 44 | IN HANDLE Handle 45 | ); 46 | 47 | typedef NTSTATUS(NTAPI* NTSETCONTEXTTHREAD)( 48 | IN HANDLE ThreadHandle, 49 | IN PCONTEXT Context 50 | ); 51 | 52 | typedef NTSTATUS(NTAPI* NTCONTINUE)( 53 | IN PCONTEXT Context, 54 | BOOLEAN RaiseAlert 55 | ); 56 | 57 | typedef NTSTATUS(NTAPI* NTDUPLICATEOBJECT)( 58 | IN HANDLE SourceProcessHandle, 59 | IN HANDLE SourceHandle, 60 | IN HANDLE TargetProcessHandle, 61 | OUT PHANDLE TargetHandle, 62 | IN ACCESS_MASK DesiredAccess OPTIONAL, 63 | IN ULONG HandleAttributes, 64 | IN ULONG Options 65 | ); 66 | 67 | typedef NTSTATUS(NTAPI* KERAISEUSEREXCEPTION)( 68 | IN NTSTATUS ExceptionCode 69 | ); 70 | 71 | typedef NTSTATUS(NTAPI* NTSETINFORMATIONTHREAD)( 72 | IN HANDLE ThreadHandle, 73 | IN THREADINFOCLASS ThreadInformationClass, 74 | IN PVOID ThreadInformation, 75 | IN ULONG ThreadInformationLength 76 | ); 77 | 78 | typedef NTSTATUS(NTAPI* NTSETINFORMATIONPROCESS)( 79 | IN HANDLE ProcessHandle, 80 | IN PROCESSINFOCLASS ProcessInformationClass, 81 | IN PVOID ProcessInformation, 82 | IN ULONG ProcessInformationLength 83 | ); 84 | 85 | typedef NTSTATUS(NTAPI* NTQUERYINFORMATIONPROCESS)( 86 | IN HANDLE ProcessHandle, 87 | IN PROCESSINFOCLASS ProcessInformationClass, 88 | OUT PVOID ProcessInformation, 89 | IN ULONG ProcessInformationLength, 90 | OUT PULONG ReturnLength OPTIONAL 91 | ); 92 | 93 | typedef NTSTATUS(NTAPI* NTSYSTEMDEBUGCONTROL)( 94 | IN SYSDBG_COMMAND Command, 95 | IN PVOID InputBuffer OPTIONAL, 96 | IN ULONG InputBufferLength, 97 | OUT PVOID OutputBuffer OPTIONAL, 98 | IN ULONG OutputBufferLength, 99 | OUT PULONG ReturnLength OPTIONAL 100 | ); 101 | 102 | static ZWQUERYINFORMATIONPROCESS ZwQIP = 0; 103 | static ZWQUERYINFORMATIONTHREAD ZwQIT = 0; 104 | static NTQUERYOBJECT NtQO = 0; 105 | static ZWQUERYSYSTEMINFORMATION ZwQSI = 0; 106 | static NTQUERYSYSTEMINFORMATION NtQSI = 0; 107 | static NTCLOSE NtClo = 0; 108 | static NTSETCONTEXTTHREAD NtSCT = 0; 109 | static NTCONTINUE NtCon = 0; 110 | static NTDUPLICATEOBJECT NtDO = 0; 111 | static KERAISEUSEREXCEPTION KeRUE = 0; 112 | static NTSETINFORMATIONTHREAD NtSIT = 0; 113 | static NTSETINFORMATIONPROCESS NtSIP = 0; 114 | static NTQUERYINFORMATIONPROCESS NtQIP = 0; 115 | static NTSYSTEMDEBUGCONTROL NtSDBC = 0; 116 | 117 | NTSTATUS NTAPI Undocumented::ZwQueryInformationProcess( 118 | IN HANDLE ProcessHandle, 119 | IN PROCESSINFOCLASS ProcessInformationClass, 120 | OUT PVOID ProcessInformation, 121 | IN ULONG ProcessInformationLength, 122 | OUT PULONG ReturnLength OPTIONAL) 123 | { 124 | return ZwQIP(ProcessHandle, ProcessInformationClass, ProcessInformation, ProcessInformationLength, ReturnLength); 125 | } 126 | 127 | NTSTATUS NTAPI Undocumented::ZwQueryInformationThread( 128 | IN HANDLE ThreadHandle, 129 | IN THREADINFOCLASS ThreadInformationClass, 130 | IN OUT PVOID ThreadInformation, 131 | IN ULONG ThreadInformationLength, 132 | OUT PULONG ReturnLength OPTIONAL) 133 | { 134 | return ZwQIT(ThreadHandle, ThreadInformationClass, ThreadInformation, ThreadInformationLength, ReturnLength); 135 | } 136 | 137 | NTSTATUS NTAPI Undocumented::NtQueryObject( 138 | IN HANDLE Handle OPTIONAL, 139 | IN OBJECT_INFORMATION_CLASS ObjectInformationClass, 140 | OUT PVOID ObjectInformation OPTIONAL, 141 | IN ULONG ObjectInformationLength, 142 | OUT PULONG ReturnLength OPTIONAL) 143 | { 144 | return NtQO(Handle, ObjectInformationClass, ObjectInformation, ObjectInformationLength, ReturnLength); 145 | } 146 | 147 | NTSTATUS NTAPI Undocumented::ZwQuerySystemInformation( 148 | IN SYSTEM_INFORMATION_CLASS SystemInformationClass, 149 | OUT PVOID SystemInformation, 150 | IN ULONG SystemInformationLength, 151 | OUT PULONG ReturnLength OPTIONAL) 152 | { 153 | return ZwQSI(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength); 154 | } 155 | 156 | NTSTATUS NTAPI Undocumented::NtQuerySystemInformation( 157 | IN SYSTEM_INFORMATION_CLASS SystemInformationClass, 158 | OUT PVOID SystemInformation, 159 | IN ULONG SystemInformationLength, 160 | OUT PULONG ReturnLength OPTIONAL) 161 | { 162 | return NtQSI(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength); 163 | } 164 | 165 | NTSTATUS NTAPI Undocumented::NtClose( 166 | IN HANDLE Handle) 167 | { 168 | return NtClo(Handle); 169 | } 170 | 171 | NTSTATUS NTAPI Undocumented::NtSetContextThread( 172 | IN HANDLE ThreadHandle, 173 | IN PCONTEXT Context) 174 | { 175 | return NtSCT(ThreadHandle, Context); 176 | } 177 | 178 | NTSTATUS NTAPI Undocumented::NtContinue( 179 | IN PCONTEXT Context, 180 | BOOLEAN RaiseAlert) 181 | { 182 | return NtCon(Context, RaiseAlert); 183 | } 184 | 185 | NTSTATUS NTAPI Undocumented::NtDuplicateObject( 186 | IN HANDLE SourceProcessHandle, 187 | IN HANDLE SourceHandle, 188 | IN HANDLE TargetProcessHandle, 189 | OUT PHANDLE TargetHandle, 190 | IN ACCESS_MASK DesiredAccess OPTIONAL, 191 | IN ULONG HandleAttributes, 192 | IN ULONG Options) 193 | { 194 | return NtDO(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess, HandleAttributes, Options); 195 | } 196 | 197 | NTSTATUS NTAPI Undocumented::KeRaiseUserException( 198 | IN NTSTATUS ExceptionCode) 199 | { 200 | return KeRUE(ExceptionCode); 201 | } 202 | 203 | NTSTATUS NTAPI Undocumented::NtSetInformationThread( 204 | IN HANDLE ThreadHandle, 205 | IN THREADINFOCLASS ThreadInformationClass, 206 | IN PVOID ThreadInformation, 207 | IN ULONG ThreadInformationLength) 208 | { 209 | return NtSIT(ThreadHandle, ThreadInformationClass, ThreadInformation, ThreadInformationLength); 210 | } 211 | 212 | NTSTATUS NTAPI Undocumented::NtSetInformationProcess( 213 | IN HANDLE ProcessHandle, 214 | IN PROCESSINFOCLASS ProcessInformationClass, 215 | IN PVOID ProcessInformation, 216 | IN ULONG ProcessInformationLength) 217 | { 218 | return NtSIP(ProcessHandle, ProcessInformationClass, ProcessInformation, ProcessInformationLength); 219 | } 220 | 221 | NTSTATUS NTAPI Undocumented::NtQueryInformationProcess( 222 | IN HANDLE ProcessHandle, 223 | IN PROCESSINFOCLASS ProcessInformationClass, 224 | OUT PVOID ProcessInformation, 225 | IN ULONG ProcessInformationLength, 226 | OUT PULONG ReturnLength OPTIONAL) 227 | { 228 | return NtQIP(ProcessHandle, ProcessInformationClass, ProcessInformation, ProcessInformationLength, ReturnLength); 229 | } 230 | 231 | NTSTATUS NTAPI Undocumented::NtSystemDebugControl( 232 | IN SYSDBG_COMMAND Command, 233 | IN PVOID InputBuffer, 234 | IN ULONG InputBufferLength, 235 | OUT PVOID OutputBuffer, 236 | IN ULONG OutputBufferLength, 237 | OUT PULONG ReturnLength) 238 | { 239 | return NtSDBC(Command, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, ReturnLength); 240 | } 241 | 242 | bool Undocumented::UndocumentedInit() 243 | { 244 | //Exported kernel functions after this 245 | if(!ZwQIP) 246 | { 247 | UNICODE_STRING routineName; 248 | RtlInitUnicodeString(&routineName, L"ZwQueryInformationProcess"); 249 | ZwQIP = (ZWQUERYINFORMATIONPROCESS)MmGetSystemRoutineAddress(&routineName); 250 | if(!ZwQIP) 251 | return false; 252 | } 253 | if(!ZwQIT) 254 | { 255 | UNICODE_STRING routineName; 256 | RtlInitUnicodeString(&routineName, L"ZwQueryInformationThread"); 257 | ZwQIT = (ZWQUERYINFORMATIONTHREAD)MmGetSystemRoutineAddress(&routineName); 258 | if(!ZwQIT) 259 | return false; 260 | } 261 | if(!ZwQSI) 262 | { 263 | UNICODE_STRING routineName; 264 | RtlInitUnicodeString(&routineName, L"ZwQuerySystemInformation"); 265 | ZwQSI = (ZWQUERYSYSTEMINFORMATION)MmGetSystemRoutineAddress(&routineName); 266 | if(!ZwQSI) 267 | return false; 268 | } 269 | if(!NtQSI) 270 | { 271 | UNICODE_STRING routineName; 272 | RtlInitUnicodeString(&routineName, L"NtQuerySystemInformation"); 273 | NtQSI = (NTQUERYSYSTEMINFORMATION)MmGetSystemRoutineAddress(&routineName); 274 | if(!NtQSI) 275 | return false; 276 | } 277 | if(!NtClo) 278 | { 279 | UNICODE_STRING routineName; 280 | RtlInitUnicodeString(&routineName, L"NtClose"); 281 | NtClo = (NTCLOSE)MmGetSystemRoutineAddress(&routineName); 282 | if(!NtClo) 283 | return false; 284 | } 285 | if(!NtDO) 286 | { 287 | UNICODE_STRING routineName; 288 | RtlInitUnicodeString(&routineName, L"NtDuplicateObject"); 289 | NtDO = (NTDUPLICATEOBJECT)MmGetSystemRoutineAddress(&routineName); 290 | if(!NtDO) 291 | return false; 292 | } 293 | if(!KeRUE) 294 | { 295 | UNICODE_STRING routineName; 296 | RtlInitUnicodeString(&routineName, L"KeRaiseUserException"); 297 | KeRUE = (KERAISEUSEREXCEPTION)MmGetSystemRoutineAddress(&routineName); 298 | if(!KeRUE) 299 | return false; 300 | } 301 | if(!NtSIT) 302 | { 303 | UNICODE_STRING routineName; 304 | RtlInitUnicodeString(&routineName, L"NtSetInformationThread"); 305 | NtSIT = (NTSETINFORMATIONTHREAD)MmGetSystemRoutineAddress(&routineName); 306 | if(!NtSIT) 307 | return false; 308 | } 309 | if(!NtSIP) 310 | { 311 | UNICODE_STRING routineName; 312 | RtlInitUnicodeString(&routineName, L"NtSetInformationProcess"); 313 | NtSIP = (NTSETINFORMATIONPROCESS)MmGetSystemRoutineAddress(&routineName); 314 | if(!NtSIP) 315 | return false; 316 | } 317 | if(!NtQIP) 318 | { 319 | UNICODE_STRING routineName; 320 | RtlInitUnicodeString(&routineName, L"NtQueryInformationProcess"); 321 | NtQIP = (NTQUERYINFORMATIONPROCESS)MmGetSystemRoutineAddress(&routineName); 322 | if(!NtQIP) 323 | return false; 324 | } 325 | //SSDT-only functions after this 326 | if(!NtQO) 327 | { 328 | NtQO = (NTQUERYOBJECT)SSDT::GetFunctionAddress("NtQueryObject"); 329 | if(!NtQO) 330 | return false; 331 | } 332 | if(!NtSCT) 333 | { 334 | NtSCT = (NTSETCONTEXTTHREAD)SSDT::GetFunctionAddress("NtSetContextThread"); 335 | if(!NtSCT) 336 | return false; 337 | } 338 | if(!NtCon) 339 | { 340 | NtCon = (NTCONTINUE)SSDT::GetFunctionAddress("NtContinue"); 341 | if(!NtCon) 342 | return false; 343 | } 344 | if(!NtSDBC) 345 | { 346 | NtSDBC = (NTSYSTEMDEBUGCONTROL)SSDT::GetFunctionAddress("NtSystemDebugControl"); 347 | if(!NtSDBC) 348 | return false; 349 | } 350 | return true; 351 | } 352 | 353 | //Based on: http://alter.org.ua/docs/nt_kernel/procaddr 354 | PVOID Undocumented::GetKernelBase(PULONG pImageSize) 355 | { 356 | typedef struct _SYSTEM_MODULE_ENTRY 357 | { 358 | HANDLE Section; 359 | PVOID MappedBase; 360 | PVOID ImageBase; 361 | ULONG ImageSize; 362 | ULONG Flags; 363 | USHORT LoadOrderIndex; 364 | USHORT InitOrderIndex; 365 | USHORT LoadCount; 366 | USHORT OffsetToFileName; 367 | UCHAR FullPathName[256]; 368 | } SYSTEM_MODULE_ENTRY, *PSYSTEM_MODULE_ENTRY; 369 | 370 | #pragma warning(disable:4200) 371 | typedef struct _SYSTEM_MODULE_INFORMATION 372 | { 373 | ULONG Count; 374 | SYSTEM_MODULE_ENTRY Module[0]; 375 | } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION; 376 | 377 | PVOID pModuleBase = NULL; 378 | PSYSTEM_MODULE_INFORMATION pSystemInfoBuffer = NULL; 379 | 380 | ULONG SystemInfoBufferSize = 0; 381 | 382 | NTSTATUS status = Undocumented::ZwQuerySystemInformation(SystemModuleInformation, 383 | &SystemInfoBufferSize, 384 | 0, 385 | &SystemInfoBufferSize); 386 | 387 | if(!SystemInfoBufferSize) 388 | { 389 | DbgPrint("[DeugMessage] ZwQuerySystemInformation (1) failed...\r\n"); 390 | return NULL; 391 | } 392 | 393 | pSystemInfoBuffer = (PSYSTEM_MODULE_INFORMATION)ExAllocatePool(NonPagedPool, SystemInfoBufferSize * 2); 394 | 395 | if(!pSystemInfoBuffer) 396 | { 397 | DbgPrint("[DeugMessage] ExAllocatePool failed...\r\n"); 398 | return NULL; 399 | } 400 | 401 | memset(pSystemInfoBuffer, 0, SystemInfoBufferSize * 2); 402 | 403 | status = Undocumented::ZwQuerySystemInformation(SystemModuleInformation, 404 | pSystemInfoBuffer, 405 | SystemInfoBufferSize * 2, 406 | &SystemInfoBufferSize); 407 | 408 | if(NT_SUCCESS(status)) 409 | { 410 | pModuleBase = pSystemInfoBuffer->Module[0].ImageBase; 411 | if(pImageSize) 412 | *pImageSize = pSystemInfoBuffer->Module[0].ImageSize; 413 | } 414 | else 415 | DbgPrint("[DeugMessage] ZwQuerySystemInformation (2) failed...\r\n"); 416 | 417 | ExFreePool(pSystemInfoBuffer); 418 | 419 | return pModuleBase; 420 | } 421 | -------------------------------------------------------------------------------- /undocumented.h: -------------------------------------------------------------------------------- 1 | #ifndef _UNDOCUMENTED_H 2 | #define _UNDOCUMENTED_H 3 | 4 | #include "_global.h" 5 | 6 | //structures 7 | typedef struct _OBJECT_TYPE_INFORMATION 8 | { 9 | UNICODE_STRING TypeName; 10 | ULONG TotalNumberOfHandles; 11 | ULONG TotalNumberOfObjects; 12 | } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; 13 | 14 | typedef struct _OBJECT_ALL_INFORMATION 15 | { 16 | ULONG NumberOfObjects; 17 | OBJECT_TYPE_INFORMATION ObjectTypeInformation[1]; 18 | } OBJECT_ALL_INFORMATION, *POBJECT_ALL_INFORMATION; 19 | 20 | /* 21 | //enums 22 | typedef enum _OBJECT_INFORMATION_CLASS 23 | { 24 | ObjectTypeInformation = 2, 25 | ObjectTypesInformation = 3 26 | } OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS; 27 | */ 28 | 29 | typedef enum _SYSTEM_INFORMATION_CLASS 30 | { 31 | SystemModuleInformation = 11, 32 | SystemKernelDebuggerInformation = 35 33 | } SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS; 34 | 35 | typedef enum _SYSDBG_COMMAND 36 | { 37 | SysDbgGetTriageDump = 29, 38 | } SYSDBG_COMMAND, *PSYSDBG_COMMAND; 39 | 40 | class Undocumented 41 | { 42 | public: 43 | static NTSTATUS NTAPI ZwQueryInformationProcess( 44 | IN HANDLE ProcessHandle, 45 | IN PROCESSINFOCLASS ProcessInformationClass, 46 | OUT PVOID ProcessInformation, 47 | IN ULONG ProcessInformationLength, 48 | OUT PULONG ReturnLength OPTIONAL); 49 | 50 | static NTSTATUS NTAPI ZwQueryInformationThread( 51 | IN HANDLE ThreadHandle, 52 | IN THREADINFOCLASS ThreadInformationClass, 53 | IN OUT PVOID ThreadInformation, 54 | IN ULONG ThreadInformationLength, 55 | OUT PULONG ReturnLength OPTIONAL); 56 | 57 | static NTSTATUS NTAPI NtQueryObject( 58 | IN HANDLE Handle OPTIONAL, 59 | IN OBJECT_INFORMATION_CLASS ObjectInformationClass, 60 | OUT PVOID ObjectInformation OPTIONAL, 61 | IN ULONG ObjectInformationLength, 62 | OUT PULONG ReturnLength OPTIONAL); 63 | 64 | static NTSTATUS NTAPI ZwQuerySystemInformation( 65 | IN SYSTEM_INFORMATION_CLASS SystemInformationClass, 66 | OUT PVOID SystemInformation, 67 | IN ULONG SystemInformationLength, 68 | OUT PULONG ReturnLength OPTIONAL); 69 | 70 | static NTSTATUS NTAPI NtQuerySystemInformation( 71 | IN SYSTEM_INFORMATION_CLASS SystemInformationClass, 72 | OUT PVOID SystemInformation, 73 | IN ULONG SystemInformationLength, 74 | OUT PULONG ReturnLength OPTIONAL); 75 | 76 | static NTSTATUS NTAPI NtClose( 77 | IN HANDLE Handle); 78 | 79 | static NTSTATUS NTAPI NtSetContextThread( 80 | IN HANDLE ThreadHandle, 81 | IN PCONTEXT Context); 82 | 83 | static NTSTATUS NTAPI NtContinue( 84 | IN PCONTEXT Context, 85 | BOOLEAN RaiseAlert); 86 | 87 | static NTSTATUS NTAPI NtDuplicateObject( 88 | IN HANDLE SourceProcessHandle, 89 | IN HANDLE SourceHandle, 90 | IN HANDLE TargetProcessHandle, 91 | OUT PHANDLE TargetHandle, 92 | IN ACCESS_MASK DesiredAccess OPTIONAL, 93 | IN ULONG HandleAttributes, 94 | IN ULONG Options); 95 | 96 | static NTSTATUS NTAPI KeRaiseUserException( 97 | IN NTSTATUS ExceptionCode); 98 | 99 | static NTSTATUS NTAPI NtSetInformationThread( 100 | IN HANDLE ThreadHandle, 101 | IN THREADINFOCLASS ThreadInformationClass, 102 | IN PVOID ThreadInformation, 103 | IN ULONG ThreadInformationLength); 104 | 105 | static NTSTATUS NTAPI NtSetInformationProcess( 106 | IN HANDLE ProcessHandle, 107 | IN PROCESSINFOCLASS ProcessInformationClass, 108 | IN PVOID ProcessInformation, 109 | IN ULONG ProcessInformationLength); 110 | 111 | static NTSTATUS NTAPI NtQueryInformationProcess( 112 | IN HANDLE ProcessHandle, 113 | IN PROCESSINFOCLASS ProcessInformationClass, 114 | OUT PVOID ProcessInformation, 115 | IN ULONG ProcessInformationLength, 116 | OUT PULONG ReturnLength OPTIONAL); 117 | 118 | static NTSTATUS NTAPI NtSystemDebugControl( 119 | IN SYSDBG_COMMAND Command, 120 | IN PVOID InputBuffer OPTIONAL, 121 | IN ULONG InputBufferLength OPTIONAL, 122 | OUT PVOID OutputBuffer, 123 | IN ULONG OutputBufferLength, 124 | OUT PULONG ReturnLength OPTIONAL); 125 | 126 | static bool UndocumentedInit(); 127 | static PVOID GetKernelBase(PULONG pImageSize = NULL); 128 | }; 129 | 130 | #endif 131 | --------------------------------------------------------------------------------