Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать Выпуск N 017


Служба Рассылок Subscribe.Ru проекта Citycat.Ru
vlink="#000000" alink="#000000">

Здравствуйте, уважаемые подписчики!


Выпуск N 017

Заповедный напев,

Заповедная даль.

Свет хрустальной зари,

Свет над Миром встающий.

Мне понятна твоя

Вековая печаль,

Беловежская пуща.

Беловежская пуща.


Сегодня в рассылке:


Друзья мои! Давайте немного сегодня поболтаем, пофилософствуем, прежде чем перейдем к вирусу. Тем более, что мне нужно много чего вам сообщить...

Моя поездка в Минск

Видно, вы уже догадались, почему я начал сегодняшний выпуск с "Песняров". Однако, вы не знаете, почему я действительно начал с "Песняров". Есть две причины:

1. На праздники ездил в Минск, столицу Республики Беларусь, где живут мои родители. Я родился и вырос там. Честно говоря, я немного разочарован. Почему? Просто потому, что я никогда не видел Беларусь в таком состоянии, в каком она находится сейчас. Она меняется прямо на глазах. Друзья мои, наболело! Обидно за земляков! Народ нищает и - как следствие - меняется на глазах. Причем меняется не в лучшую сторону. По крайней мере, мне так показалось. Я знаю, как было до 17 августа 1998. Знаю потому, что я покинул свой родной город Минск 26 февраля 1998 года. Я родился и вырос там. Я люблю Беларусь и горжусь тем, что вырос там.

Разговор о другом. Я не знаю, что Лукашенко сделал со страной. Страной богатой, как культурой, как и природными ресурсами, так и многим чем другим. В Беларуси существуют такие гиганты, как "БелАЗ" и "МАЗ", которые выпускают мощнейшие машины; "Интеграл", который сейчас, к сожалению, продали "LG"; "МТЗ", который выпускает хорошие трактора; "МЗХ", производящий холодильники "Атлант", "Минск" и др. Беларусь всегда славилась своим трикотажем, который сейчас в Москве продают на каждом углу; "левый" трикотаж выдают за белорусский потому, что белорусский качественный! Я не раз с этим сталкивался.

Как можно было так "опустить" Беларусь?! Да, Россия не далеко ушла от стран СНГ. Да, все мы стали одинаковые: мы не способны защитить свои земли. Нам не дают жить нормально. Мы не можем себе позволить рожать детей потому, что "это очень дорого". Мы готовы задушить того, кто просто попытается купить колбасу вне очереди, даже если это участник ВОВ. У нас появляется чувство зависти, злость друг на друга. Люди, с которыми я вырос, способны съесть меня же, извините, "с потрохами"! Почему? Подумайте! Кому-то выгодно нас разделить. Кому-то выгодно, чтобы такая некогда Великая Держава, как СССР никогда больше не возродилась. Не надо быть "слепыми котятами"! Что делает Белорусский Народный Фронт (БНФ)?! Сжигает российский флаг перед камерами ОРТ, НТВ, РТР! Кто платит им за это? Как можно предавать своих друзей, земляков, русских за деньги? Почему даже нацистские организации России "признают" три страны как "свои": Россию, Беларусь и Украину? Почему же БНФ плюет на своих же людей? Вы никогда не задумывались над этим?

Знаю, что на мою рассылку подписаны люди из Беларуси. Я обращаюсь к вам, Земляки! Хочу спросить: что происходит? Почему некоторые белорусы стали ненавидеть русских? Почему мои друзья и знакомые категорически против объединения двух стран? Двух стран, но фактически людей одной нации? Почему? Разве мы когда-то разделяли себя на русских и белорусов? Дорогие мои, я 20 лет прожил там, в Беларуси. Я уехал только потому, что в Москве жила моя любимая девушка, которая сейчас является моей женой. Я уехал в Россию, т.к. считаю РФ также своей Родиной. Я уехал еще в самом начале 1998 года, когда можно было жить нормально и зарабатывать хорошо в Минске. Когда доллар стоил 23.000 рублей, а сейчас - 1.250.000, причем зарплата в 60-70 миллионов БРБ считается "нормальной". Когда никто даже не думал разделять нас, русских и белорусов, на две разные нации. Неужели жилось плохо вместе с Россией? После разъединения стало лучше? Что мы теряем? Что теряет Россия? Что случилось с добрым белорусским народом? Дорогие мои Земляки! Не позволяйте себе управлять вами! Думайте и анализируйте, что Вам / Нам говорят. Извините за банальность: не поддавайтесь на провокации. Не разделяйте свой же народ! Иначе Мы...

