Мне нужно загрузить библиотеку с помощью функции ntdll LdrLoadDll, в данном случае загружаю библиотеку user32.dll. Однако, когда я пытаюсь загрузить user32.dll, при вызове выдается исключение нарушения прав доступа (последняя строка). Я не уверен, в чем может быть причина этой ошибки. Я неправильно создаю строку Unicode?
typedef (__stdcall *LdrLoadDll)(
IN PWCHAR PathToFile OPTIONAL,
IN ULONG Flags OPTIONAL,
IN PUNICODE_STRING ModuleFileName,
OUT PHANDLE ModuleHandle);
LdrLoadDll LdrLoadDllStruct = (LdrLoadDll)GetProcAddress(ntdllHandle, "LdrLoadDll");
typedef (__stdcall *RtlInitUnicodeString)(
PUNICODE_STRING DestinationString,
PCWSTR SourceString);
RtlInitUnicodeString RtlInitUnicodeStringStruct = (RtlInitUnicodeString)GetProcAddress(ntdllHandle, "RtlInitUnicodeString");
HMODULE hModule = 0;
UNICODE_STRING unicodestring;
RtlInitUnicodeStringStruct(&unicodestring, L"USER32.dll");
LdrLoadDllStruct(NULL, NULL, &unicodestring, &hModule);
Я удивлен, если он вообще будет компилироваться с Visual Studio, по крайней мере, я сомневаюсь, что это будет, по крайней мере, без отключения предупреждений.
И вы не можете использовать LoadLibrary, как нормальный человек, потому что?
Не могли бы вы предоставить более подробную информацию о том, как запускать вывод программы? Это драйвер, который вы пытаетесь написать? Разве вы не можете отладить свою программу (правда, в этом случае она будет работать в «нормальных» условиях и, вероятно, ошибка не будет воспроизводиться)? Примечание: установите второй аргумент на 0 вместо NULL (определенно не причина сбоя, просто для ясности).
Вы проверили результат вызова GetProcAddress()?





Вот вам код, который (а) действительно компилируется и (б) работает. Прошу прощения за (кхм) обработку ошибок:
#include <windows.h>
#include <subauth.h>
#include <assert.h>
#include <iostream>
#pragma comment (lib, "ntdll.lib")
typedef void (__stdcall *LdrLoadDll) (
IN PWCHAR PathToFile OPTIONAL,
IN ULONG Flags OPTIONAL,
IN PUNICODE_STRING ModuleFileName,
OUT HMODULE * ModuleHandle);
typedef void (__stdcall *RtlInitUnicodeString)(
PUNICODE_STRING DestinationString,
PCWSTR SourceString);
int main ()
{
HMODULE ntdllHandle = LoadLibrary (L"ntdll.dll");
assert (ntdllHandle);
LdrLoadDll LdrLoadDllStruct = (LdrLoadDll) GetProcAddress (ntdllHandle, "LdrLoadDll");
assert (LdrLoadDllStruct);
RtlInitUnicodeString RtlInitUnicodeStringStruct = (RtlInitUnicodeString) GetProcAddress (ntdllHandle, "RtlInitUnicodeString");
assert (RtlInitUnicodeStringStruct);
HMODULE hModule = 0;
UNICODE_STRING unicodestring;
RtlInitUnicodeStringStruct (&unicodestring, L"USER32.dll");
LdrLoadDllStruct (NULL, 0, &unicodestring, &hModule);
std::cout << hModule << "\n";
}
Вывод (на моей машине, 64-битная сборка):
00007FFF17C20000
И все же ... в чем суть является с использованием LoadLibrary()?
просто используйте отладчик и посмотрите