проблема с PEB

Тема в разделе "WASM.WIN32", создана пользователем XshStasX, 27 дек 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    При получении списка модулей в юзермоде получаю что первая запись Entry равна 0хЕ0000000 в чем может быть трабла? есно потом ошибка доступа.
    Код (Text):
    1.     PPEB Peb = NULL;
    2.     __asm
    3.     {
    4.         mov eax, FS:[0x30]
    5.         mov [Peb], eax
    6.     }
    7.  
    8.     PPEB_LDR_DATA LdrData = Peb->Ldr;
    9.     PLIST_ENTRY Head = &LdrData->ModuleListLoadOrder;
    10.     PLIST_ENTRY Entry = Head->Flink;
    11.  
    12.     while ( Entry != Head )
    13.     {
    14.         PLDR_DATA_TABLE_ENTRY LdrData = CONTAINING_RECORD( Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList );    
    15.               Entry = Entry->Flink;
    16.     }
    А тач с нтдлл прикрепил к теме.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    Код (Text):
    1. PPEB Peb = NULL;
    2.     __asm
    3.     {
    4.         mov eax, FS:[0x30]
    5.         mov [Peb], eax
    6.     }
    здается мне ты получаешь указатель на TEB, а не на PEB... в TEB в свою очередь хранится указатель на PEB...
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Этот код работает в другом проекте.

    Rel
    Нет там РЕВ получаеться , по FS:[0] ТЕВ.
    а вот отрывок из ТЕВ
    Код (Text):
    1. typedef struct _TEB
    2. {
    3.     NT_TIB          Tib;                        
    4.     PVOID           EnvironmentPointer;          
    5.     CLIENT_ID       Cid;                      
    6.     PVOID           ActiveRpcInfo;                
    7.     PVOID           ThreadLocalStoragePointer;    
    8.     PPEB            Peb;       // 0x30
    9. //..
    10. }
     
  4. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    XshStasX
    Какая есчо запись, ты что озверел.. Юзать LdrEnumerateLoadedModules() etc., вручную не годно.
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    kejcerfcrv
    Какая запись? там доступ только на чтение.
     
  6. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    XshStasX
    Запись в базе данных. Для особо тупых поясню - сие описывается структурой LDR_DATA_TABLE_ENTRY :lol:
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    может быть... уже плохо помню...

    Код (Text):
    1. PLIST_ENTRY Head = &LdrData->ModuleListLoadOrder;
    дико смущает вот эта запись... почему не взять сразу указатель на Flink, список двусвязный же...

    Клерк, велком бек)))
     
  8. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Так бы и сказал, у слова запись много значений.

    Почему не годно использовать ручное перечисление ?
    Из LdrLockLoaderLock ?
    У меня шелкод так что РЕВ пожалуй оптимальный вариант для поиск длл и дальнейшей настройки.
    Можно конечно посмотреть адреса в начале стека потока, там будет kernel32. Но это не лучше.

    Ты можешь объяснить почему не годно, и первый пост ?

    Rel
    Он двух связный, но кольцевой.
     
  9. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    XshStasX
    Не годно потому что асинхронно и не портабельно. Если вы юзаете лоадерлок то нет смысла не юзать нэйтивный экспорт, иначе как вы кс захватываете ?
     
  10. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    kejcerfcrv
    Сорри опечатка.

    Имел ввиду: Не годно потому что секция не захвачена?
    Но видемо так и есть.
     
  11. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    XshStasX
    Какая есчо секция ?

    Аа критическая, так бы сразу сказали, ато у меня сразу понимается про обьект секцию. Ну это да, кто без её захвата обращается к базе данных для енума, тому следует отрубить руки.
     
  12. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    но есть же исключения - ентрипоинт.
     
  13. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    kejcerfcrv
    Понял тебя.
    Видемо прийдеться делать свою запись SEH и генерировать исключение.
    где и получать базу нтдлл.
     
  14. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    XshStasX
    В шеллкоде, если конечно это то, что я думаю, не получится заюзать сех. Он не разруливается вне модулей(NX).

    Можно получить первые три описателя, они никогда не изменяются. Можно просканить память вниз через сервисы(чтобы фолтов небыло). Когда база получена, то достаточно сформировать соответствующий запрос, например снять слепок(RtlQueryProcessDebugInformation(), LdrQueryProcessModuleInformation()).
     
  15. hors

    hors New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2010
    Сообщения:
    21
    Какая версия Windows?
     
  16. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    XshStasX
    попробуйте вот так сделать
    Код (Text):
    1. HMODULE MyGetModuleHandleW(PWCHAR lpModuleName)
    2. {
    3.     PLIST_ENTRY pFlink;
    4.     PLIST_ENTRY pBlink;
    5.     PLIST_ENTRY pTempLink;
    6.     PPEB_LDR_DATA ldrpeb;
    7.     HMODULE hRet = NULL;
    8.     PPEB pPeb = GetPEB();
    9.     if(lpModuleName == NULL)
    10.     {
    11.         return (HMODULE)pPeb->ImageBaseAddress;
    12.     }
    13.     ldrpeb = pPeb->Ldr;
    14.     pFlink = ldrpeb->ModuleListLoadOrder.Flink;  
    15.     pBlink = ldrpeb->ModuleListLoadOrder.Blink;  
    16.     for (pTempLink = pFlink; pTempLink != pBlink; pTempLink = pTempLink->Flink)
    17.     {
    18.           PLDR_DATA_TABLE_ENTRY pLdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)pTempLink;
    19.           if (MyStrCmpiW(lpModuleName,pLdrDataTableEntry->BaseDllName.Buffer) == 0)
    20.           {
    21.              hRet = (HMODULE)pLdrDataTableEntry->DllBase;
    22.              break;
    23.           }
    24.     }
    25.     return hRet;
    26. }
     
  17. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    984259h
    Аналогично pFlink 0хЕ0000000 .
    hors
    ХП сп2
    kejcerfcrv
    Это ты о чем? о списках сех ?
    Имеешь ввиду ZwReadVirtualMemory ?

    Про сех забыл, что вне модулей не вызывается.
     
  18. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    XshStasX
    ZwReadVirtualMemory есчо найти както нужно, либо номер сервиса получить. Можно юзать ссылку на аргументы сервиса для валидации, например:
    Код (Text):
    1.     assume fs:nothing
    2. IsPcToNt proc C
    3.     pushad
    4.     xor ebx,ebx
    5.     mov esi,fs:[TEB.Peb]
    6.     push -4
    7.     mov esi,PEB.LoaderLock[esi]
    8.     push -4
    9. Id:
    10.     %NTCALL Ebx ; NtAreMappedFilesTheSame
    11.     cmp ax,(STATUS_INVALID_ADDRESS and 0000FFFFH)
    12.     je @f
    13.     inc ebx
    14.     bt ebx,12
    15.     jnb Id
    16.     inc eax
    17.     jmp Exit
    18. @@:
    19.     push esi
    20.     push esi
    21.     %NTCALL Ebx
    22.     add esp,2*4
    23.     test eax,eax
    24.     jnz Id
    25. @@:
    26.     push dword ptr [esp + 8*4 + 4 + 2*4]
    27.     push esi
    28.     %NTCALL Ebx
    29.     add esp,4*4
    30. Exit:
    31.     test eax,eax
    32.     popad
    33.     retn 4
    34. IsPcToNt endp
    35.  
    36. MM_SHARED_USER_DATA_VA  equ 7FFE0000H
    37.  
    38. IpToFileHeader proc uses ebx esi edi Ip:PVOID
    39.     mov esi,Ip
    40.     xor ebx,ebx
    41.     and esi,NOT(PAGE_SIZE*16 - 1)
    42. @@:
    43.     mov edx,MM_SHARED_USER_DATA_VA + X86_PAGE_SIZE - sizeof(HANDLE) ; 0x7FFE0FFC
    44.     mov eax,ebx
    45.     Int 2eh ; KiSystemServiceCopyArguments -> #AV
    46.     cmp al,8
    47.     je Scan ; NtAlertThread
    48.     inc ebx
    49.     bt ebx,10
    50.     jnc @b
    51.     xor eax,eax
    52.     ret
    53. Scan:
    54.     mov edx,esi
    55.     Call Is4R
    56.     jnz IsMz
    57. Next:
    58.     sub esi,PAGE_SIZE*16
    59.     ja Scan
    60.     xor eax,eax
    61.     ret
    62. IsMz:
    63.     mov edi,esi ; Base
    64.     assume esi:PIMAGE_DOS_HEADER
    65.     cmp [esi].e_magic,'ZM'
    66.     jne Next
    67.     add edi,[esi].e_lfanew
    68.     mov edx,edi
    69.     Call Is4R
    70.     jz Next
    71.     lea edx,[edi + sizeof(IMAGE_NT_HEADERS) - 4]
    72.     Call Is4R
    73.     jz Next
    74.     assume edi:PIMAGE_NT_HEADERS
    75.     cmp [edi].Signature,'EP'
    76.     jne Scan
    77.     cmp [edi].FileHeader.SizeOfOptionalHeader,sizeof(IMAGE_OPTIONAL_HEADER32)
    78.     jne Next
    79.     cmp [edi].FileHeader.Machine,IMAGE_FILE_MACHINE_I386   
    80.     jne Next
    81.     test [edi].FileHeader.Characteristics,IMAGE_FILE_32BIT_MACHINE
    82.     jz Next
    83.     mov eax,edi
    84.     ret
    85. Is4R:
    86. ; Edx: ptr, Ebx: ID
    87.     mov eax,ebx
    88.     Int 2eh
    89.     cmp al,5
    90.     retn    ; ZF: no access.
    91. IpToFileHeader endp
    92.  
    93. CHK_4R_UM macro p4R
    94. Local Exit
    95.     push p4R
    96.     xor ebx,ebx
    97.  @@:
    98.     mov edx,MM_SHARED_USER_DATA_VA + X86_PAGE_SIZE - sizeof(HANDLE) ; 0x7FFE0FFC
    99.     mov eax,ebx
    100.     Int 2eh
    101.     cmp al,8
    102.     je @f
    103.     inc ebx
    104.     bt ebx,10
    105.     jnc @b
    106.     jmp Exit    ; !ZF
    107.  @@:
    108.     pop edx
    109.     mov eax,ebx
    110.     Int 2eh
    111.     cmp al,5
    112. ; ZF
    113. Exit:
    114. endm
    Ну или чтонибудь похожее. Мне больше нравится брать из Ldr.InLoadOrderModuleList.Flink.InLoadOrderModuleList.Flink.DllBase

    А сех вопрос отдельный, но в любом случае нельзя найти базу через этот механизм.
     
  19. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    kejcerfcrv
    Интересный вариант, с поиском NtAreMappedFilesTheSame .;)
     
  20. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    А теперь отвечу на свой вопрос) проблема оказалось в выравнивании членов структур.