Можно статически(слепки всякие, перечисление TEB etc.) и динамически(например получив сообщение об фолте в контексте всех потоков). Чем вас слепки не устраивают ?
Информация обо всех потоках в системе кажется мне несколько избыточной, поскольку нужен только один процесс, ну да если других вариантов нет...
klzlk А как перечислить все структуры TEB определенного процесса? Add: Судя по http://www.wasm.ru/forum/viewtopic.php?id=35534 (#9) просто поиском по сигнатурам в верхних юзермодных адресах памяти? Есть ли другие способы?
AndjellaArtavazdovna А вы сами можите размышлять, как вы вообще алго реализуете с такими вопросами ? Что такое TEB - массив в памяти. Как у всякого обьекта у него есть некоторые особенности, которые выделяют данный блок от других. Это значение полей, сама структура. Очевино если в начале региона по смещению +0x20 лежит PID, по +0x6B4(не следует юзать поля с большими смещениями, только пример) тоже PID, по +0x30 ссылка на PEB, по +0x18 ссылка на текущий регион, то однозначно это структура TEB(из неё извлекается TID, по +0x24/+0x6B8).
klzlk Ну подумаешь спросил... Для меня очевиден лишь один способ - поиск в верхних адресах памяти , откатываться на страницу и искать по характерным последовательностям в памяти. Учитывая #7 я думал верно.
AndjellaArtavazdovna С бгуир девочка не ? Древний код с виртека: Код (Text): .686 .model flat, stdcall option casemap :none include \masm32\include\ntdll.inc .code SERVICE_TABLE struct _NtQueryInformationProcess BYTE ? _NtQuerySystemInformation BYTE ? _NtQueryVirtualMemory BYTE ? _NtReadVirtualMemory BYTE ? SERVICE_TABLE ends PSERVICE_TABLE typedef ptr SERVICE_TABLE comment ' +----------------------------+-------+-------+-------+-------+-------+ |OS | 2000 | XP | 2003 | VISTA | WIN7 | +----------------------------+-------+-------+-------+---------------+ |Version | 5.0 | 5.1 | 5.2 | 6.0 | 6.1 | +----------------------------+-------+-------+-------+-------+-------+ |ID NtQueryInformationProcess| 0x086 | 0x09A | 0x0A1 | 0x0E4 | 0x0EB | +----------------------------+-------+-------+-------+-------+-------+ |ID NtQuerySystemInformation | 0x097 | 0x0AD | 0x0B5 | 0x0F8 | 0x106 | +----------------------------+-------+-------+-------+-------+-------+ |ID NtQueryVirtualMemory | 0x09C | 0x0B2 | 0x0BA | 0x0FD | 0x10C | +----------------------------+-------+-------+-------+-------+-------+ |ID NtReadVirtualMemory | 0x0A4 | 0x0BA | 0x0C2 | 0x105 | 0x116 | +----------------------------+-------+-------+-------+---------------+' SERVICE_ID_BASE equ 086h SERVICE_VERSION_TABLE struct W2000 SERVICE_TABLE <(086h - SERVICE_ID_BASE), (097h - SERVICE_ID_BASE), (09Ch - SERVICE_ID_BASE), (0A4h - SERVICE_ID_BASE)> Xp SERVICE_TABLE <(09Ah - SERVICE_ID_BASE), (0ADh - SERVICE_ID_BASE), (0B2h - SERVICE_ID_BASE), (0BAh - SERVICE_ID_BASE)> W2003 SERVICE_TABLE <(0A1h - SERVICE_ID_BASE), (0B5h - SERVICE_ID_BASE), (0BAh - SERVICE_ID_BASE), (0C2h - SERVICE_ID_BASE)> Vista SERVICE_TABLE <(0E4h - SERVICE_ID_BASE), (0F8h - SERVICE_ID_BASE), (0FDh - SERVICE_ID_BASE), (105h - SERVICE_ID_BASE)> Win7 SERVICE_TABLE <(0EBh - SERVICE_ID_BASE), (106h - SERVICE_ID_BASE), (10Ch - SERVICE_ID_BASE), (116h - SERVICE_ID_BASE)> SERVICE_VERSION_TABLE ends ;Индексы для SERVICE_TABLE. OS_VERSION_ID_2000 equ 0 OS_VERSION_ID_XP equ 1 OS_VERSION_ID_2003 equ 2 OS_VERSION_ID_VISTA equ 3 OS_VERSION_ID_7 equ 4 $NtQueryInformationProcess macro mov ecx,SERVICE_TABLE._NtQueryInformationProcess Call SystemStubEntry lea esp,[esp + 5*4] endm $NtQuerySystemInformation macro mov ecx,SERVICE_TABLE._NtQuerySystemInformation Call SystemStubEntry lea esp,[esp + 4*4] endm $NtQueryVirtualMemory macro mov ecx,SERVICE_TABLE._NtQueryVirtualMemory Call SystemStubEntry lea esp,[esp + 6*4] endm $NtReadVirtualMemory macro mov ecx,SERVICE_TABLE._NtReadVirtualMemory Call SystemStubEntry lea esp,[esp + 5*4] endm NTCALL macro StubName:REQ, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 FOR Arg, <p10,p9,p8,p7,p6,p5,p4,p3,p2,p1> IFNB <Arg> push Arg ENDIF ENDM StubName endm ;Возвращает индекс для SERVICE_TABLE. В случае успеха EFlags.ZF = 1. GET_VERSION_ID macro push ecx push edx mov ecx,dword ptr ds:[KUSER_SHARED_DATA_ADDRESS + KUSER_SHARED_DATA.NtMajorVersion] mov edx,dword ptr ds:[KUSER_SHARED_DATA_ADDRESS + KUSER_SHARED_DATA.NtMinorVersion] cmp ecx,5 je v_5_x_ cmp ecx,6 jne err_ver_ ;6.X test edx,edx mov eax,OS_VERSION_ID_VISTA jz end_ver_ ;6.0 dec edx inc eax ;OS_VERSION_ID_7 jz end_ver_ ;6.1 jmp err_ver_ v_5_x_: xor eax,eax ;OS_VERSION_ID_2000 test edx,edx jz end_ver_ ;5.0 inc eax ;OS_VERSION_ID_XP dec edx jz end_ver_ ;5.1 inc eax ;OS_VERSION_ID_2003 dec edx jz end_ver_ err_ver_: mov eax,STATUS_NOT_IMPLEMENTED end_ver_: pop edx pop ecx endm SystemStubEntry proc C GET_VERSION_ID Call Dt_ Dt_: pop edx lea edx,[edx + eax*sizeof(SERVICE_TABLE)] movzx eax,byte ptr [edx + ecx + (offset ServiceTable - offset Dt_)] add eax,SERVICE_ID_BASE lea edx,[esp + 4] Int 2Eh ret ServiceTable SERVICE_VERSION_TABLE <> SystemStubEntry endp EnumerateThreadsIntoMemory proc uses ebx esi edi ProcessHandle:HANDLE, EnumerationCallback:PVOID, CallbackParameter:PVOID Local SystemInformation:SYSTEM_BASIC_INFORMATION Local ProcessInformation:PROCESS_BASIC_INFORMATION Local MemoryInformation:MEMORY_BASIC_INFORMATION Local EnumerationReturnFlag:BOOLEAN Local RemoteProcessId:HANDLE lea edx,SystemInformation NTCALL $NtQuerySystemInformation, SystemBasicInformation, edx, sizeof(SYSTEM_BASIC_INFORMATION), NULL test eax,eax lea edx,ProcessInformation jnz exit_ NTCALL $NtQueryInformationProcess, ProcessHandle, ProcessBasicInformation, edx, sizeof(PROCESS_BASIC_INFORMATION), eax mov ecx,SystemInformation.AllocationGranularity test eax,eax mov ebx,SystemInformation.HighestUserAddress jnz exit_ dec ecx mov edi,SystemInformation.PhysicalPageSize not ecx mov EnumerationReturnFlag,eax and ebx,ecx mov esi,ProcessInformation.UniqueProcessId ; Адрес последней страницы, нормально 0x7FFE0000. sub ebx,edi next_check_: lea edx,MemoryInformation NTCALL $NtQueryVirtualMemory, ProcessHandle, Ebx, MemoryBasicInformation, edx, sizeof(MEMORY_BASIC_INFORMATION), eax test eax,eax jnz exit_ cmp MemoryInformation.BaseAddress,ebx jne exit_ cmp MemoryInformation.AllocationBase,ebx jne exit_ cmp MemoryInformation.RegionSize,edi jne exit_ cmp MemoryInformation._Type,MEM_PRIVATE jne exit_ cmp MemoryInformation.State,MEM_COMMIT jne exit_ cmp MemoryInformation.Protect,PAGE_READWRITE jne exit_ cmp ProcessInformation.PebBaseAddress,ebx je next_page_ assume ebx:PTEB .if ProcessHandle == NtCurrentProcess mov ecx,[ebx].Cid.UniqueProcess cmp esi,ecx jne exit_ .else lea ecx,[ebx].Cid.UniqueProcess lea edx,RemoteProcessId NTCALL $NtReadVirtualMemory, ProcessHandle, ecx, edx, sizeof(HANDLE), eax test eax,eax jnz exit_ cmp RemoteProcessId,esi jne exit_ .endif lea eax,EnumerationReturnFlag push eax push CallbackParameter push ebx push [ebx].Cid.UniqueThread Call EnumerationCallback test eax,eax jnz exit_ cmp EnumerationReturnFlag,eax jne exit_ next_page_: sub ebx,edi jmp next_check_ exit_: ret EnumerateThreadsIntoMemory endp EnumCallback proc ThreadId:HANDLE, Teb:PTEB, CallbackParameter:PVOID, EnumerationReturnFlag:PBOOLEAN xor eax,eax ret EnumCallback endp Entry proc Local ThreadId:HANDLE invoke EnumerateThreadsIntoMemory, NtCurrentProcess, addr EnumCallback, 0 ret Entry endp end Entry Код (Text): .686 .model flat, stdcall option casemap :none include \masm32\include\ntdll.inc includelib \masm32\lib\ntdll.lib .code EnumerateThreadsIntoMemory proc uses ebx esi edi ProcessHandle:HANDLE, EnumerationCallback:PVOID, CallbackParameter:PVOID Local SystemInformation:SYSTEM_BASIC_INFORMATION Local ProcessInformation:PROCESS_BASIC_INFORMATION Local MemoryInformation:MEMORY_BASIC_INFORMATION Local EnumerationReturnFlag:BOOLEAN Local RemoteProcessId:HANDLE invoke ZwQuerySystemInformation, SystemBasicInformation, addr SystemInformation, sizeof(SYSTEM_BASIC_INFORMATION), NULL test eax,eax jnz exit_ invoke ZwQueryInformationProcess, ProcessHandle, ProcessBasicInformation, addr ProcessInformation, sizeof(PROCESS_BASIC_INFORMATION), NULL mov ecx,SystemInformation.AllocationGranularity test eax,eax mov ebx,SystemInformation.HighestUserAddress jnz exit_ dec ecx mov edi,SystemInformation.PhysicalPageSize not ecx mov EnumerationReturnFlag,eax and ebx,ecx mov esi,ProcessInformation.UniqueProcessId ; Адрес последней страницы, нормально 0x7FFE0000. sub ebx,edi next_check_: invoke ZwQueryVirtualMemory, ProcessHandle, Ebx, MemoryBasicInformation, addr MemoryInformation, sizeof(MEMORY_BASIC_INFORMATION), NULL test eax,eax jnz exit_ cmp MemoryInformation.BaseAddress,ebx jne exit_ cmp MemoryInformation.AllocationBase,ebx jne exit_ cmp MemoryInformation.RegionSize,edi jne exit_ cmp MemoryInformation._Type,MEM_PRIVATE jne exit_ cmp MemoryInformation.State,MEM_COMMIT jne exit_ cmp MemoryInformation.Protect,PAGE_READWRITE jne exit_ cmp ProcessInformation.PebBaseAddress,ebx je next_page_ assume ebx:PTEB .if ProcessHandle == NtCurrentProcess mov ecx,[ebx].Cid.UniqueProcess cmp esi,ecx jne exit_ .else lea edx,[ebx].Cid.UniqueProcess invoke ZwReadVirtualMemory, ProcessHandle, edx, addr RemoteProcessId, sizeof(HANDLE), NULL test eax,eax jnz exit_ cmp RemoteProcessId,esi jne exit_ .endif lea eax,EnumerationReturnFlag push eax push CallbackParameter push ebx push [ebx].Cid.UniqueThread Call EnumerationCallback test eax,eax jnz exit_ cmp EnumerationReturnFlag,eax jne exit_ next_page_: sub ebx,edi jmp next_check_ exit_: ret EnumerateThreadsIntoMemory endp EnumCallback proc ThreadId:HANDLE, Teb:PTEB, CallbackParameter:PVOID, EnumerationReturnFlag:PBOOLEAN xor eax,eax ret EnumCallback endp Entry proc Local ThreadId:HANDLE invoke EnumerateThreadsIntoMemory, NtCurrentProcess, addr EnumCallback, 0 ret Entry endp end Entry Ращумеется сейчас я бы это реализовал иначе, но лень же. Кстате мб у кого бекапы виртека сохранились ?
Используйте NtAccessCheckAndAuditAlarm (INT 0x2E; %eax = 0x02, %edx = page_ptr) для проверки валидности страницы памяти. Вот навскидку кодес: Код (Text): .page_next: ... ;; walk through all the memory .page_validate: mov eax, 2 push edx int 0x2e pop edx sub al, 5 ; ACCESS_VIOLATION ?.. jz .page_next
7mm Любой сервис, получающий в аргументах ссылку. И кстате ссылку на аргументы нужно загружать в Edx.
klzlk Да, конечно, но этот сервис на всех вендах работает т.к. его индекс не менялся... Про %edx я что-то не то сказал?.. См. код.
7mm При вызове сискола в Edx должна быть ссылка на дно стека. Иначе не будет работать, по известным причинам