• XSS.stack #1 – первый литературный журнал от юзеров форума

Парсинг Ldr

Lawsons

CD-диск
Пользователь
Регистрация
01.03.2020
Сообщения
14
Реакции
5
Привет всем. Пытаюсь распарсить Ldr следующим образом:

C:
typedef struct _UNICODE_STRING
{
    WORD Length;
    WORD MaximumLength;
    WORD* Buffer;
} UNICODE_STRING, * PUNICODE_STRING;

typedef struct _LDR_DATA_TABLE_ENTRY
{
    LIST_ENTRY InLoadOrderLinks;
    LIST_ENTRY InMemoryOrderLinks;
    LIST_ENTRY InInitializationOrderLinks;
    PVOID DllBase;
    PVOID EntryPoint;
    ULONG SizeOfImage;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
    ULONG Flags;
    WORD LoadCount;
    WORD TlsIndex;
    union
    {
        LIST_ENTRY HashLinks;
        struct
        {
            PVOID SectionPointer;
            ULONG CheckSum;
        };
    };
    union
    {
        ULONG TimeDateStamp;
        PVOID LoadedImports;
    };
    _ACTIVATION_CONTEXT* EntryPointActivationContext;
    PVOID PatchInformation;
    LIST_ENTRY ForwarderLinks;
    LIST_ENTRY ServiceTagLinks;
    LIST_ENTRY StaticLinks;
} LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;

typedef struct _PEB_LDR_DATA
{
    ULONG Length;
    UCHAR Initialized;
    PVOID SsHandle;
    LIST_ENTRY InLoadOrderModuleList;
    LIST_ENTRY InMemoryOrderModuleList;
    LIST_ENTRY InInitializationOrderModuleList;
    PVOID EntryInProgress;
} PEB_LDR_DATA, * PPEB_LDR_DATA;

typedef struct _PEB
{
    UCHAR InheritedAddressSpace;
    UCHAR ReadImageFileExecOptions;
    UCHAR BeingDebugged;
    UCHAR BitField;
    ULONG ImageUsesLargePages : 1;
    ULONG IsProtectedProcess : 1;
    ULONG IsLegacyProcess : 1;
    ULONG IsImageDynamicallyRelocated : 1;
    ULONG SpareBits : 4;
    PVOID Mutant;
    PVOID ImageBaseAddress;
    PPEB_LDR_DATA Ldr;
} PEB, * PPEB;


void main()
{
    PPEB pPEB = (PPEB)__readfsdword(0x30);

    PPEB_LDR_DATA pPEB_LDR_DATA = pPEB->Ldr;
    PLIST_ENTRY pListEntry = (PLIST_ENTRY)(pPEB_LDR_DATA->InMemoryOrderModuleList.Flink);
    PLDR_DATA_TABLE_ENTRY pLdrTableEntry = (PLDR_DATA_TABLE_ENTRY)pListEntry;

    do
    {
        if (lstrcmpiW((LPCWSTR)pLdrTableEntry->FullDllName.Buffer, L"kernel32.dll") == 0)
        {
            typedef void(WINAPI* xSleep)(DWORD);
            xSleep pSleep = (xSleep)GetProcAddress((HMODULE)pLdrTableEntry->DllBase, "Sleep");

            if (pSleep)
            {
                MessageBoxW(0, L"Found.", 0, MB_OK);
            }
            else
            {
                MessageBoxW(0, L"Not found.", 0, MB_OK);
            }
        }
        pListEntry = pListEntry->Flink;
        pLdrTableEntry = (PLDR_DATA_TABLE_ENTRY)(pListEntry->Flink);
    } while (pLdrTableEntry->FullDllName.Buffer != NULL);
}

Но ловлю краш на моменте обращения к FullDllName. Подскажите пожалуйста, в чем проблема.
 
я тему с примером на эксплойте по криптеру выкладывал на с++ там это все есть, мне лень искать, сам посмотри.
 
C:
while (pLdrTableEntry->FullDllName.Buffer != NULL);

А если у тебя pLdrTableEntry = 0?

Получится, типа:

Код:
mov eax, [pLdrTableEntry] <= 0
mov eax, [eax + FullDllName] <= Access Violation
 
C:
while (pLdrTableEntry->FullDllName.Buffer != NULL);

А если у тебя pLdrTableEntry = 0?

Получится, типа:

Код:
mov eax, [pLdrTableEntry] <= 0
mov eax, [eax + FullDllName] <= Access Violation

Да, нужно добавить проверку. Спасибо.

я тему с примером на эксплойте по криптеру выкладывал на с++ там это все есть, мне лень искать, сам посмотри.

Хотелось-бы понять, что не так именно тут, а не украсть код. Структуры взяты с нирсофта, с этим проблем быть вроде-бы не должно.
 
Хотелось-бы понять, что не так именно тут, а не украсть код. Структуры взяты с нирсофта, с этим проблем быть вроде-бы не должно.
Ну 30 лет ничего не меняется в загрузки PE, зачем изобретать новый велосипед? Там все тоже самое, вы просто больше ошибок сделайте.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх