Почему, если известно что PEB находится в fs:[30] в user mode ее адрес находится через TEB, в том же IsDebuggerPresent ?
Да все понятно на самом деле. TEB включает TIB и указатель на PEB, также TEB включает указатель на саму себя как раз в FS:18h. Т.е. FS:0 указывает и на TIB и на TEB, TEB содержит в себе TIB.
почти понял Код (Text): .text:77E81828 IsDebuggerPresent proc near ; CODE XREF: .text:77EC80FEp .text:77E81828 mov eax, large fs:18h .text:77E8182E mov eax, [eax+30h] .text:77E81831 movzx eax, byte ptr [eax+2] .text:77E81835 retn .text:77E81835 IsDebuggerPresent endp почему бы не сократить до Код (Text): mov eax, large fs:30h movzx eax, byte ptr [eax+2] retn
Думаю чтобы не юзать в командах регистр FS =), и терять по байту на команду из-за префикса. А если по другому как получить базу FS из r3?
А вообще структуры то недокументированные, и может как раз на FS:0x18 они как бы могут полагаться (может у них она документированна наполовину), а вот на FS:0x30 не могут, т.к. в последствии они могут ее изменить.
он у них юзается, если посмотреть в сорцы #define PcTeb 0x18 _inline struct _TEB * NtCurrentTeb( void ) { __asm mov eax, fs:[PcTeb] }
потому что mov eax,[fs:18h] есть инструкция, а mov eax,fs:0 нет... ну почему, не все... NT_TIB есть в winnt.h вроде
PEB никогда не меняется в середине, начале. Изменения здесь всегда происходят "добавлением" элементов в конец. У мс будет много головной боли, если они захотят поменять что-то в начале этой структуры.
+1. тк обычно юзают макрос NtGetCurrentPeb(). Компилятор пока не настолько крут, чтобы соптимизировать до такого кода.
IceStudent,вроде как ниправельный код lfs reg,[mem] читает (32 бита, протектед моде) 48 бит по указаному адресу, при чем память по адресу должна выглядеть след образом: ofs dd ? segm dw ? слово segm поподает в сегментный регистр, двойное слово ofs - в указанный регистр насколько йа знаю, по адресу fs:[0] находится структура NT_TIB, в которой по 0 смещению долеко не база ФС