Re: Переход на ring 0
От: Владимир Гренадеров Россия  
Дата: 13.04.02 18:01
Оценка: 10 (1)
Здравствуйте kong, Вы писали:

K>Привет.

K>Очень нужен пример перехода на ring0 без написания драйвера, причем как под win9x так и под Win2K. Наилучшим будет пример на С++ (Visual C++), но поможет и на асме.

Вот пример (насчет w2k не знаю):

push esp 0 0
push offset thread_ring3_code
push 0 0
callW CreateThread ; создаем новую нить
xchg ebx, eax ; EBX=хендл нити

push offset context
push ebx
callW GetThreadContext; получаем контекст нити

mov context._segcs, 28h ; меняем CS:EIP
mov context._eip, offset ring0_code

push offset context
push ebx
callW SetThreadContext; устанавливаем контекст

jmp $ ; чего-то ждем

thread_ring3_code: push 1
call Sleep ; пауза
jmp thread_ring3_code

ring0_code: push ss ss ; мы в нуле!
pop ds es
...
OK
Re[3]: Переход на ring 0
От: Владимир Гренадеров Россия  
Дата: 14.04.02 12:51
Оценка: 6 (1)
Здравствуйте kong, Вы писали:

Дело в том,что примеру этому много лет, а 9х у меня нету. Но я постараюсь разъяснить ключевые моменты.

K>Здравствуйте Владимир Гренадеров, Вы писали:

K>Я, в принципе, хочу переложить этот пример на С++ и из этого возникает ряд вопросов
ВГ>> push esp 0 0
ВГ>> push offset thread_ring3_code
ВГ>> push 0 0
ВГ>> callW CreateThread ; создаем новую нить
ВГ>> xchg ebx, eax ; EBX=хендл нити
K> может можно сразу задать адрес функции с кодом для ринга 0

Надо сначала поймать момент перехода в ринг0.

ВГ>> mov context._segcs, 28h ; меняем CS:EIP

ВГ>> mov context._eip, offset ring0_code
K> что делают предыдущие две строки кода с точки зрения уровня привелегий
Ничего страшного, просто изменяют пару полей в структуре CONTEXT (winnt.h)
А вот зачем мы в cs 28h кладем, не помню.

ВГ>> jmp $ ; чего-то ждем

K> куда ставить jmp и чего ждать
Это бесконечный цикл:
label:
goto label

ВГ>>thread_ring3_code: push 1

ВГ>> call Sleep ; пауза
ВГ>> jmp thread_ring3_code
K> это обязательно
А как же мы попадем в ринг0? Sleep поможет !

ВГ>>ring0_code: push ss ss ; мы в нуле!

ВГ>> pop ds es
ВГ>> ...
K> этот кусок кода в ринге0 обязателен, или може быть любая функция
Сегментные регистры не загружены, вот мы их и грузим. Далее надо сделать свой стек,
и можно делать VxDcall-ы.

Подобные примеры есть в инете, на всяких хацкерских сайтах. Главная проблема в них — они
не понятны без специальной подготовки, хорошего знания асма и потрохов маздая
OK
Переход на ring 0
От: kong Украина  
Дата: 13.04.02 16:33
Оценка:
Привет.
Очень нужен пример перехода на ring0 без написания драйвера, причем как под win9x так и под Win2K. Наилучшим будет пример на С++ (Visual C++), но поможет и на асме.
Re[2]: Переход на ring 0
От: ua1zcl Россия www.alexklm.ru
Дата: 13.04.02 20:50
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:

ВГ>Здравствуйте kong, Вы писали:


K>>Привет.

K>>Очень нужен пример перехода на ring0 без написания драйвера, причем как под win9x так и под Win2K. Наилучшим будет пример на С++ (Visual C++), но поможет и на асме.

ВГ>Вот пример (насчет w2k не знаю):


ВГ> push esp 0 0

ВГ> push offset thread_ring3_code
ВГ> push 0 0
ВГ> callW CreateThread ; создаем новую нить
ВГ> xchg ebx, eax ; EBX=хендл нити

ВГ> push offset context

ВГ> push ebx
ВГ> callW GetThreadContext; получаем контекст нити

ВГ> mov context._segcs, 28h ; меняем CS:EIP

ВГ> mov context._eip, offset ring0_code

ВГ> push offset context

ВГ> push ebx
ВГ> callW SetThreadContext; устанавливаем контекст

ВГ> jmp $ ; чего-то ждем


ВГ>thread_ring3_code: push 1

ВГ> call Sleep ; пауза
ВГ> jmp thread_ring3_code

ВГ>ring0_code: push ss ss ; мы в нуле!

ВГ> pop ds es
ВГ> ...


push esp 0 0
и
jmp $ ; чего-то ждем — куда это jmp — метки то здесь не видно?

— что всё значит? Синий экран не появляется?
Откуда информация? Вопрос возник потому что CreateThread требует 6 параметров, а тут их только три.
Александр
Re[3]: А у меня сами проги иногда в него вываливаются
От: FUKS  
Дата: 14.04.02 04:03
Оценка:
И в софтайсное окно вываливаются с ошибкой 8-). Система OSR/2.

ВГ>> push esp 0 0

ВГ>> push offset thread_ring3_code
ВГ>> push 0 0
ВГ>> callW CreateThread ; создаем новую нить

U>Вопрос возник потому что CreateThread требует 6 параметров, а тут их только три.


Почему же, как раз 6, просто сгруппированы в одном пуше по несколько.
Re[3]: Переход на ring 0
От: Dr_Sh0ck Беларусь  
Дата: 14.04.02 05:05
Оценка:
Здравствуйте ua1zcl, Вы писали:

U>push esp 0 0

U>и
U>jmp $ ; чего-то ждем — куда это jmp — метки то здесь не видно?

