Проверить, что gfLoadLibrary лежит в пределах модуля hKernel!
| 60 | |
| 61 | // Проверить, что gfLoadLibrary лежит в пределах модуля hKernel! |
| 62 | UINT_PTR GetLoadLibraryAddress() |
| 63 | { |
| 64 | if (gfLoadLibrary.fnPtr) |
| 65 | return gfLoadLibrary.fnPtr; |
| 66 | |
| 67 | UINT_PTR fnLoadLibrary = 0; |
| 68 | HMODULE hKernel32 = ::GetModuleHandle(L"kernel32.dll"); |
| 69 | HMODULE hKernelBase = IsWin8() ? ::GetModuleHandle(L"KernelBase.dll") : nullptr; |
| 70 | if (!hKernel32 || LDR_IS_RESOURCE(hKernel32)) |
| 71 | { |
| 72 | _ASSERTE(hKernel32 && !LDR_IS_RESOURCE(hKernel32)); |
| 73 | return 0; |
| 74 | } |
| 75 | |
| 76 | HMODULE hConEmuHk = ::GetModuleHandle(ConEmuHk_DLL_3264); |
| 77 | if (hConEmuHk && (hConEmuHk != ghOurModule)) |
| 78 | { |
| 79 | typedef FARPROC (WINAPI* GetLoadLibraryW_t)(); |
| 80 | GetLoadLibraryW_t GetLoadLibraryW = (GetLoadLibraryW_t)::GetProcAddress(hConEmuHk, "GetLoadLibraryW"); |
| 81 | if (GetLoadLibraryW) |
| 82 | { |
| 83 | fnLoadLibrary = (UINT_PTR)GetLoadLibraryW(); |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | UINT_PTR fnKernel32 = (UINT_PTR)::GetProcAddress(hKernel32, "LoadLibraryW"); |
| 88 | UINT_PTR fnKernelBase = hKernelBase ? (UINT_PTR)::GetProcAddress(hKernelBase, "LoadLibraryW") : 0L; |
| 89 | HMODULE hKernel = fnKernelBase ? hKernelBase : hKernel32; |
| 90 | if (!fnLoadLibrary) |
| 91 | { |
| 92 | fnLoadLibrary = fnKernelBase ? fnKernelBase : fnKernel32; |
| 93 | } |
| 94 | |
| 95 | // Функция должна быть именно в Kernel32.dll (а не в какой либо другой библиотеке, мало ли кто захукал...) |
| 96 | if (!CheckCallbackPtr(hKernel, 1, (FARPROC*)&fnLoadLibrary, TRUE)) |
| 97 | { |
| 98 | // _ASSERTE уже был |
| 99 | return 0; |
| 100 | } |
| 101 | |
| 102 | gfLoadLibrary = InjectsFnPtr(hKernel, fnLoadLibrary, (hKernel==hKernel32) ? L"Kernel32.dll" : L"KernelBase.dll"); |
| 103 | return fnLoadLibrary; |
| 104 | } |
| 105 | |
| 106 | UINT_PTR GetLdrGetDllHandleByNameAddress() |
| 107 | { |
no test coverage detected