Как я был лаборантом (про программирование)

В разделе «обо мне» написано, что я работал лаборантом при кафедре ВМК. Иногда меня спрашивают — чем же я там занимался. Отвечаю: в основном, программно решал возникающие задачи, программировал я тогда, по большей части, на ассемблере x86. Поясню на примере.

В зоне отвественности кафедры было тогда (1996-97 гг.) четыре комьютерных класса. Везде, в основном, DOS. Типовое ПО (MS-DOS 6.22, Norton Commander, TurboC, TurboPascal и т.п.), непрерывный поток студентов. Из этого проистекают две проблемы: во-первых, студенты пишут файлы на диск, во-вторых, студенты удаляют и модифицируют уже существующие на диске файлы.

Первая проблема приводила к тому, что дисковое место быстро исчерповалось (а определить куда студент положил свою россыпь файлов и не стереть лишнего — та ещё задача), второя — к тому, что в середине дня приходилось (с дискет!) переставлять, например, TurboPascal или что-то даже ещё более тяжёлое (типа матстатистики).

Вот такую проблему требовалось решить.

В DOS было (и есть) API — множество фукнций, вызываемых через так называемое прерывание №21 (были и другие прерывания, обслуживаемые DOS, но это — основное). Когда программы под DOS работали с файлами они использовали это API.

Придумал я, в итоге, следующее. Винт форматируется, туда ставится DOS, Norton Commander и другое типовое ПО. Все файлы этого ПО помечаются атрибутом ReadOnly (это стандартный атрибут). Я написал программу, которая подменяет собой функции DOS для работы с файлом, которая запрещает модифицировать этот атрибут и делать что-то с этим файлом (точнее, в этом случае я возвращал код успешного завершения, но с файлом ничего не делал).

Свою программу я добавил в autoexec.bat, запретил остановку загрузки DOS (клавиши F5, F8), boot с дискеты и поставил пароль на BIOS.

В результате первая проблема решается так: после окончания занятия студентов лаборант запускает стирание всех файлов на винте, защищённые не удаляются, вторая проблема так же решается: защищенные файлы модифицировать, в итоге, не получается.

Для специалистов: int 25/26/13 я никак не подменял, но квалификации студентов тогда не хватало, чтобы обойти защиту.
21 октября 2008 12:01

recoder.ya.ru (recoder.ya.ru)
21 октября 2008, 14:48

Ох и слабоваты у вас студенты были... Мы, первокурсники, в 1991 году ручками ADM с дисков удаляли, чтобы можно было нормально компилироваться в любимой среде.

zencd.livejournal.com (zencd.livejournal.com)
21 октября 2008, 14:53

Неудобная архитектура сподвигает на геройства :-)

bolk (bolknote.ru)
21 октября 2008, 15:03, ответ предназначен recoder.ya.ru:

Были бы сильнее, не прокатило бы (вектора прерывайни ведь можно и восстановить, даже если как-то это не позволять делать, то всегда есть DMA).

Ассемблер (плюс API DOS) на моём уровне знали единицы, лучше — никто. Просто потому что ВМК в КГУ — это всё-таки не программисты (ну и не математики, если на то пошло, а какое-то нерыбное немясо).

bolk (bolknote.ru)
21 октября 2008, 15:05, ответ предназначен zencd.livejournal.com:

А альтернативы где? В то время в одном из четырёх классов стояли компы на 8086, в другом — на 80286. Линукс без защищённого режима? :) Есть, конечно, такие, но это же игрушка.

Да, в общем-то, все рассуждения о Линуксе неактуальны, пока эта платформа так не любит пользователя.

Sergey Gladilin (www.westra.ru/club/person/gladilin/)
21 октября 2008, 18:40

Думаю, не хватало не квалификации, а желания. У нас в СУНЦ МГУ (школе им. Колмогорова) легко нашлись бы те, у кого квалификации бы хватило. А из СУНЦ МГУ многие попадают на ВМиК.

bolk (bolknote.ru)
21 октября 2008, 21:10, ответ предназначен www.westra.ru/club/person/gladilin/:

Ещё раз: К-Г-У В-М-К.

Не М-Г-У В-М-и-К.

Квалификации не хватало, я там учился 5 лет, знаю какая квалификация по ассемблеру была у людей. Единицы были способны разобраться в том, что я написал и те большинство на 1-2 курса старше.

zg.livejournal.com (zg.livejournal.com)
22 октября 2008, 13:05, ответ предназначен bolk (bolknote.ru):

а зачем для всего этого вообще ассемблер?

bolk (bolknote.ru)
22 октября 2008, 15:47, ответ предназначен zg.livejournal.com:

Что бы вы предложили для этого использовать?

zg.livejournal.com (zg.livejournal.com)
22 октября 2008, 17:43, ответ предназначен bolk (bolknote.ru):

прогу можно на turboc написать.
сломать — debug.exe в dos 6.22 входил.

bolk (bolknote.ru)
22 октября 2008, 18:14, ответ предназначен zg.livejournal.com:

Зачем? На ассемблере проще. Нужно перехватить вектор и корректно его отдать, если это «не наше».

debug.exe даже не вспоминайте, то еще гавно (и оно всё ещё есть в винде, кстати). Можно было поставить любой нормальный дизассемблер, но я же говорю: у людей не хватало знаний.

bolk (bolknote.ru)
22 октября 2008, 18:15, ответ предназначен zg.livejournal.com:

Кстати, прежде чем запускать debug надо иметь хотя бы пару идей как такая защита может быть устроена. А знаний об этом было у людей ещё меньше, чем об ассемблере.

bolk (bolknote.ru)
22 октября 2008, 18:38, ответ предназначен zg.livejournal.com:

Хороший debug.exe был в Novell DOS (DR-DOS в девичестве), вот это была хорошая утилита!

zg.livejournal.com (zg.livejournal.com)
22 октября 2008, 22:48, ответ предназначен bolk (bolknote.ru):

На ассемблере проще.
спорно, ну да ладно — пусть будет проще.
debug.exe даже не вспоминайте, то еще гавно
debug — инструмент, позволяющий решать определённый круг задач. откуда такая агрессия?
надо иметь хотя бы пару идей как такая защита может быть устроена.
вообще-то перехват 21h-го прерывания самый простой способ. никаких идей не надо. сразу debug.exe.

bolk (bolknote.ru)
23 октября 2008, 08:18, ответ предназначен zg.livejournal.com:

Спорно? Чего уж спорного? Я программировал тогда и на ассемблере и на Сях. На ассемблере проще, вопрос в том насколько хорошо знать то и другое. Я знал очень хорошо.

Debug — инструмент позволяющих плохо решать определённый круг задач. Было множество инструментов, делающих это лучше.

Способ кажется простым, как только я его вам рассказал. Это из разряда идей с ложным ощущением «до этого бы каждый додумался», на деле — почти никто.

Если уж говорить о debug.exe из DOS, то была парочка способов защиты от отладки этим деббагером.

zg.livejournal.com (zg.livejournal.com)
23 октября 2008, 16:40, ответ предназначен bolk (bolknote.ru):

Спорно? Чего уж спорного?
что понимать под словом проще. проще написать и забыть. безусловно. если надо сопровождать — уже спорно. я не против ассемблера, я за адекватность средств. ассемлер знаю прекрасно и не на одной архитиектуре.
Debug — инструмент позволяющих плохо решать определённый круг задач. Было множество инструментов, делающих это лучше.
возможно плохо. но для решения описанной задачи достаточно ввести три комманды d/u/e. в чём-то другом сильно быстрее и удобнее вряд ли получилось. да и это другое где-то взять надо — дополнительная потеря скорости и удобства.
Способ кажется простым, как только я его вам рассказал.
вариантов ограничения доступа к файлам всего 2 плюс один чисто теоретический:
1. перехват прерывания 21h
2. перехват прерывания 2fh
3. ну и чисто теоретически можно перехватывать 13h/25h/26h — но это из пушки по воробъям. второй adinf вряд ли кто бы написал.
если есть что-то проще для ограничения доступа к файлам, чем перехват прерывания 21h — расскажите, интересно.
была парочка способов защиты от отладки этим деббагером.
а причём тут отладка вообще. достаточно поглядеть обработчик и либо сходу занопить проверки на обрабатываемые прерывания, либо если адрес оригинального обработчика не запрятан — записать его в таблицу векторов.

bolk (bolknote.ru)
23 октября 2008, 18:29, ответ предназначен zg.livejournal.com:

Совершенно не спорно :) Мы как-то вдвоём с братишкой писали набор утилит. Там пара сотен килобайт ассемблерного кода, проблем не было.

Способ решения данной проблемы именно так как я вам рассказал кажется простым, но до него надо ещё додуматься. Файлы могут не удаляться по любой причине. Например, я мог подпадчить Norton Commander (условно), с чего вдруг вы решили смотреть на 21-е прерывание? Я даже мог залезть глубже и пропатчить саму DOS, ничего особо страшного в этом нет. Тогда ходи про прерываниям, не ходи.

Ваша ошибка в том, что вы исходите из того, что вам известно как я это сделал. А обычному студенту это не известно.

Az (shitdesign.ru)
23 октября 2008, 19:36

у нас была вечная развлекуха - обмани факультетского сисадмина. закончилось это тем, что один из студентов таки стал этим сисадмином :)

bolk (bolknote.ru)
23 октября 2008, 20:41, ответ предназначен Az (shitdesign.ru):

Самый правильный путь :)

zg.livejournal.com (zg.livejournal.com)
23 октября 2008, 21:25, ответ предназначен bolk (bolknote.ru):

с чего вдруг вы решили смотреть на 21-е прерывание?
ну да, с файлами что-то не так, но куда указывает прерывание, предоставляющее в том числе и сервис по работе с файлами я не буду. вместого этого я пойду посмотрю куда указывает прерывание 10h, ведь файлы, они на мониторе отображатся.

bolk (bolknote.ru)
23 октября 2008, 21:59, ответ предназначен zg.livejournal.com:

Хорошо. Предположим, я модифицировал DOS, вместо того, чтобы заменять прерывание. Что дальше?

В любом случае. О чём мы спорим? Что вы мне хотите доказать?

zg.livejournal.com (zg.livejournal.com)
23 октября 2008, 23:16, ответ предназначен bolk (bolknote.ru):

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

bolk (bolknote.ru)
24 октября 2008, 10:06, ответ предназначен zg.livejournal.com:

т.е. для вас есть разница, между обходом подобного рода защиты в виде отдельного резидента и в виде, вживлённом в непосредственно в дос?
Знаете, есть. Я могу быстро увидеть, что то, куда ведёт вектор 21 не DOS, а какой-то левый сегмент, но вот быстро понять где в DOS встроен чужой код — это оно вряд ли. Это уже надо идти по командам и смотреть.


Вы думаете тогда, много лет назад, я не рассмотрел все возможности, не перебрал в уме всех, кто может её поломать и не понял, что те, кто хотел бы, не смогут, а те, кто мог бы, не станут?

И я не ошибся, это показал опыт. Я не сделал сложнее, чем нужно и не сделал проще опасного порога. Так что спорить не о чем, история *уже* нас рассудила.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)