А с каких это пор $ это не метка
Do not fake yourself ;)
ICQ#: 198114726
Re[3]: Переход на ring 0
От: ServerMouse Беларусь  
Дата: 14.04.02 07:28
Оценка:
Здравствуйте ua1zcl, Вы писали:

ВГ>> jmp $ ; чего-то ждем


Есть такой регистр. IP называется. Так вот это он и есть.
Если человек программист, то это надолго.
Re[2]: Переход на ring 0
От: kong Украина  
Дата: 14.04.02 12:15
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:

ВГ>Здравствуйте kong, Вы писали:


K>>Привет.

K>>Очень нужен пример перехода на ring0 без написания драйвера, причем как под win9x так и под Win2K. Наилучшим будет пример на С++ (Visual C++), но поможет и на асме.


Я, в принципе, хочу переложить этот пример на С++ и из этого возникает ряд вопросов
ВГ>Вот пример (насчет w2k не знаю):

ВГ> push esp 0 0

ВГ> push offset thread_ring3_code
ВГ> push 0 0
ВГ> callW CreateThread ; создаем новую нить
ВГ> xchg ebx, eax ; EBX=хендл нити
может можно сразу задать адрес функции с кодом для ринга 0

ВГ> push offset context

ВГ> push ebx
ВГ> callW GetThreadContext; получаем контекст нити

ВГ> mov context._segcs, 28h ; меняем CS:EIP

ВГ> mov context._eip, offset ring0_code
что делают предыдущие две строки кода с точки зрения уровня привелегий

ВГ> push offset context

ВГ> push ebx
ВГ> callW SetThreadContext; устанавливаем контекст

ВГ> jmp $ ; чего-то ждем

куда ставить jmp и чего ждать

ВГ>thread_ring3_code: push 1

ВГ> call Sleep ; пауза
ВГ> jmp thread_ring3_code
это обязательно

ВГ>ring0_code: push ss ss ; мы в нуле!

ВГ> pop ds es
ВГ> ...
этот кусок кода в ринге0 обязателен, или може быть любая функция
Re: Переход на ring 0
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.04.02 20:47
Оценка:
Здравствуйте kong, Вы писали:

K>Очень нужен пример перехода на ring0 без написания драйвера, ... под ... Win2K.


Если тебе это удестся под W2k, можешь смело старчить багрепорт в MS/ Это будет оченедная ошибка. Хотя вероятность этого очень низка.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Переход на ring 0
От: ua1zcl Россия www.alexklm.ru
Дата: 14.04.02 22:19
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:

ВГ>Здравствуйте kong, Вы писали:


ВГ>>> mov context._segcs, 28h ; меняем CS:EIP


Вот тут — то "Программа выполнила недопустимое преступление" и была наказана за запись в страницу для чтения . Потому что ассемблер запихнул структуру рядом с кодом. Еогда я изменил атрибут секции .text на писать/читать то облома не было, но застыла программа как
вкопаная. Что и естественно. Pview95.exe видит два потока, похоже что это все же не в кольце 0, но может быть система не поняла юмора. Что не грохнулось еще — это благодаря топтанию на месте. Надо попробовать пойти дальше. Но это как нибудь потом. Толку с этого мало, не буду же я писать это всерьёз. За урок — спасибо, не знал что асм понимет несколько push в строке.
Александр
Re[2]: Переход на ring 0
От: ua1zcl Россия www.alexklm.ru
Дата: 14.04.02 23:27
Оценка:
Здравствуйте VladD2, Вы писали:
Здравствуйте Владимир Гренадеров, Вы писали:
Здравствуйте kong, Вы писали:

Убрал данные из кода, но синего экрана не было и дебагером вижу как один и другой потоки толкутся на месте, точнее , тот который должен быть уже там он тут:
]thread_ring3_code:
push 1
call Sleep ; пауза
jmp thread_ring3_code
и живёт. Так что надо посмотреть в книге у Мэта Питрека еще раз или на sysintrnals.com сходить.
Александр
Re[3]: Переход на ring 0
От: ua1zcl Россия www.alexklm.ru
Дата: 15.04.02 01:14
Оценка:
Здравствуйте все присутствующие, Вы писали:

Вот по Мэту Питреку пример на Borland C++ 5.02
http://www.ua1zcl.fromru.com/zip/winmem.zip
Главное очень просто, и без ассемблера. Важно не позволить линкеру импортировать VxDCall2 по имени. На VC не делал, думаю тоже получится, только библиотеку придётся делать самому. В Борланде это сделано с помощью implib.exe .
Александр
Re[4]: Переход на ring 0
От: _noname Болгария  
Дата: 15.04.02 06:12
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>А вот зачем мы в cs 28h кладем, не помню.

selector 0x28 is ring0 code selector covering entire 4GB space

ВГ>Подобные примеры есть в инете, на всяких хацкерских сайтах.Главная проблема в них — они

ВГ>не понятны без специальной подготовки, хорошего знания асма и потрохов маздая

9x allows modifying gdt, ldt, idt from user mode. sample:

http://www.winsim.com/diskid32/winio/diskid32.cpp


для NT:
http://www.sonic.net/~undoc/ntcallgate.html
ну там драйвер използуется.
Re[3]: Переход на ring 0
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.04.02 07:24
Оценка:
Здравствуйте ua1zcl, Вы писали:

А отладчик то под какой ОС-ю запускаешь? Не по NT/W2k случаем?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Переход на ring 0
От: ua1zcl Россия www.alexklm.ru
Дата: 15.04.02 12:21
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте ua1zcl, Вы писали:


VD>А отладчик то под какой ОС-ю запускаешь? Не по NT/W2k случаем?

Нет, у меня Windows95-OSR2.
Александр
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.