Хотел бы сказать ( oleg77@beep.ru )...

____________

2. Не будем только о грустном. Хочу рассказать историю, которая приключилась со мной в поезде, когда я ехал в субботу, 9 декабря, из Москвы в Минск. Этот день запомнится мне на всю жизнь. Дорогие мои! Я был так счастлив, что поехал в 11 поезде, в 15 вагоне 09.12.2000! Все дело в том, что мне довелось ехать с самими "Песнярами"! В частности с Дайнеко и Малявиным! Как мы пели "Беловежскую пущу", "Конь незацугляны", "Касiу Ясь канюшыну"! Какие у них голоса! Мне кажется, что молодежь (до 20 лет) не знает о ком я говорю. Надеюсь все-таки, что большинство из вас не раз слышали эту замечательную музыку, эти прекрасные слова, эти чудесные голоса. Я счастлив, что мне удалось услышать их "вживую", поговорить с ними! Более того, я специально взял в Минск компакт-диск с "Песнярами", чтобы послушать его с друганами. Как он мне пригодился! Теперь у меня стоят подписи Дайнеко и Малявина на нем!

Правда, было очень стыдно, когда они, увидев компакт, сказали, что такой никогда не выпускали. Я-то его на рынке за семь червонцев купил...


Оценка

Хочу обратиться к каждому из вас индивидуально. Оглянитесь назад. Вспомните, что Вы знали до того, как только-только получили первый выпуск рассылки, и что Вы знаете теперь. У нас было 16 выпусков. Если бы выпуски выходили ежедневно (или если бы Вы читали по одному выпуску в день), то Вы бы получили эту информацию за 2,5 недели. Много это или мало? Просто ли Вам давались, так сказать, уроки или сложно? Интересно ли было Вам или скучно? Устраивает ли Вас информация в том виде, в котором я ее Вам преподношу, а также последовательность этой информации? Что Вы думаете о трех программах (вирус, резидент, оболочка), которые мы пишем, параллельно изучая язык? И что вообще Вы можете сказать по поводу качества выпусков в целом. Возможно, у Вас есть свои какие-нибудь пожелания.

Огромная просьба: напишите, пожалуйста, мне об этом. Просто 2-3 строки (можно больше). Вы можете выразить все Ваши мысли, пожелания, критику, а также все то, что посчитаете нужным мне сообщить. Буду Вам очень признателен.

Для чего мне это нужно?

Многие из вас, вероятно, заметили, что подписка для новичков в настоящий момент закрыта. Это значит, что теперь у нас будет тот коллектив, который уже сформировался. Теперь подписчики могут только отписаться. Я бы очень хотел, чтобы мы остались в том составе, который сейчас имеем (7600 человек). Более того, я прилагаю все усилия для того, чтобы каждый мог получить очередной выпуск с файлом-приложением: высылаю информацию по почте тем, кто не имеет выхода в Сеть. Некоторые интересуются: "Сколько ты получаешь за это?" Отвечу: "Почти ничего, если не учитывать моральное удовлетворение от того, что я смог кому-то помочь, кого-то научить." Я не ставлю перед собой задачу заработать денег. Да, Subscribe.ru выплачивает вознаграждения авторам и ведущим рассылок. За 1000 очков они получают 30 центов. В данный момент у меня на счету накопилось чуть меньше 3000 очков.

