Перечисление потоков в процессе

Тема в разделе "WASM.WIN32", создана пользователем ormoulu, 26 июн 2011.

  1. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Какие есть способы кроме CreateToolhelp32Snapshot?
     
  2. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    Можно статически(слепки всякие, перечисление TEB etc.) и динамически(например получив сообщение об фолте в контексте всех потоков). Чем вас слепки не устраивают ?
     
  3. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Информация обо всех потоках в системе кажется мне несколько избыточной, поскольку нужен только один процесс, ну да если других вариантов нет...
     
  4. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    ormoulu
    Енум регионов памяти и валидация TEB - годный способ.
     
  5. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Как вариант, поэкспериментируй с NtQuerySystemInformation(SystemProcessesAndThreadsInformation,...)
     
  6. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    klzlk
    А как перечислить все структуры TEB определенного процесса?
    Add:
    Судя по http://www.wasm.ru/forum/viewtopic.php?id=35534 (#9) просто поиском по сигнатурам в верхних юзермодных адресах памяти?
    Есть ли другие способы?
     
  7. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    AndjellaArtavazdovna
    А вы сами можите размышлять, как вы вообще алго реализуете с такими вопросами ?
    Что такое TEB - массив в памяти. Как у всякого обьекта у него есть некоторые особенности, которые выделяют данный блок от других. Это значение полей, сама структура. Очевино если в начале региона по смещению +0x20 лежит PID, по +0x6B4(не следует юзать поля с большими смещениями, только пример) тоже PID, по +0x30 ссылка на PEB, по +0x18 ссылка на текущий регион, то однозначно это структура TEB(из неё извлекается TID, по +0x24/+0x6B8).
     
  8. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    klzlk
    Ну подумаешь спросил... Для меня очевиден лишь один способ - поиск в верхних адресах памяти , откатываться на страницу и искать по
    характерным последовательностям в памяти. Учитывая #7 я думал верно.
     
  9. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    AndjellaArtavazdovna
    С бгуир девочка не ?

    Древний код с виртека:
    Код (Text):
    1.     .686
    2.     .model flat, stdcall
    3.     option casemap :none
    4.    
    5.     include \masm32\include\ntdll.inc
    6. .code
    7. SERVICE_TABLE struct
    8. _NtQueryInformationProcess  BYTE ?
    9. _NtQuerySystemInformation   BYTE ?
    10. _NtQueryVirtualMemory       BYTE ?
    11. _NtReadVirtualMemory        BYTE ?
    12. SERVICE_TABLE ends
    13. PSERVICE_TABLE typedef ptr SERVICE_TABLE
    14.  
    15. comment '
    16. +----------------------------+-------+-------+-------+-------+-------+
    17. |OS                          | 2000  |   XP  | 2003  | VISTA | WIN7  |
    18. +----------------------------+-------+-------+-------+---------------+
    19. |Version                     |  5.0  |  5.1  |  5.2  |  6.0  |  6.1  |
    20. +----------------------------+-------+-------+-------+-------+-------+
    21. |ID NtQueryInformationProcess| 0x086 | 0x09A | 0x0A1 | 0x0E4 | 0x0EB |
    22. +----------------------------+-------+-------+-------+-------+-------+
    23. |ID NtQuerySystemInformation | 0x097 | 0x0AD | 0x0B5 | 0x0F8 | 0x106 |
    24. +----------------------------+-------+-------+-------+-------+-------+
    25. |ID NtQueryVirtualMemory     | 0x09C | 0x0B2 | 0x0BA | 0x0FD | 0x10C |
    26. +----------------------------+-------+-------+-------+-------+-------+
    27. |ID NtReadVirtualMemory      | 0x0A4 | 0x0BA | 0x0C2 | 0x105 | 0x116 |
    28. +----------------------------+-------+-------+-------+---------------+'
    29.      
    30. SERVICE_ID_BASE     equ 086h
    31.  
    32. SERVICE_VERSION_TABLE struct
    33. W2000   SERVICE_TABLE <(086h - SERVICE_ID_BASE), (097h - SERVICE_ID_BASE), (09Ch - SERVICE_ID_BASE), (0A4h - SERVICE_ID_BASE)>
    34. Xp      SERVICE_TABLE <(09Ah - SERVICE_ID_BASE), (0ADh - SERVICE_ID_BASE), (0B2h - SERVICE_ID_BASE), (0BAh - SERVICE_ID_BASE)>
    35. W2003   SERVICE_TABLE <(0A1h - SERVICE_ID_BASE), (0B5h - SERVICE_ID_BASE), (0BAh - SERVICE_ID_BASE), (0C2h - SERVICE_ID_BASE)>
    36. Vista   SERVICE_TABLE <(0E4h - SERVICE_ID_BASE), (0F8h - SERVICE_ID_BASE), (0FDh - SERVICE_ID_BASE), (105h - SERVICE_ID_BASE)>
    37. Win7        SERVICE_TABLE <(0EBh - SERVICE_ID_BASE), (106h - SERVICE_ID_BASE), (10Ch - SERVICE_ID_BASE), (116h - SERVICE_ID_BASE)>
    38. SERVICE_VERSION_TABLE ends
    39.        
    40. ;Индексы для SERVICE_TABLE.
    41. OS_VERSION_ID_2000  equ 0
    42. OS_VERSION_ID_XP    equ 1
    43. OS_VERSION_ID_2003  equ 2
    44. OS_VERSION_ID_VISTA equ 3
    45. OS_VERSION_ID_7 equ 4
    46.  
    47. $NtQueryInformationProcess macro
    48.     mov ecx,SERVICE_TABLE._NtQueryInformationProcess
    49.     Call SystemStubEntry
    50.     lea esp,[esp + 5*4]
    51. endm
    52.  
    53. $NtQuerySystemInformation macro
    54.     mov ecx,SERVICE_TABLE._NtQuerySystemInformation
    55.     Call SystemStubEntry
    56.     lea esp,[esp + 4*4]
    57. endm
    58.  
    59. $NtQueryVirtualMemory macro
    60.     mov ecx,SERVICE_TABLE._NtQueryVirtualMemory
    61.     Call SystemStubEntry
    62.     lea esp,[esp + 6*4]
    63. endm
    64.  
    65. $NtReadVirtualMemory macro
    66.     mov ecx,SERVICE_TABLE._NtReadVirtualMemory
    67.     Call SystemStubEntry
    68.     lea esp,[esp + 5*4]
    69. endm
    70.  
    71. NTCALL macro StubName:REQ, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10
    72.     FOR Arg, <p10,p9,p8,p7,p6,p5,p4,p3,p2,p1>
    73.     IFNB <Arg>
    74.     push Arg
    75.     ENDIF
    76.     ENDM
    77.     StubName
    78. endm
    79.  
    80. ;Возвращает индекс для SERVICE_TABLE. В случае успеха EFlags.ZF = 1.
    81. GET_VERSION_ID macro
    82.     push ecx
    83.     push edx
    84.     mov ecx,dword ptr ds:[KUSER_SHARED_DATA_ADDRESS + KUSER_SHARED_DATA.NtMajorVersion]
    85.     mov edx,dword ptr ds:[KUSER_SHARED_DATA_ADDRESS + KUSER_SHARED_DATA.NtMinorVersion]
    86.     cmp ecx,5
    87.     je v_5_x_
    88.     cmp ecx,6
    89.     jne err_ver_
    90. ;6.X
    91.     test edx,edx
    92.     mov eax,OS_VERSION_ID_VISTA
    93.     jz end_ver_ ;6.0
    94.     dec edx
    95.     inc eax     ;OS_VERSION_ID_7
    96.     jz end_ver_ ;6.1
    97.     jmp err_ver_
    98. v_5_x_:
    99.     xor eax,eax ;OS_VERSION_ID_2000
    100.     test edx,edx
    101.     jz end_ver_ ;5.0
    102.     inc eax     ;OS_VERSION_ID_XP
    103.     dec edx
    104.     jz end_ver_ ;5.1
    105.     inc eax     ;OS_VERSION_ID_2003
    106.     dec edx
    107.     jz end_ver_
    108. err_ver_:
    109.     mov eax,STATUS_NOT_IMPLEMENTED
    110. end_ver_:
    111.     pop edx
    112.     pop ecx
    113. endm
    114.  
    115. SystemStubEntry proc C
    116.     GET_VERSION_ID
    117.     Call Dt_
    118. Dt_:
    119.     pop edx
    120.     lea edx,[edx + eax*sizeof(SERVICE_TABLE)]
    121.     movzx eax,byte ptr [edx + ecx + (offset ServiceTable - offset Dt_)]
    122.     add eax,SERVICE_ID_BASE
    123.     lea edx,[esp + 4]
    124.     Int 2Eh
    125.     ret
    126. ServiceTable SERVICE_VERSION_TABLE <>
    127. SystemStubEntry endp
    128.  
    129. EnumerateThreadsIntoMemory proc uses ebx esi edi ProcessHandle:HANDLE, EnumerationCallback:PVOID, CallbackParameter:PVOID
    130. Local SystemInformation:SYSTEM_BASIC_INFORMATION
    131. Local ProcessInformation:PROCESS_BASIC_INFORMATION
    132. Local MemoryInformation:MEMORY_BASIC_INFORMATION
    133. Local EnumerationReturnFlag:BOOLEAN
    134. Local RemoteProcessId:HANDLE
    135.     lea edx,SystemInformation
    136.     NTCALL $NtQuerySystemInformation, SystemBasicInformation, edx, sizeof(SYSTEM_BASIC_INFORMATION), NULL
    137.     test eax,eax
    138.     lea edx,ProcessInformation
    139.     jnz exit_
    140.     NTCALL $NtQueryInformationProcess, ProcessHandle, ProcessBasicInformation, edx, sizeof(PROCESS_BASIC_INFORMATION), eax
    141.     mov ecx,SystemInformation.AllocationGranularity
    142.     test eax,eax
    143.     mov ebx,SystemInformation.HighestUserAddress
    144.     jnz exit_
    145.     dec ecx
    146.     mov edi,SystemInformation.PhysicalPageSize
    147.     not ecx
    148.     mov EnumerationReturnFlag,eax
    149.     and ebx,ecx
    150.     mov esi,ProcessInformation.UniqueProcessId
    151. ; Адрес последней страницы, нормально 0x7FFE0000.
    152.     sub ebx,edi
    153. next_check_:
    154.     lea edx,MemoryInformation
    155.     NTCALL $NtQueryVirtualMemory, ProcessHandle, Ebx, MemoryBasicInformation, edx, sizeof(MEMORY_BASIC_INFORMATION), eax
    156.     test eax,eax
    157.     jnz exit_
    158.     cmp MemoryInformation.BaseAddress,ebx
    159.     jne exit_
    160.     cmp MemoryInformation.AllocationBase,ebx
    161.     jne exit_
    162.     cmp MemoryInformation.RegionSize,edi
    163.     jne exit_
    164.     cmp MemoryInformation._Type,MEM_PRIVATE
    165.     jne exit_
    166.     cmp MemoryInformation.State,MEM_COMMIT
    167.     jne exit_
    168.     cmp MemoryInformation.Protect,PAGE_READWRITE
    169.     jne exit_
    170.     cmp ProcessInformation.PebBaseAddress,ebx
    171.     je next_page_
    172.     assume ebx:PTEB
    173.     .if ProcessHandle == NtCurrentProcess
    174.     mov ecx,[ebx].Cid.UniqueProcess
    175.     cmp esi,ecx
    176.     jne exit_
    177.     .else
    178.     lea ecx,[ebx].Cid.UniqueProcess
    179.     lea edx,RemoteProcessId
    180.     NTCALL $NtReadVirtualMemory, ProcessHandle, ecx, edx, sizeof(HANDLE), eax
    181.     test eax,eax
    182.     jnz exit_
    183.     cmp RemoteProcessId,esi
    184.     jne exit_
    185.     .endif
    186.     lea eax,EnumerationReturnFlag
    187.     push eax
    188.     push CallbackParameter
    189.     push ebx
    190.     push [ebx].Cid.UniqueThread
    191.     Call EnumerationCallback
    192.     test eax,eax
    193.     jnz exit_
    194.     cmp EnumerationReturnFlag,eax
    195.     jne exit_
    196. next_page_:
    197.     sub ebx,edi
    198.     jmp next_check_
    199. exit_:
    200.     ret
    201. EnumerateThreadsIntoMemory endp
    202.  
    203. EnumCallback proc ThreadId:HANDLE, Teb:PTEB, CallbackParameter:PVOID, EnumerationReturnFlag:PBOOLEAN
    204.     xor eax,eax
    205.     ret
    206. EnumCallback endp
    207.  
    208. Entry proc
    209. Local ThreadId:HANDLE
    210.     invoke EnumerateThreadsIntoMemory, NtCurrentProcess, addr EnumCallback, 0
    211.     ret
    212. Entry endp
    213. end Entry
    Код (Text):
    1.     .686
    2.     .model flat, stdcall
    3.     option casemap :none
    4.    
    5.     include \masm32\include\ntdll.inc
    6.     includelib \masm32\lib\ntdll.lib
    7. .code
    8. EnumerateThreadsIntoMemory proc uses ebx esi edi ProcessHandle:HANDLE, EnumerationCallback:PVOID, CallbackParameter:PVOID
    9. Local SystemInformation:SYSTEM_BASIC_INFORMATION
    10. Local ProcessInformation:PROCESS_BASIC_INFORMATION
    11. Local MemoryInformation:MEMORY_BASIC_INFORMATION
    12. Local EnumerationReturnFlag:BOOLEAN
    13. Local RemoteProcessId:HANDLE
    14.     invoke ZwQuerySystemInformation, SystemBasicInformation, addr SystemInformation, sizeof(SYSTEM_BASIC_INFORMATION), NULL
    15.     test eax,eax
    16.     jnz exit_
    17.     invoke ZwQueryInformationProcess, ProcessHandle, ProcessBasicInformation, addr ProcessInformation, sizeof(PROCESS_BASIC_INFORMATION), NULL
    18.     mov ecx,SystemInformation.AllocationGranularity
    19.     test eax,eax
    20.     mov ebx,SystemInformation.HighestUserAddress
    21.     jnz exit_
    22.     dec ecx
    23.     mov edi,SystemInformation.PhysicalPageSize
    24.     not ecx
    25.     mov EnumerationReturnFlag,eax
    26.     and ebx,ecx
    27.     mov esi,ProcessInformation.UniqueProcessId
    28. ; Адрес последней страницы, нормально 0x7FFE0000.
    29.     sub ebx,edi
    30. next_check_:
    31.     invoke ZwQueryVirtualMemory, ProcessHandle, Ebx, MemoryBasicInformation, addr MemoryInformation, sizeof(MEMORY_BASIC_INFORMATION), NULL
    32.     test eax,eax
    33.     jnz exit_
    34.     cmp MemoryInformation.BaseAddress,ebx
    35.     jne exit_
    36.     cmp MemoryInformation.AllocationBase,ebx
    37.     jne exit_
    38.     cmp MemoryInformation.RegionSize,edi
    39.     jne exit_
    40.     cmp MemoryInformation._Type,MEM_PRIVATE
    41.     jne exit_
    42.     cmp MemoryInformation.State,MEM_COMMIT
    43.     jne exit_
    44.     cmp MemoryInformation.Protect,PAGE_READWRITE
    45.     jne exit_
    46.     cmp ProcessInformation.PebBaseAddress,ebx
    47.     je next_page_
    48.     assume ebx:PTEB
    49.     .if ProcessHandle == NtCurrentProcess
    50.     mov ecx,[ebx].Cid.UniqueProcess
    51.     cmp esi,ecx
    52.     jne exit_
    53.     .else
    54.     lea edx,[ebx].Cid.UniqueProcess
    55.     invoke ZwReadVirtualMemory, ProcessHandle, edx, addr RemoteProcessId, sizeof(HANDLE), NULL
    56.     test eax,eax
    57.     jnz exit_
    58.     cmp RemoteProcessId,esi
    59.     jne exit_
    60.     .endif
    61.     lea eax,EnumerationReturnFlag
    62.     push eax
    63.     push CallbackParameter
    64.     push ebx
    65.     push [ebx].Cid.UniqueThread
    66.     Call EnumerationCallback
    67.     test eax,eax
    68.     jnz exit_
    69.     cmp EnumerationReturnFlag,eax
    70.     jne exit_
    71. next_page_:
    72.     sub ebx,edi
    73.     jmp next_check_
    74. exit_:
    75.     ret
    76. EnumerateThreadsIntoMemory endp
    77.  
    78. EnumCallback proc ThreadId:HANDLE, Teb:PTEB, CallbackParameter:PVOID, EnumerationReturnFlag:PBOOLEAN
    79.     xor eax,eax
    80.     ret
    81. EnumCallback endp
    82.  
    83. Entry proc
    84. Local ThreadId:HANDLE
    85.     invoke EnumerateThreadsIntoMemory, NtCurrentProcess, addr EnumCallback, 0
    86.     ret
    87. Entry endp
    88. end Entry
    Ращумеется сейчас я бы это реализовал иначе, но лень же. Кстате мб у кого бекапы виртека сохранились ?
     
  10. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Используйте NtAccessCheckAndAuditAlarm (INT 0x2E; %eax = 0x02, %edx = page_ptr) для проверки валидности страницы памяти. Вот навскидку кодес:

    Код (Text):
    1. .page_next:
    2.     ... ;; walk through all the memory
    3. .page_validate:
    4.     mov eax, 2
    5.     push edx
    6.     int 0x2e
    7.     pop edx
    8.     sub al, 5               ; ACCESS_VIOLATION ?..
    9.     jz .page_next
     
  11. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    7mm
    Любой сервис, получающий в аргументах ссылку. И кстате ссылку на аргументы нужно загружать в Edx.
     
  12. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    klzlk
    Да, конечно, но этот сервис на всех вендах работает т.к. его индекс не менялся...

    Про %edx я что-то не то сказал?.. См. код.
     
  13. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    7mm
    При вызове сискола в Edx должна быть ссылка на дно стека. Иначе не будет работать, по известным причинам :)
     
  14. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Кому нужно тот разберётся :)