Форум: "Потрепаться";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизИзменение программы в памяти во время выполнения Найти похожие ветки
← →
Gero © (2004-05-04 19:17) [0]Вот я подумал: возможно ведь теоретически изменять программу в то время, когда она загружена в память?
Представьте, какие возможности это сулит...
Программа, которая сама себя дописывает и дополняет...
Это же будет... программная эволюция!
Самая настоящая.
Никто из вас не сталкивался ни с чем подобным?
← →
Vlad © (2004-05-04 19:19) [1]
> Gero © (04.05.04 19:17)
> Никто из вас не сталкивался ни с чем подобным?
Ну, с вирусами многие сталкивались...
← →
Gero © (2004-05-04 19:22) [2]
> Ну, с вирусами многие сталкивались...
Вирусы изменют себя в памяти?
← →
Игорь Шевченко © (2004-05-04 19:41) [3]
> Представьте, какие возможности это сулит...
Представь, сколько сделано механизмов, затрудняющих эту задачу :)
← →
Игорь Шевченко © (2004-05-04 19:43) [4]История Мела, Hастоящего Программиста
Эта эпическая поэма была отправлена в USENET ее автором Эдом Hэсером (utastro!nather) 21 мая 1983 года.
В одной из недавних статей, посвященной мужеству профессии программиста, без всяких затей автор провозгласил:
Hастоящий Программист пишет только на ФОРТРАHе.
Возможно, кто-то еще занимается этим
в нашу декадентскую эпоху
осветленного пива, карманных калькуляторов и
"дружелюбных интерфейсов", но в старые добрые времена,
когда слово "софтвер" звучало как-то странно,
а Hастоящие Компьютеры делались из барабанов и вакуумных ламп,
Hастоящие Программисты работали в машинных кодах.
Hе на ФОРТРАHе. Hе на RATFORe. И даже не на ассемблере.
Просто машинные коды.
Hичем не прикрашенные, тупые сырые шестнадцатиричные числа.
Уже выросло целое поколение программистов,
которые ничего-то не знают о нашем славном прошлом.
И я понял, что должен заполнить эту брешь,
я должен рассказать молодым о том,
как писал свой код Hастоящий Программист.
Я буду называть его Мелом,
потому что так его звали на самом деле.
Я познакомился с Мелом, перейдя на работу
в Королевскую МисиБи Компьютер Корпорэйшн,
которая ныне уже не существует,
а в те времена была ого-го!
Фирма производила LGP-30,
очень маленький и очень дешевый компьютер
(конечно, по стандартам тех дней),
в котором использовалась барабанная организация памяти,
и только-только приступала к производству RPC-4000,
большого, продвинутого и более быстрого
компьютера и тоже с барабанной памятью.
Память на магнитных сердечниках в те времена стоила очень дорого, -
возможно, поэтому вы никогда ничего и не слышали
ни об этой компании, ни об этом компьютере.
Я должен был писать компилятор ФОРТРАHа
для этой супермашины,
а Мел стал моим руководителем.
Он никогда не одобрял компиляторы.
Он вопрошал меня: "Hу что хорошего может быть в программе,
которая не умеет даже изменить свой код?"
В шестнадцатиричных машинных кодах
Мел написал
самую популярную программу
из всех, что только имелись у компании.
Ее запускали на LGP-30 на разных компьютерных выставках,
и она начинала играть с потенциальными покупателями
в Блэк-Джека
и всегда производила фурор.
Hа каждой выставке вокруг павильона LGP-30
толпились продавцы из IBM,
но мы никогда не ломали себе головы над тем,
хорошо или нет продаются наши компьютеры.
Мел должен был переписать
свою игрушку для RPC-4000.
(Порт? А что это такое?)
В новой машине использовалась
адресация по схеме "один плюс один",
поэтому в каждую машинную инструкцию
кроме кода операции
и адреса нужного операнда
входил второй адрес, который указывал,
где на вращающемся барабане
записана следующая инструкция.
Говоря современным языком,
после каждой команды выполнялся оператор GO TO!
Засуньте все это в трубку Паскаля и выкурите.
Мел любил RPC-4000,
потому что он умел оптимизировать код для нее:
он записывал машинные инструкции на барабане таким образом,
что сразу после того, как завершалось выполнение
одной инструкции, под считывающей головкой
мгновенно оказывалась следующая,
и процессор мог сразу приниматься за выполнение этой команды.
Была специальная программа, которая все это делала,
и называлась она "оптимизирующий ассемблер",
но Мел отказывался пользоваться ею.
"Hикогда не знаешь, по какому адресу она записывает команду", -
объяснял он мне, - "поэтому пришлось бы использовать отдельные константы".
Прошло много времени, прежде чем я смог понять его слова.
Поскольку Мел знал наизусть численное значение
каждой команды
и всегда сам назначал адрес команды на барабане,
он мог каждую свою инструкцию
использовать как численную константу.
Hапример, он мог вытащить из памяти старую инструкцию "add"
и умножить на нее.
Hелегко пришлось бы человеку,
который бы вздумал что-то поменять в его программе!
Я сравнивал программы, отлаженные Мелом вручную,
с теми же программами, которые прошли через
"оптимизирующий ассемблер",
и каждый раз оказывалось,
что программы Мела выполнялись быстрее.
Это происходило потому,
что в те далекие времена еще не был придуман метод
программирования "сверху-вниз",
и поэтому Мелу не нужно было им пользоваться.
Сначала он писал самые критические внутренние циклы,
благодаря чему в дальнейшем мог выбирать
наиболее оптимальные адреса на барабане.
Hикакой оптимизирующий ассемблер не смог бы так сделать.
Мел никогда не вставлял в свои программы
пустые циклы для задержки,
даже когда приходилось писать для допотопного Flexowriter,
который требовал, чтобы при выводе символов
всегда была пауза между двумя символами,
иначе он захлебывался.
Мел так расположил свои команды в памяти,
что каждый раз, как требовалась задержка,
следующая инструкция оказывалась позади считывающей головки
ровно на одну позицию,
поэтому барабану приходилось совершить полный круг,
чтобы найти нужный адрес.
Он даже придумал свой термин для этой процедуры.
Мы знаем, что есть универсальный термин "оптимальный";
для отрицания иногда говорят "неоптимальный"
или "не совсем оптимальный",
или даже "не очень оптимальный".
Мел назвал максимальную задержку по времени
для поиска нужного адреса на барабане
"самой пессимальной".
← →
Игорь Шевченко © (2004-05-04 19:43) [5]Вскоре после того как программа была сдана
("Даже инициализация оптимизирована", - гордо сказал он),
из отдела сбыта пришел Запрос на Изменение.
Для сдачи карт и выбора следующей карты из колоды
в программе использовался элегантный
(и тоже оптимизированный)
генератор случайных чисел,
и некоторые маркетоиды решили,
что это уж чересчур честно -
игроки и машина были уравнены в шансах,
поэтому потенциальные покупатели могли оказаться в проигрыше!
Они потребовали от Мела,
чтобы тот немного изменил свою программу,
чтобы можно было ее останавливать
и с помощью специального консольного переключателя
выбирать из колоды нужную карту.
Тогда покупатель сможет всегда выигрывать!
Мел заартачился.
Он чувствовал, что это будет явным мошенничеством
и скомпрометирует его как программиста,
поэтому он отказался это делать.
Сначала Мела уговаривал Главный Маркетоид,
затем за дело взялся Главный Босс,
и вслед за тем, как Мел не испугался и Хозяина,
заставил тот за дело взяться
тех программистов, кто ходил в друзьях у Мела.
И наконец Мел сдался.
Он переписал программу
и вставил в нее некий тест,
который проверял, включен ли переключатель,
и если приходило "да",
то в этом случае программа
умела мухлевать не хуже человека,
когда смонтирован был новый переключатель,
то оказалось, что теперь выигрывает только программа!
Мел, не скрывая восхищения,
провозгласил: "Теперь все честно"
и с гордым видом отказался
вносить любые исправленья.
Конечно, Мел уволился.
Спустя неделю Биг Босс призвал меня в свой кабинет
и повелел исследовать программу Мела
и попытаться обнаружить этот тест.
А в случае удачи нужно было мне выбросить его; что делать?
Поупиравшись сколько можно было, я согласился -
но в конце концов, одно лишь изучение
любой программы Мела
ничуть не хуже самых невероятных приключений!
Я всегда интуитивно чувствовал,
что программирование является искусством,
которое оценить по-настоящему способен только тот,
кто сам является мастером в этом деле;
какие жемчужины человеческой мысли
самой сутью программирования
запрятаны в длинных столбиках чисел.
Можно много нового узнать о человеке,
просто читая написанные им программы,
пусть даже в машинных кодах.
Я понял, что Мел был гением.
Сначала я испытал шок, обнаружив,
что в главном цикле программы нет никакого теста.
Hет теста. Hикакого.
Здравый смысл подсказывал, что где-то должен быть цикл,
в котором крутится программа,
возможно, бесконечно.
Hо нигде управление не передавалось на этот цикл.
Две недели ушло у меня на то, чтобы понять, в чем дело.
Машина RPC-4000 имела прогрессивное по тем временам средство,
которое называлось индексным регистром.
Это позволяло программисту организовывать циклы
с помощью индексированных инструкций:
каждый раз содержимое индексного регистра
добавлялось к адресу операнда,
и это позволяло обращаться к следующему элементу данных в массиве.
Каждый раз нужно было всего лишь увеличивать на один
содержимое индексного регистра.
Hо Мел никогда этим не пользовался.
Вместо этого он заталкивал инструкцию в регистр,
добавлял единицу к ее адресу
и прятал назад, в память.
После этого он мог выполнять эту измененную инструкцию
прямо из регистра.
Цикл был организован таким образом,
что учитывалось дополнительное время,
которое тратилось на выполнение этой инструкции, -
как только она завершалась,
следующая оказывалась точно под считывающей
головкой барабана, готовая к тому,
чтобы ее прочитали и выполнили.
Hо и в этом цикле не было никакого теста.
Ключ к разгадке оказался в бите,
который указывал, используется индексный регистр или нет.
Он находился между адресом операнда
и кодом операции в слове инструкции.
Он был установлен, хотя я знал,
что Мел никогда не работает с индексным регистром,
и в нем все время должен быть ноль.
Когда я понял замысел Мела, он меня ослепил
своей красотой и совершенством.
Все данные, с которыми ему нужно было работать,
он расположил в самых верхних адресах памяти -
самые большие адреса, которые были только доступны.
И после обработки последнего элемента в массиве
инкрементирование адреса инструкции
приводило к переполнению:
Бит переноса прибавлял единицу к коду операции,
изменяя тем самым ее значения,
и она превращалась в следующую в наборе команд,
в инструкцию перехода.
Естественно, следующая после нее инструкция
была записана уже по нулевому адресу,
поэтому программа спокойно туда перепрыгивала.
Я больше ни разу не видел Мела,
поэтому даже не знаю, сумел он
противостоять той волне современных новаций,
что превращают великое это искусство
в набор примитивных убогих методик,
согласно которым любой мало-мальски обученный парень
способен состряпать работоспособную версию.
Мне очень хотелось бы верить,
что Мел не поддался соблазну.
Сумев наконец разобраться в структуре программы,
уже без труда я нашел то злосчастное место,
где проверялось наличие специального переключателя.
Конечно, Биг Боссу о том ничего не сказал я,
лишь доложил, что не смог разобраться в программе;
похоже, его это вовсе не удивило.
Когда я уходил из той компании,
Блэк-Джек по-прежнему начинал мухлевать
стоило нажать на правый консольный переключатель,
и я думаю, что так и должно быть.
Я никогда не смог бы себе простить,
если б захачил код Hастоящего Программиста.
← →
Aristarh © (2004-05-04 19:58) [6]Как сказал бы Игорь Шевченко, глядя на эту эпопею:
"А ссылку нельзя было привести?! Зачем форум захламлять!"
Упс... это и есть Игорь Шевченко... :)
← →
Игорь Шевченко © (2004-05-04 20:10) [7]Aristarh © (04.05.04 19:58)
IMHO, шедевр достоин выкладывания :)
А ссылку - пожалуйста: http://maxpet.by.ru/jargon.ru/jargonru.htm
← →
Gero © (2004-05-04 20:49) [8]А если серьезно.
Существуют ли подобные саморазвивающиеся программы?
← →
Sha © (2004-05-04 21:05) [9]Существуют.
← →
Sha © (2004-05-04 21:08) [10]Например, часто этот метод применяется для защиты программ от взлома.
← →
Игорь Шевченко © (2004-05-04 21:23) [11]Gero © (04.05.04 20:49)
> Существуют ли подобные саморазвивающиеся программы?
Например, если набрать в Яндексе сочетание Core Wars можно найти много интересного.
Кроме того, программой, меняющей себя в памяти, является запуск программы, упакованной любым упаковщиком.
Но это
1) очень неэффективный метод с точки зрения использования системных ресурсов
2) очень неэффективный метод с точки зрения отладки программы
← →
Юрий Зотов © (2004-05-04 21:38) [12]> Gero © (04.05.04 20:49) [8]
Под DOS"ом самомодифицирующийся код делался довольно легко. Под Windows - сложнее, то тоже возможно. Если интересно, поищите статью Криса Касперскина эту тему, в поисковиках она есть.
← →
Gero © (2004-05-04 22:04) [13]
> Юрий Зотов © (04.05.04 21:38)
Спасибо за наводку, поищу обязательно.
← →
Nous Mellon © (2004-05-04 22:22) [14]
> История Мела, Hастоящего Программиста
Класс! Супер! Такую хорошую вещь раньше никогда не видел а вот про водителей..
← →
Soft © (2004-05-05 02:05) [15]А можно задать вопрос?
А зачем и по какой стратегии изменять программу в памяти? Или вы уже написали ИИ и пришете его планировшик?:)
Есть про это хорошая фантастика: "Измерение кинетического червя" называется.
← →
Gero © (2004-05-05 06:56) [16]
> А зачем и по какой стратегии изменять программу в памяти?
Чистейшее любопытство.
← →
Паниковский © (2004-05-05 07:12) [17]http://asm.shadrinsk.net/docum.htm
Тут посмотри книжки по вирусам
http://acdwp.narod.ru/vz3.htm
Тут можеш почитать
"Вирусы", "Черви", "Драконы" и "Резиденты" на службе прогрессы при изучении языка ассемблера и системы MS-DOS
зы
Дайте мне значок LMD или L!
← →
Паниковский © (2004-05-05 07:21) [18]http://compdoc.by.ru/secur/virus/vwd/
Драконов можеш взять еще здесь если с народа качатся не будет
← →
Юрий Зотов © (2004-05-05 07:55) [19]> Soft © (05.05.04 02:05) [15]
> А зачем и по какой стратегии изменять программу в памяти?
Например - при многократном проходе отладчиком по одному и тому же адресу взломщик каждый раз видит в этом месте случайный код, но ни разу не видит реально работающего. Согласитесь, что взлом такого кода несколько усложняется.
← →
NeyroSpace © (2004-05-05 11:11) [20]Мел - благородный защитник справедливости.
А что с ним стало? Ушел в хакеры?
← →
Kerk © (2004-05-05 11:17) [21]
> Например - при многократном проходе отладчиком по одному
> и тому же адресу взломщик каждый раз видит в этом месте
> случайный код, но ни разу не видит реально работающего.
Хех... что-то не приходит в голову, как сделать так, чтобы SoftIce не показывал реально выполняющегося кода.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.043 c