Я, конечно, понимаю, что некоторые "сгоряча" захотели научиться программировать на Ассемблере, но со временем это желание прошло. Я хочу понять, почему все-таки желание проходит. Как сделать так, чтобы оно постоянно было (если такое возможно). Я пытаюсь в каждом выпуске научить Вас не просто чему-то новому, а интересному; хочу чтобы Вы заинтересовались самим процессом изучения языка. Поэтому я постоянно напоминаю: пользуйтесь отладчиком. Ведь только так можно увидеть, что же все-таки происходит внутри этой штуковины, которая постоянно гудит. Поймите простую вещь: важно не желание знать Ассемблер (как и любое другое, например, физику), а желание его учить. Если у меня, например, есть желание стать известным физиком, но нет желания учить физику, то ничего не получится.

К чему это? Дело в том, что я хочу попробовать написать книгу, материал которой берется из нашей рассылки (естественно, я перерабатываю материал из прошлых выпусков, исправляю ошибки, добавляю что-то новое, удаляю ненужное на мой взгляд). Я не знаю, что у меня получится. Поверьте, очень волнуюсь: а так ли я пишу? А нужно ли это кому-нибудь? Может, все зря, и стоит покончить с этим делом (с написанием книги)?

Мне очень поможет Ваше мнение, Ваша точка зрения на это. Как Вы думаете, стоит ли этим заниматься вообще? Я выкладываю на сайт первую часть моей "книги", которая называется "Знакомьтесь: Ассемблер". Уже почти готова вторая часть "От знакомства - к дружбе". Если Вам интересно, то можете взглянуть. Файл можно взять здесь: http://www.oleg77.newmail.ru/Part1.exe (формат MS Word'97). У кого нет доступа - напишите, я вышлю. Конечно, все, что находится в первой части Вам уже давно знакомо. Но дело в том, что мне нужно Ваше мнение (особенно прошу написать критиков). Можете просто исправить что-то в "книге" и выслать мне исправления (если, конечно, хотите), выделив их цветом или другим шрифтом. Буду очень признателен.

Чтобы было честно, могу предложить публичное обсуждение через eGroups (assmclub@egroups.com). Что нужно для этого? Вам необходимо просто написать мне письмо в произвольной форме с просьбой включить вас в группу обсуждений.

После этого Вы сможете отправить свою информацию, которую получу не только я, но и все остальные, подписанные на данную группу. Тоже самое будет, если кто-то другой отправит письмо в группу (по адресу assmclub@egroups.com). Вы сможете узнать мнение человека, отправившего сообщение. Т.о. Вы будете уверены в том, как относятся к моей сумасшедшей идее все те, кто подписан на данную группу.

Чтобы отписаться от этой группы, достаточно отправить пустое письмо по указанному адресу: assmclub-unsubscribe@eGroups.com.

Возможно, я буду в дальнейшем использовать эту группу для обмена информацией. Так что, не спешите отписываться!

Если вдруг Вы посчитаете это дело нужным (очень надеюсь), то я планирую продавать книгу только в России, на Украине и в Беларуси.

На этом все, дорогие мои! Надеюсь, что получу хоть несколько отзывов по поводу части первой и ответы на заданные выше вопросы.


Я хочу задать вопрос!

Если у Вас возник вопрос, то его можно задать нашим экспертам, направив письмо по соответствующему адресу:

Ко мне пришло несколько писем, в которых сообщалось о том, что вы отправляете письмо к тому или иному эксперту, а оно возвращается назад с пометкой "адресат не найден". Скорее всего, проблема в том, что либо ваш провайдер перегружен, либо "глючит" eGroups. Я отправляю вопросы, адресованные в мой адрес, соответствующим экспертам. У меня ни разу письмо не вернулось! Я не знаю, с чем это связано... Пробуйте еще раз отправить. Если же ничего не получается, то пишите мне, указав в самом начале адрес эксперта, которому следует отправить ваш вопрос.

Вниманию новых подписчиков! Эксперты не высылают предыдущие выпуски рассылки! Пожалуйста, не захламляйте их ящики! Помните, что не у всех неограниченный трафик!


