PEB, TEB

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

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Почему, если известно что
    PEB находится в fs:[30] в user mode
    ее адрес находится через TEB, в том же IsDebuggerPresent ?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    эти заявления равнозначны.
    fs - указывает на TEB
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    n0name
    не понял, если честно

    TEB лежит в fs:18h ?
     
  4. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Да все понятно на самом деле. TEB включает TIB и указатель на PEB, также TEB включает указатель на саму себя как раз в FS:18h. Т.е. FS:0 указывает и на TIB и на TEB, TEB содержит в себе TIB.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Хм. А почему в винде для доступа к TEB/TIB используется fs:18h (NT_TIB.Self), а не fs:0?
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    почти понял
    Код (Text):
    1. .text:77E81828 IsDebuggerPresent proc near             ; CODE XREF: .text:77EC80FEp
    2. .text:77E81828                 mov     eax, large fs:18h
    3. .text:77E8182E                 mov     eax, [eax+30h]
    4. .text:77E81831                 movzx   eax, byte ptr [eax+2]
    5. .text:77E81835                 retn
    6. .text:77E81835 IsDebuggerPresent endp
    почему бы не сократить до
    Код (Text):
    1. mov     eax, large fs:30h
    2. movzx   eax, byte ptr [eax+2]
    3. retn
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    у мелкомягких все через задницу :/
     
  8. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Думаю чтобы не юзать в командах регистр FS =), и терять по байту на команду из-за префикса. А если по другому как получить базу FS из r3?
     
  9. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Наверное у них компилер тупит =)))
     
  10. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    А вообще структуры то недокументированные, и может как раз на FS:0x18 они как бы могут полагаться (может у них она документированна наполовину), а вот на FS:0x30 не могут, т.к. в последствии они могут ее изменить.
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    он у них юзается, если посмотреть в сорцы
    #define PcTeb 0x18
    _inline struct _TEB * NtCurrentTeb( void ) { __asm mov eax, fs:[PcTeb] }
     
  12. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    потому что
    mov eax,[fs:18h]
    есть инструкция, а
    mov eax,fs:0
    нет...
    ну почему, не все... NT_TIB есть в winnt.h вроде
     
  13. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    Asterix
    наверное чтобы писать нормально читаемый код на C/C++
     
  14. sp3cz

    sp3cz New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    68
    PEB никогда не меняется в середине, начале. Изменения здесь всегда происходят "добавлением" элементов в конец. У мс будет много головной боли, если они захотят поменять что-то в начале этой структуры.
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    FreeManCPM
    Понял. fs:0 можно получить только через селектор fs, а это уже лишние вызовы в ядро.
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    +1.
    тк обычно юзают макрос NtGetCurrentPeb(). Компилятор пока не настолько крут, чтобы соптимизировать до такого кода.
     
  17. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Ну я и сказал об этом в после #8. Внимательнее коллеги.
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ошибся.
     
  19. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    IceStudent,вроде как ниправельный код

    lfs reg,[mem]

    читает (32 бита, протектед моде) 48 бит по указаному адресу, при чем память по адресу должна выглядеть след образом:
    ofs dd ?
    segm dw ?

    слово segm поподает в сегментный регистр, двойное слово ofs - в указанный регистр

    насколько йа знаю, по адресу fs:[0] находится структура NT_TIB, в которой по 0 смещению долеко не база ФС
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Freeman
    Угу.