· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› IsDebuggerPresent..

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Янв 24, 2004 23:27:32

Имеем следующий код API функции IsDebuggerPresent:
.text:77E72E92 IsDebuggerPresent proc near             ; CODE XREF: .text:77EC8EBCp
.text:77E72E92                 mov     eax, large fs:18h
.text:77E72E98                 mov     eax, [eax+30h]
.text:77E72E9B                 movzx   eax, byte ptr [eax+2]
.text:77E72E9F                 retn
.text:77E72E9F IsDebuggerPresent endp


Вопрос в следующем, для всех ли процессов в системе то что находится в fs:18h будет одинаково?


Дата: Янв 25, 2004 00:27:42

нет
там структура какая то


Дата: Янв 25, 2004 01:05:15

Ты чего, земеля, с дуба упал?
Каждый процесс имеет свою ВИРТУАЛЬНУЮ ПАМЯТЬ. Набор VA обеспечивается разными PTE!
Вот если бы ты спросил: для всех ли ПОТОКОВ в ПРОЦЕССЕ то, что находится в fs:18h будет одинаково, то ответ мой был бы другим :)


Дата: Янв 25, 2004 01:05:40 · Поправил: Grenader

[мда, косяк вышел - это я с дуба упал]


Дата: Янв 25, 2004 01:06:10

volodya
гм.


Дата: Янв 25, 2004 01:07:15

Что за "гм"?


Дата: Янв 25, 2004 01:09:48 · Поправил: Grenader

[туда же...]


Дата: Янв 25, 2004 01:34:53

Я не понял каков ответ-то всё-таки...? В реале там всегда один и тот же адрес.


Дата: Янв 25, 2004 01:43:48

Это понятно что каждый процесс имеет свою виртуальную память, но например kernel32.dll в каждом процессе грузится по одному и тому же адресу, хотя это нигде и не документировано, на этом кстати основана фишка с CreateRemoteThread, вот я и думаю если я в своём процессе проверю fs:18h, могу ли я рассчитывать что в другом процессе там будет находиться тот же адрес??


Дата: Янв 25, 2004 02:07:36

У ВСЕХ процессов по ВИРТУАЛЬНОМУ (еще раз - с физическим он не имеет ничего общего) адресу fs:18 лежит указатель на TEB (текущего потока, ессно). Понятно, что если потоков несколько, то DWORD по этому адресу будет отличаться в каждом из них. Другое дело, что в каком потоке не смотри - ты все равно можешь получить указатель на PEB (как это и делает код "mov eax, large fs:18h; mov eax, [eax+30h]"). А смещения в PEB, ясное дело, постоянны. В принципе, и адрес PEB постоянен - но ориентироваться на это нельзя, т.к. он может изменяться в разных версиях NT. И еще раз - для каждого процесса в системе селекторы настроны так, что в сегмент fs отображаються оределенные системные структуры.


Дата: Янв 25, 2004 02:08:19 · Поправил: Quantum

Asterix
Виртуальный адрес один и тотже, но физический адрес ячейки будет различным.

ЗЫ: Пока я тут репу чесал... два новых поста появилось.


Дата: Янв 25, 2004 02:11:08

Quantum
смотри выше - не ты один :-/


Дата: Янв 25, 2004 02:19:59

Grenader

Ну накрутил, ты сам то понял что написал... :-)

Мля..., я спрашиваю теперь совсем тупо, там будет находится один и тот же DWORD??
Причём здесь другая система, в другой системе ясно DWORD будет другой, но опять же должен он быть одинаков для всех процессов или нет??


Дата: Янв 25, 2004 02:24:36

Quantum

Я с тобой полностью согласен.


Дата: Янв 25, 2004 02:33:35

Asterix
в каждом процессе есть как минимум один поток. так? адрес структуры TEB для этого потока и храниться по адресу fs:18. для первого потока он фиксирован, а если создать еще потоки? при обращении из второго потока, мы получим, конечно, ДРУГОЙ DWORD, указывающий на ДРУГУЮ структуру. повторяю - при обращении из РАЗНЫХ потоков в предлах одного процесса мы получим РАЗНЫЕ DOWRD'ы! это все игра с селекторами, PTE и прочей виртуальной ерундой. но! поскольку у каждого процесса PEB есть только в одном экземпляре, ВСЕ структуры TEB (в данном процессе) в поле TEB.ProcessEnvironmentBlock, будут содержать ОДИН И ТОТ ЖЕ DWORD.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.055