Ваши письма

Итак, вы уже люди взрослые, знаете многие приемы программирования на Ассемблере. Я бы еще добавил, что знаете некоторые тонкости Ассемблера.

Это к тому, что вам уже можно давать некоторые полезные ссылки на ассемблерные ресурсы, будь то программирование на Ассемблере, программы (утилиты) для работы с ним, документация про хакерство, взлом, написание вирусов, исходники программ, со многими из которых вы уже можете разобраться. Все-таки 17-ый выпуск у нас.

Ко мне довольно-таки давно пришло письмо от Андрея, который предложил следующее:

"Получил рассылку №16, где говорится об отладчиках и способах защиты от них. Посмею предложить интересную книгу в которой описаны некоторые способы обмана отладчиков и дизассемблеров. Думаю, она будет интересна Вашим подписчикам. Книга называется "Техника и философия хакерских атак" Крис Касперски. Выпущена издательством "Солон". К книге прилагается компакт-диск со всеми нужными программами. Электронную версию книги можно взять: http://rusdoc.df.ru/material/vzlom/hackbook.zip

С наилучшими пожеланиями, ваш подписчик Андрей Никитин."

Я бы еще порекомендовал заглянуть на главную страницу: http://rusdoc.df.ru/index.shtml. Там, кстати, можно найти много чего интересного для программиста.

____________

Ко мне еще пришло письмо от одного подписчика. Каюсь, друзья мои! Я его где-то потерял. Суть заключается в следующем.

Как я уже писал в прошлый раз, когда мы рассматривали вирус, наша программа, скажем так, теряется в адресах. Для этого мы код вируса переносили в область 7-ой видеостраницы. Подписчик предложил использовать следующий метод получения текущего смещения:

...

call Label_1 ;Якобы переходим на процедуру, при этом сохраняется в стеке адрес следующей за командой call инструкции (т.е. pop ax).

Label_1:

pop ax ;И сразу же достаем этот адрес со стека. Теперь в AX текущий адрес (смещение).

...

Причем, в стек заносится именно текущее смещение. Т.е. не зависимо от того, переместили ли мы сами нашу программу куда-либо по другому смещению или нет (помните, когда вирус в хвост записываем, я говорил, что команды вида mov dx,offset Message будут выглядеть в отладчике, как mov dx,400h. При перемещении вируса в хвост "программы-жертвы", мы, тем самым, перемещаем строку Message. В итоге получается, что по смещению 400h будет не наша строка, а что-то другое. Посмотрите прошлый выпуск про вирус, вспомните.).

Почему call Label_1 заносит всегда в стек текущее смещение - выяснить можно в отладчике. Тем не менее, мы позже рассмотрим различие mov dx,offset Message и call Label_1. В смысле, почему в первом случае в DX заносится константа (постоянное число; т.е., например, 400h), а во втором случае - "плавающее", если вы поняли, конечно, о чем речь идет. Так или иначе, считайте, что в приведенном выше примере мы получаем всегда текущее смещение.

По этому принципу мы теперь получим текущее смещение в нашем вирусе, тем самым усложнив задачу и - как следствие - усовершенствовав сам код вируса. Но об этом ниже, в следующем разделе.

___________

Я отправляю вам письма с ответами, с файлами, какой-то другой информацией. Однако, некоторые из них возвращаются обратно. Я пытаюсь еще и еще, но адресат все равно якобы не найден. Извините, не могу ничего поделать...


Вирус

Файл-приложение можно взять здесь: http://www.oleg77.newmail.ru/Assembler/Programs/Lessons/Virus17.rar

Итак, открываем файл Virus17.asm. Сразу же за меткой Init мы получаем смещение, по которому расположена метка Get_IP (получить IP - Instruction Pointer - указатель инструкций). Из этого адреса нужно вычесть смещение метки Get_IP.

Вот, что получаем:

