Непонятки с EPROCESS.ThreadListHead и ETHREAD.ThreadListEntry

Тема в разделе "WASM.NT.KERNEL", создана пользователем Gerret, 23 окт 2007.

  1. Gerret

    Gerret New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    12
    Приветствую всех!

    Задача такая: надо найти ETHREAD всех потоков процесса.

    Делаю так:
    Нахожу EPROCESS нужного процесса и из него по Proc.ThreadListHead пытаюсь получать ETHREAD для его потоков.
    Для системного потока, все ОК, а для потока юзермодного приложения явно что-то не то... У системного потока в начале ETHREAD видно _DISPATCHER_HEADER, а в юзермодном лежит какой-то ядерный адрес...
    Может у юзермодных процессов ThreadListHead указывает на что-то другое?
     
  2. Gerret

    Gerret New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    12
    Вопрос решился :) Я протупил конкретно :) EPROCESS.ThreadListEntry.FLink(BLink) указывает не ETHREAD.ThreadListEntry (ETHREAD + 0x22C) а я думал, что он указывает на ETHREAD.Tcb.ThreadListEntry (ETHREAD + 0x1B0)
     
  3. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    А почему не пользуешь ZwQuerySystemInformation, подкласс SystemProcessesAndThreadsInformation?

    Вобще, использования жестких оффсетов в недокументированных структурах, это, конечно, круто.
    Но, технически не грамотно :)
     
  4. Gerret

    Gerret New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    12
    Дело не в крутости, а в интересе :) Тем более, что в WDK про ZwQuerySystemInformation тоже ничего не написано ;)
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Gerret
    А у Неббета зато написано, и довольно неплохо
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Понимаешь, с этими сраными списками процессов(потоков) есть одна жопа.
    Заключается она в следующем - Windows >=5.1 (XP) не убирает из списка завершившиеся/прибитые процессы(потоки).
    У них будет Process.Flags.ProcessExiting==TRUE (у потоков Thread.State==Terminated) и мусор в других полях. В 2000й такого нет (с Cr4sh'ем с этим ковырялись, подтвердит). Придетс парсить поразному флаги в разных версиях.
    Во-вторых, формат этих структур меняется от версии к версии. ПРидется зашивать разные оффсеты.
    Универсальнее использовать ZwQuerySystemInformation(), геморроя на порядок меньше.
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Даже если все хендлы закрыты?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    IceStudent
    Ну вероятно как раз изза того, что ктото удерживает хендл после закрытия процесса. Причин не знаю) Сам факт лишь видел - прибиваешь процесс или он сам завершается, а EPROCESS висит с ProcessExiting=TRUE и мусором во всех остальных полях. В 2000й не наблюдалось.

    Видимо, это сделано специально. Если присмотреться к коду ExpGetProcessInformation (которая вызывается из NtQuerySystemInformation при соотв. InfoClass), то можно найти в XP следующее (в 2000й - нет):

    Код (Text):
    1. .text:80533602 ; Attributes: bp-based frame
    2. .text:80533602
    3. .text:80533602 ; int __stdcall ExpGetProcessInformation(PVOID Base,SIZE_T Length,int,int,char)
    4. .text:80533602 _ExpGetProcessInformation@20 proc near  ; CODE XREF: NtQuerySystemInformation(x,x,x,x):loc_80606A61p
    5.  
    6. ...
    7.  
    8. .text:80533669                 mov     esi, _PsIdleProcess ; очевидно, перебор процессов вида:
    9. .text:80533669                                         ;
    10. .text:80533669                                         ; EPROCESS* ep = PsIdleProcess;
    11. .text:80533669                                         ;
    12. .text:80533669                                         ; do
    13. .text:80533669                                         ; {
    14. .text:80533669                                         ;      ...
    15. .text:80533669                                         ;      ep = PsGetNextProcess();
    16. .text:80533669                                         ; }
    17. .text:80533669                                         ; while(ep!=PsIdleProcess);
    18. .text:80533669                                         ;
    19. .text:8053366F                 mov     [ebp+ep], esi
    20. .text:80533672
    21. .text:80533672 ProcessEnumLoop:                        ; CODE XREF: ExpGetProcessInformation(x,x,x,x,x)+2DBj
    22. .text:80533672                 cmp     esi, edi
    23. .text:80533674                 jz      loc_805338E2
    24. .text:8053367A                 test    byte ptr [esi+248h], 4       ; !!!!!! if( ep->Flags.ProcessExiting ) goto SkipProcess;
    25. .text:80533681                 jnz     SkipProcess
    26.    .... ExpCopyProcessInfo ...
    27. .text:805338C4 SkipProcess:                            ; CODE XREF: ExpGetProcessInformation(x,x,x,x,x)+7Fj
    28. .text:805338C4                                         ; ExpGetProcessInformation(x,x,x,x,x)+90j ...
    29. .text:805338C4                 mov     eax, esi
    30. .text:805338C6                 sub     eax, _PsIdleProcess
    31. .text:805338CC                 neg     eax
    32. .text:805338CE                 sbb     eax, eax
    33. .text:805338D0                 and     eax, esi
    34. .text:805338D2                 push    eax
    35. .text:805338D3                 call    _PsGetNextProcess@4 ; PsGetNextProcess(x)
    36. .text:805338D8                 mov     [ebp+ep], eax
    37. .text:805338DB                 mov     esi, eax
    38. .text:805338DD                 jmp     ProcessEnumLoop
    39. ....
    То есть блоки EPROCESS с флагом ProcessExiting пропускаются
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Угу, осталось определить, кто. Подумаю на досуге.
     
  10. Gerret

    Gerret New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    12
    Great спасибо за информацию :)
    Тут нашел ресурс с литературой в электронном виде, может комуинтересно будет: book.1gb.ru