PEB, PEB_LDR_DATA, LDR_MODULE

Тема в разделе "WASM.X64", создана пользователем Rel, 1 окт 2009.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.320
    Доброго времени суток! Помогите пожалуйста с определением недокументированных структур в x64. Мой алгоритм прекрасно работал на x32, но при попытке универсализации возникли проблемы с недокументированными структурами. Некоторые я смог нормально адаптировать к работе как на х32, так и на х64. Однако структура LDR_MODULE видимо объявлено мной неправильно, поскольку копание в памяти проходит неверно. PEB и PEB_LDR_DATA на глаз выглядят нормально. К сожалению нормального описания LDR_MODULE в интернете я не нашел, более того в большинстве ответов гагла структура объявлена неверно, а именно опущен union, и стоит три указателя вместо одного в начале структуры. Сейчас структуры объявлены следующим образом:

    Код (Text):
    1. typedef struct _PEB_LDR_DATA
    2. {
    3.     ULONG      Length;
    4.     BOOLEAN    Initialized;
    5.     PVOID      SsHandle;
    6.     LIST_ENTRY InLoadOrderModuleList;           // Список модулей в порядке загрузки
    7.     LIST_ENTRY InMemoryOrderModuleList;         // Список модулей в порядке расположения в памяти
    8.     LIST_ENTRY InInitializationOrderModuleList; // Список модулей в порядке инициализации
    9. } PEB_LDR_DATA, *PPEB_LDR_DATA;
    10.  
    11. typedef struct _PEB
    12. {
    13.     BOOLEAN       InheritedAddressSpace;
    14.     BOOLEAN       ReadImageFileExecOptions;
    15.     BOOLEAN       BeignDebugged;
    16.     BOOLEAN       Spare;
    17.     HANDLE        Mutant;
    18.     PVOID         ImageBaseAddress;
    19.     PPEB_LDR_DATA LoaderData;
    20. } PEB, *PPEB;
    21.  
    22. typedef struct _LDR_MODULE
    23. {
    24.     LIST_ENTRY ModuleList;
    25.     PVOID      BaseAddress;
    26.     PVOID      EntryPoint;
    27.     ULONG      SizeOfImage;
    28.     USHORT     FullDllNameLength;
    29.     USHORT     FullDllNameMaxLength;
    30.     PWSTR      FullDllNameBuffer;
    31.     USHORT     BaseDllNameLength;
    32.     USHORT     BaseDllNameMaxLength;
    33.     PWSTR      BaseDllNameBuffer;
    34.     ULONG      Flags;
    35.     SHORT      LoadCount;
    36.     SHORT      TlsIndex;
    37.     LIST_ENTRY HashTableEntry;
    38.     ULONG      TimeDateStamp;
    39. } LDR_MODULE, *PLDR_MODULE;
    Пожалуйста, кто знает, помогите разобраться! Заранее спасибо!
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.320
    Блин. Извините за беспокойство, запостил тему на форуме и на меня просто снизошло прозрение. Вобщем разобрался сам)))) Глупый недочет в LDR_MODULE.
     
  3. Maclaud

    Maclaud New Member

    Публикаций:
    0
    Регистрация:
    15 май 2010
    Сообщения:
    7
    А нам сказать? Я тоже сейчас ищу эти настоящие структуры. И в чем отличие от 64?
     
  4. Maclaud

    Maclaud New Member

    Публикаций:
    0
    Регистрация:
    15 май 2010
    Сообщения:
    7
    у меня в BaseDllNameBuffer полный путь к длл а в FullDllNameBuffer пусто, непойму в чем проблема
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Rel
    Найдите сурцы венды.
     
  6. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    В wrk есть. ntldr.h

    sizeof(PVOID)=8.
     
  7. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Хз, но там еще вроде какие-то изменения были.
     
  8. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    deLight

    Здесь довольно простой случай. Если,например, говорить про структуру LDR_DATA_TABLE_ENTRY (которая в этом топике называется LDR_MODULE - видимо в память о временах, когда не было wrk). И что мы видим в файле ntldr.h? Данную там структуру можно применять как на 32, так и на 64 битах. Просто поля, которые претерпевают изменения - это указатели. В ntldr.h так же даны варианты структур LDR_DATA_TABLE_ENTRY64/32, там это выглядит наглядней.

    Код (Text):
    1. typedef struct _LDR_DATA_TABLE_ENTRY {
    2.     LIST_ENTRY InLoadOrderLinks;
    3.     LIST_ENTRY InMemoryOrderLinks;
    4.     LIST_ENTRY InInitializationOrderLinks;
    5.     PVOID DllBase;
    6.     PVOID EntryPoint;
    7.     ULONG SizeOfImage;
    8.     UNICODE_STRING FullDllName;
    9.     UNICODE_STRING BaseDllName;
    10.     ULONG Flags;
    11.     USHORT LoadCount;
    12.     USHORT TlsIndex;
    13.     union {
    14.         LIST_ENTRY HashLinks;
    15.         struct {
    16.             PVOID SectionPointer;
    17.             ULONG CheckSum;
    18.         };
    19.     };
    20.     union {
    21.         struct {
    22.             ULONG TimeDateStamp;
    23.         };
    24.         struct {
    25.             PVOID LoadedImports;
    26.         };
    27.     };
    28.     struct _ACTIVATION_CONTEXT * EntryPointActivationContext;
    29.  
    30.     PVOID PatchInformation;
    31.  
    32. } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
    Насчет других изменений. В общем случае все не ограничивается размером указателя (если говорить про другие структуры). Взять ту же CONTEXT, в нее добавлены новые поля, отражающие увеличение количество регистров итд. или KUSER_SHARED_DATA с ее Wow64SharedInformation. И таких примеров немало.
     
  9. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Потом если, например, адрес PEB берется из fs, то на 64 это, разумеется, работать не будет, так как он расположен по адресу gs:[0x60]. И опять-таки непонятно, автор вопроса хочет работать в Compatibility mode или 64-bit mode. Я пишу именно про 64-битный режим.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.320
    Код (Text):
    1. typedef struct _PEB_LDR_DATA
    2. {
    3.     ULONG      Length;
    4.     BOOLEAN    Initialized;
    5.     PVOID      SsHandle;
    6.     LIST_ENTRY InLoadOrderModuleList;          
    7.     LIST_ENTRY InMemoryOrderModuleList;        
    8.     LIST_ENTRY InInitializationOrderModuleList;
    9. } PEB_LDR_DATA, *PPEB_LDR_DATA;
    Код (Text):
    1. typedef struct _LDR_MODULE
    2. {
    3.     LIST_ENTRY ModuleList;
    4.     PVOID      BaseAddress;
    5.     PVOID      EntryPoint;
    6. #ifdef _WIN64
    7.     LONGLONG   SizeOfImage;
    8. #else
    9.     ULONG      SizeOfImage;
    10. #endif
    11.     USHORT     FullDllNameLength;
    12.     USHORT     FullDllNameMaxLength;
    13.     PWSTR      FullDllNameBuffer;
    14.     USHORT     BaseDllNameLength;
    15.     USHORT     BaseDllNameMaxLength;
    16.     PWSTR      BaseDllNameBuffer;
    17.     ULONG      Flags;
    18.     SHORT      LoadCount;
    19.     SHORT      TlsIndex;
    20.     LIST_ENTRY HashTableEntry;
    21.     ULONG      TimeDateStamp;
    22. } LDR_MODULE, *PLDR_MODULE;
    lhc645, откуда вы взяли эту структуру? на практике, нет там трех листов в начале... и единственное отличие x64, которое опять же определилось на практике - в длине SizeOfImage...
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    определите SizeOfImage как ULONG_PTR или SIZE_T и он будет 32бита на x86 и 64бита на x64. тогда не нужно вообще различий делать
     
  12. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Rel
    Код (Text):
    1. 0:000> vertarget
    2. Windows 7 Version 7600 MP (2 procs) Free x64
    3. Product: WinNt, suite: SingleUserTS
    4. kernel32.dll version: 6.1.7600.16385 (win7_rtm.090713-1255)
    5. Machine Name:
    6. Debug session time: Tue May 18 10:16:27.681 2010 (UTC + 4:00)
    7. System Uptime: 2 days 9:21:39.826
    8. Process Uptime: 0 days 0:00:04.526
    9.   Kernel time: 0 days 0:00:00.000
    10.   User time: 0 days 0:00:00.015
    11.  
    12. 0:000> dt ntdll!*ldr*
    13.           ntdll!_PEB_LDR_DATA
    14.           ntdll!_LDR_DATA_TABLE_ENTRY
    15.  
    16. 0:000> dt _PEB_LDR_DATA
    17. ntdll!_PEB_LDR_DATA
    18.    +0x000 Length           : Uint4B
    19.    +0x004 Initialized      : UChar
    20.    +0x008 SsHandle         : Ptr64 Void
    21.    +0x010 InLoadOrderModuleList : _LIST_ENTRY
    22.    +0x020 InMemoryOrderModuleList : _LIST_ENTRY
    23.    +0x030 InInitializationOrderModuleList : _LIST_ENTRY
    24.    +0x040 EntryInProgress  : Ptr64 Void
    25.    +0x048 ShutdownInProgress : UChar
    26.    +0x050 ShutdownThreadId : Ptr64 Void
    27.  
    28. 0:000> dt _LDR_DATA_TABLE_ENTRY
    29. ntdll!_LDR_DATA_TABLE_ENTRY
    30.    +0x000 InLoadOrderLinks : _LIST_ENTRY
    31.    +0x010 InMemoryOrderLinks : _LIST_ENTRY
    32.    +0x020 InInitializationOrderLinks : _LIST_ENTRY
    33.    +0x030 DllBase          : Ptr64 Void
    34.    +0x038 EntryPoint       : Ptr64 Void
    35.    +0x040 SizeOfImage      : Uint4B
    36.    +0x048 FullDllName      : _UNICODE_STRING
    37.    +0x058 BaseDllName      : _UNICODE_STRING
    38.    +0x068 Flags            : Uint4B
    39.    +0x06c LoadCount        : Uint2B
    40.    +0x06e TlsIndex         : Uint2B
    41.    +0x070 HashLinks        : _LIST_ENTRY
    42.    +0x070 SectionPointer   : Ptr64 Void
    43.    +0x078 CheckSum         : Uint4B
    44.    +0x080 TimeDateStamp    : Uint4B
    45.    +0x080 LoadedImports    : Ptr64 Void
    46.    +0x088 EntryPointActivationContext : Ptr64 _ACTIVATION_CONTEXT
    47.    +0x090 PatchInformation : Ptr64 Void
    48.    +0x098 ForwarderLinks   : _LIST_ENTRY
    49.    +0x0a8 ServiceTagLinks  : _LIST_ENTRY
    50.    +0x0b8 StaticLinks      : _LIST_ENTRY
    51.    +0x0c8 ContextInformation : Ptr64 Void
    52.    +0x0d0 OriginalBase     : Uint8B
    53.    +0x0d8 LoadTime         : _LARGE_INTEGER
    54.  
    55.  
    56. 0:000> * x32:
    57.  
    58. 0:000> dt _PEB_LDR_DATA
    59. ntdll!_PEB_LDR_DATA
    60.    +0x000 Length           : Uint4B
    61.    +0x004 Initialized      : UChar
    62.    +0x008 SsHandle         : Ptr32 Void
    63.    +0x00c InLoadOrderModuleList : _LIST_ENTRY
    64.    +0x014 InMemoryOrderModuleList : _LIST_ENTRY
    65.    +0x01c InInitializationOrderModuleList : _LIST_ENTRY
    66.    +0x024 EntryInProgress  : Ptr32 Void
    67.    +0x028 ShutdownInProgress : UChar
    68.    +0x02c ShutdownThreadId : Ptr32 Void
    69.  
    70. 0:000> dt _LDR_DATA_TABLE_ENTRY
    71. ntdll!_LDR_DATA_TABLE_ENTRY
    72.    +0x000 InLoadOrderLinks : _LIST_ENTRY
    73.    +0x008 InMemoryOrderLinks : _LIST_ENTRY
    74.    +0x010 InInitializationOrderLinks : _LIST_ENTRY
    75.    +0x018 DllBase          : Ptr32 Void
    76.    +0x01c EntryPoint       : Ptr32 Void
    77.    +0x020 SizeOfImage      : Uint4B
    78.    +0x024 FullDllName      : _UNICODE_STRING
    79.    +0x02c BaseDllName      : _UNICODE_STRING
    80.    +0x034 Flags            : Uint4B
    81.    +0x038 LoadCount        : Uint2B
    82.    +0x03a TlsIndex         : Uint2B
    83.    +0x03c HashLinks        : _LIST_ENTRY
    84.    +0x03c SectionPointer   : Ptr32 Void
    85.    +0x040 CheckSum         : Uint4B
    86.    +0x044 TimeDateStamp    : Uint4B
    87.    +0x044 LoadedImports    : Ptr32 Void
    88.    +0x048 EntryPointActivationContext : Ptr32 _ACTIVATION_CONTEXT
    89.    +0x04c PatchInformation : Ptr32 Void
    90.    +0x050 ForwarderLinks   : _LIST_ENTRY
    91.    +0x058 ServiceTagLinks  : _LIST_ENTRY
    92.    +0x060 StaticLinks      : _LIST_ENTRY
    93.    +0x068 ContextInformation : Ptr32 Void
    94.    +0x06c OriginalBase     : Uint4B
    95.    +0x070 LoadTime         : _LARGE_INTEGER
    Rel
    >на практике, нет там трех листов в начале...
    Голова списка 'Ldr.InInitializationOrderModuleList' указывает не на начало структуры, а на соответствующий её элемент – на _LDR_DATA_TABLE_ENTRY.InInitializationOrderLinks. И, соответственно, все последующие элементы этого списка соединены так же. Стандартная практика.

    Maclaud
    >Я тоже сейчас ищу эти настоящие структуры.
    Не надо ничего искать. Не нужно быть MVP, чтобы получить публичные символы MS. А далее уже выбирай любой парсер и приводи их к нужному виду.
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.320
    да я знаю... у меня как раз в этом поле был косяк год назад (см. вверху темы), я просто его выделил таким образом, чтобы было заметно...

    окей... буду знать...
     
  14. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Rel

    Применяйте макрос CONTAINING_RECORD для получения адреса начала структуры LDR_DATA_TABLE_ENTRY. Например так

    Код (Text):
    1.  
    2. pLte = CONTAINING_RECORD(pPebLdr->InInitializationOrderModuleList.Flink,
    3.                              LDR_DATA_TABLE_ENTRY,
    4.                                     InInitializationOrderLinks);
    compatibility mode видимо.
     
  15. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    >compatibility mode видимо.
    Логичный вывод. Но исходные данные неверны – Rel ошибается. А структура LDR_DATA_TABLE_ENTRY неизменна между x32 <-> wow. Вообще, мы верим, что раскладка структур из x32-винды совпадает с раскладкой соответствующих структур wow – за исключением, быть может, самых глубокосистемных (peb, teb).
     
  16. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    действительно (была проверка сделана только что).
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.320
    о чем вы говорите вообще? у меня все прекрасно работает во всех трех режимах)))
     
  18. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    У вас выравнивание структуры почему-то 4 байта, поэтому вам пришлось изменять размер поля SizeOfImage. Поставьте выравнивание 8 для 64 бит и не надо будет менять (взгляните на смещения в #12). Тогда можно будет использовать структуру из #8
     
  19. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    или менее