Допустим, мы запускаем вирус первый раз. Т.е. все адреса в порядке. Также допустим, что Get_IP находится по адресу 0203h:

(1) [1234:0200h] call Get_IP

(2) [1234:0203h] Get_IP:

(3) [1234:0203h] pop ax

(4) [1234:0204h] sub ax,offset Get_IP

Строка (1) заносит в стек число 0203h, а (3) - достает со стека 0203h. Т.о. мы оставили стек выровненным и получили текущий адрес (смещение). Сегмент, как вы знаете, можно получить так: mov ax,cs, чего не скажешь о IP. Загрузка и чтение напрямую числа в/из IP не допускается! Поэтому нам нужно действовать хитрее, так, как указано выше в примере.

Далее получаем так: в строке (4) вычитаем из 203h смещение метки Get_IP в памяти. В отладчике строка (4) будет всегда выглядеть так:

sub ax,0203h ;sub ax,offset Get_IP ---> AX=203h-203h=0

Теперь представим, что мы находимся в хвосте какого-то файла, размером 1000h байт (смотрите на смещения в скобках). Тот же самый код будет располагаться по такому адресу:

(1) [1234:1200h] call Get_IP

(2) [1234:1203h] Get_IP:

(3) [1234:1203h] pop ax

(4) [1234:1204h] sub ax,offset Get_IP

Что мы получаем? Строка (1) заносит в стек число 1203h. Pop ax достает его со стека. Затем выполняется следующее действие:

sub ax,203h ;sub ax,offset Get_IP ---> AX=1203h-203h=1000h

Теперь в AX размер "файла-жертвы", т.е. 1000h! Получили то, что хотели!

Некоторые, возможно, скажут: "Все равно ничего не понял! Зачем мы это делаем?" Ничего страшного. Когда мы в следующем выпуске про вирус запишемся в хвост какого-нибудь файла, вы увидите, что к чему. Сейчас просто смотрите, как мы "играем" с адресами...

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

;Скопируем наш вирус в область 7-ой видеостраницы, т.е. сделаем то, что уже делали в предыдущем выпуске, только правильней.
push 0BF00h
pop es
;ES - сегмент, куда будем перемещать код вируса,

mov di,offset Open_file ;DI - смещение (адрес самой первой процедуры (см. файл-приложение))
mov si,di
add si,ax ;SI должен содержать РЕАЛЬНЫЙ адрес (смещение), т.к. мы пока еще в сегменте "файла-жертвы"...

mov cx,offset Finish-100h ;т.е. CX = длина нашего вируса в байтах
rep movsb ;Теперь в памяти две копии нашего вируса

Обратите внимание, как мы получаем адрес первой процедуры в памяти. Понятно, что после offset не обязательно должен идти адрес метки или строки, например, для вывода с помощью функции 09h. А так как метки и директивы (инструкции программы-ассемблера) не занимают памяти, то в DI мы занесем адрес (смещение) первого байта процедуры Open_file, т.е. mov ax,3D02h (не сам mov, а его смещение!).

Идем дальше. Копию в 7-ой видеостранице мы сделали. Теперь можно и переходить ("прыгать") на нее. Но теперь мы не будем использовать jmp. Давайте чуть-чуть "извратимся". Зато (как их?) "ламеры" могут "обломаться". Но мы-то уже почти "профи"! Прежде, чем разбирать, вспомним про ret, retf и iret...

Вспомнили? Поехали!

(1) mov bx,offset Lab_return
(2) add bx,ax
(3) push cs
(4) push bx
(5) retf

(6) Lab_jmp:

Теперь, если вы разобрались с retf, то труда понять принцип работы приведенных выше строк труда не составит. RETF достает со стека 2 слова (4 байта): смещение и сегмент для возврата в то место, откуда дальняя процедура вызывалась. Мы же имитируем вызов процедуры. Поверьте, процессору все равно откуда вызывалась процедура и куда возвращаться нужно. Более того, ему все равно, а вызывалась ли процедура вообще или нет. Но нам-то, программистам, не все равно! Процессор, если ему подсунули что-то не то или забыли сделать что-то, просто зависнет и все! А вот нам придется воспользоваться одной самой надежной кнопкой - RESET. Поэтому нужно быть предельно внимательным.

