Здравствуйте kong, Вы писали:
K>Привет. K>Очень нужен пример перехода на ring0 без написания драйвера, причем как под win9x так и под Win2K. Наилучшим будет пример на С++ (Visual C++), но поможет и на асме.
Дело в том,что примеру этому много лет, а 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-ы.
Подобные примеры есть в инете, на всяких хацкерских сайтах. Главная проблема в них — они
не понятны без специальной подготовки, хорошего знания асма и потрохов маздая
Привет.
Очень нужен пример перехода на ring0 без написания драйвера, причем как под win9x так и под Win2K. Наилучшим будет пример на С++ (Visual C++), но поможет и на асме.
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>Здравствуйте 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]: А у меня сами проги иногда в него вываливаются
И в софтайсное окно вываливаются с ошибкой 8-). Система OSR/2.
ВГ>> push esp 0 0 ВГ>> push offset thread_ring3_code ВГ>> push 0 0 ВГ>> callW CreateThread ; создаем новую нить
U>Вопрос возник потому что CreateThread требует 6 параметров, а тут их только три.
Почему же, как раз 6, просто сгруппированы в одном пуше по несколько.
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>Здравствуйте 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 обязателен, или може быть любая функция
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>Здравствуйте kong, Вы писали:
ВГ>>> mov context._segcs, 28h ; меняем CS:EIP
Вот тут — то "Программа выполнила недопустимое преступление" и была наказана за запись в страницу для чтения . Потому что ассемблер запихнул структуру рядом с кодом. Еогда я изменил атрибут секции .text на писать/читать то облома не было, но застыла программа как
вкопаная. Что и естественно. Pview95.exe видит два потока, похоже что это все же не в кольце 0, но может быть система не поняла юмора. Что не грохнулось еще — это благодаря топтанию на месте. Надо попробовать пойти дальше. Но это как нибудь потом. Толку с этого мало, не буду же я писать это всерьёз. За урок — спасибо, не знал что асм понимет несколько push в строке.
Здравствуйте VladD2, Вы писали:
Здравствуйте Владимир Гренадеров, Вы писали:
Здравствуйте kong, Вы писали:
Убрал данные из кода, но синего экрана не было и дебагером вижу как один и другой потоки толкутся на месте, точнее , тот который должен быть уже там он тут:
]thread_ring3_code:
push 1
call Sleep ; пауза
jmp thread_ring3_code
и живёт. Так что надо посмотреть в книге у Мэта Питрека еще раз или на sysintrnals.com сходить.
Вот по Мэту Питреку пример на Borland C++ 5.02 http://www.ua1zcl.fromru.com/zip/winmem.zip
Главное очень просто, и без ассемблера. Важно не позволить линкеру импортировать VxDCall2 по имени. На VC не делал, думаю тоже получится, только библиотеку придётся делать самому. В Борланде это сделано с помощью implib.exe .
Здравствуйте Владимир Гренадеров, Вы писали: ВГ>А вот зачем мы в cs 28h кладем, не помню.
selector 0x28 is ring0 code selector covering entire 4GB space
ВГ>Подобные примеры есть в инете, на всяких хацкерских сайтах.Главная проблема в них — они ВГ>не понятны без специальной подготовки, хорошего знания асма и потрохов маздая
9x allows modifying gdt, ldt, idt from user mode. sample:
Здравствуйте VladD2, Вы писали:
VD>Здравствуйте ua1zcl, Вы писали:
VD>А отладчик то под какой ОС-ю запускаешь? Не по NT/W2k случаем?
Нет, у меня Windows95-OSR2.