Привет всем. Пытаюсь распарсить Ldr следующим образом:
Но ловлю краш на моменте обращения к FullDllName. Подскажите пожалуйста, в чем проблема.
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. Подскажите пожалуйста, в чем проблема.