При получении списка модулей в юзермоде получаю что первая запись Entry равна 0хЕ0000000 в чем может быть трабла? есно потом ошибка доступа. Код (Text): PPEB Peb = NULL; __asm { mov eax, FS:[0x30] mov [Peb], eax } PPEB_LDR_DATA LdrData = Peb->Ldr; PLIST_ENTRY Head = &LdrData->ModuleListLoadOrder; PLIST_ENTRY Entry = Head->Flink; while ( Entry != Head ) { PLDR_DATA_TABLE_ENTRY LdrData = CONTAINING_RECORD( Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList ); Entry = Entry->Flink; } А тач с нтдлл прикрепил к теме.
Код (Text): PPEB Peb = NULL; __asm { mov eax, FS:[0x30] mov [Peb], eax } здается мне ты получаешь указатель на TEB, а не на PEB... в TEB в свою очередь хранится указатель на PEB...
Этот код работает в другом проекте. Rel Нет там РЕВ получаеться , по FS:[0] ТЕВ. а вот отрывок из ТЕВ Код (Text): typedef struct _TEB { NT_TIB Tib; PVOID EnvironmentPointer; CLIENT_ID Cid; PVOID ActiveRpcInfo; PVOID ThreadLocalStoragePointer; PPEB Peb; // 0x30 //.. }
XshStasX Какая есчо запись, ты что озверел.. Юзать LdrEnumerateLoadedModules() etc., вручную не годно.
XshStasX Запись в базе данных. Для особо тупых поясню - сие описывается структурой LDR_DATA_TABLE_ENTRY
может быть... уже плохо помню... Код (Text): PLIST_ENTRY Head = &LdrData->ModuleListLoadOrder; дико смущает вот эта запись... почему не взять сразу указатель на Flink, список двусвязный же... Клерк, велком бек)))
Так бы и сказал, у слова запись много значений. Почему не годно использовать ручное перечисление ? Из LdrLockLoaderLock ? У меня шелкод так что РЕВ пожалуй оптимальный вариант для поиск длл и дальнейшей настройки. Можно конечно посмотреть адреса в начале стека потока, там будет kernel32. Но это не лучше. Ты можешь объяснить почему не годно, и первый пост ? Rel Он двух связный, но кольцевой.
XshStasX Не годно потому что асинхронно и не портабельно. Если вы юзаете лоадерлок то нет смысла не юзать нэйтивный экспорт, иначе как вы кс захватываете ?
kejcerfcrv Сорри опечатка. Имел ввиду: Не годно потому что секция не захвачена? Но видемо так и есть.
XshStasX Какая есчо секция ? Аа критическая, так бы сразу сказали, ато у меня сразу понимается про обьект секцию. Ну это да, кто без её захвата обращается к базе данных для енума, тому следует отрубить руки.
kejcerfcrv Понял тебя. Видемо прийдеться делать свою запись SEH и генерировать исключение. где и получать базу нтдлл.
XshStasX В шеллкоде, если конечно это то, что я думаю, не получится заюзать сех. Он не разруливается вне модулей(NX). Можно получить первые три описателя, они никогда не изменяются. Можно просканить память вниз через сервисы(чтобы фолтов небыло). Когда база получена, то достаточно сформировать соответствующий запрос, например снять слепок(RtlQueryProcessDebugInformation(), LdrQueryProcessModuleInformation()).
XshStasX попробуйте вот так сделать Код (Text): HMODULE MyGetModuleHandleW(PWCHAR lpModuleName) { PLIST_ENTRY pFlink; PLIST_ENTRY pBlink; PLIST_ENTRY pTempLink; PPEB_LDR_DATA ldrpeb; HMODULE hRet = NULL; PPEB pPeb = GetPEB(); if(lpModuleName == NULL) { return (HMODULE)pPeb->ImageBaseAddress; } ldrpeb = pPeb->Ldr; pFlink = ldrpeb->ModuleListLoadOrder.Flink; pBlink = ldrpeb->ModuleListLoadOrder.Blink; for (pTempLink = pFlink; pTempLink != pBlink; pTempLink = pTempLink->Flink) { PLDR_DATA_TABLE_ENTRY pLdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)pTempLink; if (MyStrCmpiW(lpModuleName,pLdrDataTableEntry->BaseDllName.Buffer) == 0) { hRet = (HMODULE)pLdrDataTableEntry->DllBase; break; } } return hRet; }
984259h Аналогично pFlink 0хЕ0000000 . hors ХП сп2 kejcerfcrv Это ты о чем? о списках сех ? Имеешь ввиду ZwReadVirtualMemory ? Про сех забыл, что вне модулей не вызывается.
XshStasX ZwReadVirtualMemory есчо найти както нужно, либо номер сервиса получить. Можно юзать ссылку на аргументы сервиса для валидации, например: Код (Text): assume fs:nothing IsPcToNt proc C pushad xor ebx,ebx mov esi,fs:[TEB.Peb] push -4 mov esi,PEB.LoaderLock[esi] push -4 Id: %NTCALL Ebx ; NtAreMappedFilesTheSame cmp ax,(STATUS_INVALID_ADDRESS and 0000FFFFH) je @f inc ebx bt ebx,12 jnb Id inc eax jmp Exit @@: push esi push esi %NTCALL Ebx add esp,2*4 test eax,eax jnz Id @@: push dword ptr [esp + 8*4 + 4 + 2*4] push esi %NTCALL Ebx add esp,4*4 Exit: test eax,eax popad retn 4 IsPcToNt endp MM_SHARED_USER_DATA_VA equ 7FFE0000H IpToFileHeader proc uses ebx esi edi Ip:PVOID mov esi,Ip xor ebx,ebx and esi,NOT(PAGE_SIZE*16 - 1) @@: mov edx,MM_SHARED_USER_DATA_VA + X86_PAGE_SIZE - sizeof(HANDLE) ; 0x7FFE0FFC mov eax,ebx Int 2eh ; KiSystemServiceCopyArguments -> #AV cmp al,8 je Scan ; NtAlertThread inc ebx bt ebx,10 jnc @b xor eax,eax ret Scan: mov edx,esi Call Is4R jnz IsMz Next: sub esi,PAGE_SIZE*16 ja Scan xor eax,eax ret IsMz: mov edi,esi ; Base assume esi:PIMAGE_DOS_HEADER cmp [esi].e_magic,'ZM' jne Next add edi,[esi].e_lfanew mov edx,edi Call Is4R jz Next lea edx,[edi + sizeof(IMAGE_NT_HEADERS) - 4] Call Is4R jz Next assume edi:PIMAGE_NT_HEADERS cmp [edi].Signature,'EP' jne Scan cmp [edi].FileHeader.SizeOfOptionalHeader,sizeof(IMAGE_OPTIONAL_HEADER32) jne Next cmp [edi].FileHeader.Machine,IMAGE_FILE_MACHINE_I386 jne Next test [edi].FileHeader.Characteristics,IMAGE_FILE_32BIT_MACHINE jz Next mov eax,edi ret Is4R: ; Edx: ptr, Ebx: ID mov eax,ebx Int 2eh cmp al,5 retn ; ZF: no access. IpToFileHeader endp CHK_4R_UM macro p4R Local Exit push p4R xor ebx,ebx @@: mov edx,MM_SHARED_USER_DATA_VA + X86_PAGE_SIZE - sizeof(HANDLE) ; 0x7FFE0FFC mov eax,ebx Int 2eh cmp al,8 je @f inc ebx bt ebx,10 jnc @b jmp Exit ; !ZF @@: pop edx mov eax,ebx Int 2eh cmp al,5 ; ZF Exit: endm Ну или чтонибудь похожее. Мне больше нравится брать из Ldr.InLoadOrderModuleList.Flink.InLoadOrderModuleList.Flink.DllBase А сех вопрос отдельный, но в любом случае нельзя найти базу через этот механизм.