При вызове дальней процедуры в стек кладется сперва смещение, а затем - сегмент для возврата. Знаете, почему... Делаем это в строках (1) - (4). Но стоп! Почему мы вначале заносим сегмент (CS), а затем смещение (BX)? Ну что, будем думать или сразу сказать?..

Стек-то как у нас растет? Снизу вверх. Что получится, думаю, вы поняли. Люди вы уже самостоятельные и грамотные...

В строках (1) - (2) мы получаем смещение для возврата. К этому смещению и прибавляем размер "файла-жертвы", который находится в AX.

Теперь в стеке (а стек - это, как мы помним, специально отведенная память или просто память) у нас смещение и сегмент метки Lab_jmp (точнее первого оператора, который находится под ней). Что делает строка (5)? Ну вот, видите, как стало мне просто объяснять. Достаточно намекнуть - и все!

Вопрос: а как нам вернуться назад, в сегмент "файла-жертвы"? Найдете сами это в файле-примере? Конечно! Не сомневаюсь! Все элементарно! Рассылочка-то как наша называется?

Что еще нового мы видим? Байты "файла-жертвы", которые нужно восстанавливать:

First_bytes db 90h, 90h, 90h, 90h, 0CDh, 20h

Это - знакомые машинные коды: 90h - NOP; 0CDh - INT; 20h - 20h. Получаем программу:

nop
nop
nop
nop
int 20h

В эту переменную (в этот массив) будем заносить первые шесть байт "программы-жертвы", вместо которых запишем jmp на начало нашего вируса. Более того, эти байты будут записаны вместе с телом нашего вируса на диск, после "файла-жертвы". Они нужны для того, чтобы в последствии, когда вирус отработает, восстановить их в памяти по адресу 100h и "прыгнуть" на 100h. Программа даже и не заподозрит, что кто-то перед тем, как она получила управление, уже что-то делал!

Изначально мы заполняем массив командами nop, а после них - int 20h. Это нужно для того, чтобы при первом запуске вируса корректно завершиться. Первый запуск вируса - это когда мы только-только его сассемблировали (получили com-файл) и запустили полученную программу (в нашем случае - это будет VIRUS17.COM). Она отработает, заразит какой-нибудь файл (если найдет), восстановит первые шесть байт и передаст управление на метку 100h, полагая, что восстановила байты "файла-жертвы" и передала ему управление. Но на деле мы просто выйдем в DOS. А если мы не восстановим эти байты, но перейдем на метку 100h? Тогда вирус будет работать бесконечно.

Если же мы заразили какой-то файл и сохранили в переменной First_bytes первые байты зараженного файла, то мы просто передадим ей управление. Вот и все!

__________

Если вы заглянули в файл-приложение, то заметили там не строку

First_bytes db 90h, 90h, 90h, 90h, 0CDh, 20h

а

First_bytes db 4 dup (90h), 0CDh, 20h

Директива DUP - DUPlicate дублирует число, которое находится в скобка столько раз, сколько указывает стоящая перед ней цифра. Сравните две строки. Все станет понятно. Только имейте в виду, что этот массив занимает память на диске. Проще говоря, он увеличивает нашу программу на 6 байт. Пример:

Array db 1500 dup (0)

увеличит нашу программу на 1500 байт.

__________

Обратите еще внимание, как мы переходим на адрес 100h (передаем управление "файлу-жертве"):

mov ax,100h
jmp ax

Видите, как можно делать...

А на сегодня все! Не скучной вам недели!


С уважением,

Автор рассылки:

Калашников Олег

www.oleg77.newmail.ru

E-mail:

assembler@beep.ru

UIN (Тетя Ася):

68951340

(С) Авторское право. Запрещается использование материала из рассылки в коммерческих целях без письменного согласия автора.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Поиск

В избранное