LdrLoadDll сбой

Мне нужно загрузить библиотеку с помощью функции 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);

просто используйте отладчик и посмотрите

RbMm 01.07.2018 08:53

Я удивлен, если он вообще будет компилироваться с Visual Studio, по крайней мере, я сомневаюсь, что это будет, по крайней мере, без отключения предупреждений.

ImmortaleVBR 01.07.2018 11:40

И вы не можете использовать LoadLibrary, как нормальный человек, потому что?

Anders 01.07.2018 12:38

Не могли бы вы предоставить более подробную информацию о том, как запускать вывод программы? Это драйвер, который вы пытаетесь написать? Разве вы не можете отладить свою программу (правда, в этом случае она будет работать в «нормальных» условиях и, вероятно, ошибка не будет воспроизводиться)? Примечание: установите второй аргумент на 0 вместо NULL (определенно не причина сбоя, просто для ясности).

CristiFati 02.07.2018 10:54

Вы проверили результат вызова GetProcAddress()?

Paul Sanders 04.07.2018 14:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
650
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот вам код, который (а) действительно компилируется и (б) работает. Прошу прощения за (кхм) обработку ошибок:

#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()?

Другие вопросы по теме