Не могу коректно прочитать PEB->Ldr

Тема в разделе "WASM.WIN32", создана пользователем sambd, 14 дек 2007.

  1. sambd

    sambd New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2007
    Сообщения:
    60
    Суть проблемы в том есь ф-ция
    Код (Text):
    1. BOOL SearchDll(PVOID Address OPTIONAL ,PWCHAR DllName OPTIONAL,OUT PLDR_MODULE *Module)
    2. {
    3.   PLIST_ENTRY ModuleListHead;
    4.   PLIST_ENTRY Entry;
    5.   PLDR_MODULE ModulePtr;
    6.   if (mNtCurrentPEB()->LoaderData == NULL)
    7.   {
    8.       return(false);
    9.   }
    10.   ModuleListHead = &mNtCurrentPEB()->LoaderData->InLoadOrderModuleList;
    11.   Entry = ModuleListHead->Flink;
    12.   if (Entry == ModuleListHead)
    13.     {
    14.         return(false);
    15.     }
    16.   while (Entry != ModuleListHead)
    17.     {
    18.       ModulePtr =/*(PLDR_MODULE)&((PLDR_MODULE)(Entry))->InLoadOrderModuleList;//*/CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
    19.       DebugPrint("Getted  ModulePtr 0x%x",ModulePtr);
    20.       DebugPrint("Scanning %ws at 0x%x\n", ModulePtr->BaseDllName.Buffer, ModulePtr->BaseAddress); /// <-- [b]Exceptino HERE[/b]
    21.       if(DllName != NULL)
    22.           if(lstrincmpW(DllName,(PWCHAR)&ModulePtr->BaseDllName.Buffer[0],ModulePtr->BaseDllName.Length) == 0)
    23.       {
    24.           if(Module!=NULL)
    25.             *Module = ModulePtr;
    26.           return(true);
    27.       }
    28.  
    29.       if ((Address >= ModulePtr->BaseAddress) &&
    30.           ((ULONG_PTR)Address <= ((ULONG_PTR)ModulePtr->BaseAddress + ModulePtr->SizeOfImage)))
    31.         {
    32.             if(Module!=NULL)
    33.                 *Module = ModulePtr;
    34.           return(true);
    35.         }
    36.  
    37.       Entry = Entry->Flink;
    38.     }
    39.  
    40.   DebugPrint("Failed to find module entry.\n");
    41.   return(false);
    42. }
    которая ищет загруженные библиотеки
    если эту ф-цию вызвать в DllMain в Release то происходит исключения но под Debug все проходит корректно
    при этом если эту ф-цию вызвать с приложения в любом режиме она срабатывает корректно!

    кто может подсказать где я туплю?
     
  2. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Проход по списку неправильно организован
    По крайней мере тут точно бок
     
  3. sambd

    sambd New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2007
    Сообщения:
    60
    Ну дык за основу брал сорцы с ReactOS ... еслибы в обходе был бок я думаю что и под отладкой не работало бы!
     
  4. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Код (Text):
    1. ModulePtr =/*(PLDR_MODULE)&((PLDR_MODULE)(Entry))->InLoadOrderModuleList;//*/CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
    как в нормальном состоянии выглядит код в этой строке?
     
  5. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Getted?)
     
  6. sambd

    sambd New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2007
    Сообщения:
    60
    Код (Text):
    1. NTSTATUS NTAPI
    2. LdrFindEntryForAddress(PVOID Address,
    3.                        PLDR_DATA_TABLE_ENTRY *Module)
    4. {
    5.   PLIST_ENTRY ModuleListHead;
    6.   PLIST_ENTRY Entry;
    7.   PLDR_DATA_TABLE_ENTRY ModulePtr;
    8.  
    9.   DPRINT("LdrFindEntryForAddress(Address %p)\n", Address);
    10.  
    11.   if (NtCurrentPeb()->Ldr == NULL)
    12.     return(STATUS_NO_MORE_ENTRIES);
    13.  
    14.   RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock);
    15.   ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
    16.   Entry = ModuleListHead->Flink;
    17.   if (Entry == ModuleListHead)
    18.     {
    19.       RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
    20.       return(STATUS_NO_MORE_ENTRIES);
    21.     }
    22.  
    23.   while (Entry != ModuleListHead)
    24.     {
    25.       ModulePtr = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
    26.  
    27.       DPRINT("Scanning %wZ at %p\n", &ModulePtr->BaseDllName, ModulePtr->DllBase);
    28.  
    29.       if ((Address >= ModulePtr->DllBase) &&
    30.           ((ULONG_PTR)Address <= ((ULONG_PTR)ModulePtr->DllBase + ModulePtr->SizeOfImage)))
    31.         {
    32.           *Module = ModulePtr;
    33.           RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
    34.           return(STATUS_SUCCESS);
    35.         }
    36.  
    37.       Entry = Entry->Flink;
    38.     }
    39.  
    40.   DPRINT("Failed to find module entry.\n");
    41.  
    42.   RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
    43.   return(STATUS_NO_MORE_ENTRIES);
    44. }
    собсно вот так она выглядит вот
     
  7. sambd

    sambd New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2007
    Сообщения:
    60
    УРАААААА НАШЕЕЕЕЛЛЛЛЛ!!!!

    Вдруг у кого случится этот глюк!!!

    В релизе я компилил с выравниваем в 0х01 а при дебаге выравнивание было = 0х04
    вот тут и была зарыта собака) как в итоге оказалось)

    при постановке выравнивания в 0х04 код отлично заработал!!!!!!!
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    хех. это у тебя со структурами косяки.
     
  9. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    sambd

    у тя какие-то бока со структурой
    все нормально работает при выравнивании на 1 байт
     
  10. sambd

    sambd New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2007
    Сообщения:
    60
    не просто я свои заголовки использую, и не предусмотрел в них выравнивание попросту)
    вот!
    \Ну и таким образом косяк со структурой вышел) ... по сути ... косяк в том что я это не предусмотрел)))
    ... зато ф-ция прикольная вышла))) для проверки принадлежности адреса к либе)))