Как написать вирус на бейсике
Здравствуйте! В этом посте (первом) я покажу, как создавать вирус шутку через блокнот. Сразу прошу не бомбить и не писать гневные комменты типа: "Да такого миллион!", "Да что ты знаешь!", "Да пошел ты в жопу!" и т.д. Да, я знаю, что эти "вирусы" создавали давно. Но я к примеру открыл для себя это совсем недавно. Месяца 3 назад.
Ближе к делу: я буду рассказывать что эта шутка вообще делает, буду вставлять скрины и все объяснять. Напомню, это ознакомительный пост! В других постах я буду конкретно писать, как создать такой-то вирус.
Вирус-шутка это программа, которую создают в блокноте. Т.е. пишешь там команды и сохраняешь их определенных форматах. Если все правильно сделано, без ошибок, то вирус-шутка сработает. Кстати, "вирус-шутка" это условное название. В блокноте можно создать и игру, и крестики нолики, часы.
ПРЕДУПРЕЖДЕНИЕ. Перед созданием вируса отключите Анти-Вирус.
1) Создание вируса: Для начала откройте блокнот.
2) В блокноте начинайте писать команду. Для начала скопируйте этот текст туда:
msgbox"Ты не против, если я буду жить у тебя в компе?",32+4,"Вопрос"
msgbox"Ок, ты не против",64,"Я понял"
msgbox"Ок, ты не против",64,"Я понял"
msgbox"Это шутка, это НЕ вирус :) ХАХАХАХА",64,"Я пошутил"
msgbox"Или же нет. ",64,". "
Я НЕ ЖЕЛАЮ ВАМ ЗЛА! ЭТОТ ВИРУС НЕ МОЖЕТ ПРИНЕСТИ ВАМ И ВАШЕМУ КОМПУ ВРЕДА!
3) Сохраните ваш текст в формате .vbs Смотрите далее.
4) Теперь у вас на Рабочем столе должен появиться вот такой значок:
5) Заходите в него.
6) У вас должен открыться вирус-шутка. Если же не работает, то два варианта: либо у вас включен Анти-Вирус, либо ваш комп не поддерживает это.
7) НЕ ПУГАЙТЕСЬ! ВИРУС-ШУТКА НЕ ПРИНЕСЕТ ВРЕДА. Теперь вам осталось читать то, что там написано, и кликать по кнопкам (любым).
Вы можете изменить в команде вируса текст. Например вместо "Windows удалить?" можно написать "ставьте лайки!". Удачи вам, экспериментируйте со своими вирусами!
И так, как я обещал, это был ознакомительный пост. Вскоре я выложу пост, где подробно опишу все значения, как все делать и т.д. Отпишитесь в тапках как вам мой пост, киньте скрины своего вируса. Мне будет интересно :D
сука! у меня винда удалилась!
Не ври. Этот вирус-шутка и близко такого сделать не может.
ТС, у вас тоже снегопад? Занятия в школах отменили?
Да, отменили. Вот и сижу, "клавотюкаюсь".
Мне хочется узнать все подробно как это работает что обозначает msgbox, цифры 64; 32+4
"msgbox" - название команды, которая выводит стандартный диалог. Цифрами выбирается стиль отображения (иконка внутри диалога и воспроизводимый звук при открытии). Также стилем выбираются кнопки (их текст и количество)
Отображаемых иконок всего 4: ошибка, вопрос, восклицание и внимание. Столько-же звуков.
Кнопок в связке по более:
Ок
Ок, Отмена
Да, Нет
Да, Нет, Отмена
Повтор, Отмена
Пропустить, Повторить Отменить
Т.к. эти диалоги выдаются системой, то можно указать только заголовок и текст диалога. Свой текст кнопок или свою иконку Вы не сможете установить. Можно вывести диалог без иконки. Вроде ничего не забыл. Давно увлекался этим, потом перешел на норм. язык программирования.
Ой, а может поможете раз разбираетесь?
Хочу коллегу разыграть/ поздравить с днем рождения. Он в командировке сейчас. Хочу ему на почту файл бросить который в определенный день ему на принтер выведет поздравление. Как можно батник сделать, чтобы он себя в автозагрузку прописал и именно в определенный день сработал? Ну и удалился потом, чтоб он не догадался.
В инете поискал, там только на удаление доков батники) и определенного дня нельзя поставить.
Если хотите именно батник, то можно попробовать использовать планировщик Windows, но с батниками куча ограничений.
О поздравлялке: даже если Вы отправите эл. письмо с батником или exe-шником, то поздравление не сработает, пока его не скачают и не запустят. В некоторых случаях почтовый сервис может отправить письмо в папку "Спам" (пользователь его не увидит), либо при скачивании файл заблокирует антивирус, но это все маловероятно.
На счет печати принтером: это можно, но обязательно? Можно например вывести на экран красивый диалог, или картинку :)
Нет с программкой не тот эффект))) Да и вк нету.
Просто хотелось отправить на почту письмо, (его обязательно откроют, так как с этого адреса только по работе приходит, да и с чувством опасности у людей проблемы))), чтоб этот файл прописался в планировщик или в автозагрузку, а в нужный день отправил бы на печать текст. Там принтер ежедневно включают, так что по-любому бы удивил)))
Я батники когда-то давно делал. Даже похожий прикол видел, когда из планировщика каждый день на печать выходит "Ты умрешь через *** дней", "Ты умрешь завтра", "Это случится сегодня". Но там надо было за компом посидеть, чтоб настроить. А как это "дистанционно" через почту сделать я не знаю.
В любом случае спасибо.
Хм, думаю, что через батник хоть и сложно, но реально: батник запускает установщик Windows (msiexec.exe) с параметром, который скачает и установит программу и документ с текстом печати. Программа прописывается в автозапуск и следит за датой и временем системы. Как только дата начала наступает, программа запускает скрытый процесс Microsoft Office Word (winword.exe) с параметром начала печати нашего документа. Программа делает какую-нибудь отметку на каком-либо ресурсе (сайте или сервере), что она успешно отработала. Запускается msiexec.exe с параметром удаления нашей программы (программа удаляется с компьютера).
Несколько вопросов:
- на компьютере есть MS Office Word? Иначе придется создавать документ формата .rtf (поддерживается системой без доп. софта)
- проще изначально в письме использовать не батник, а именно приложение (exe-файл, т.к. не придется сначала создавать, а после скачивать установщик). Если нужно, то предоставлю исходный код приложения. Язык программирования - AutoIt 3. Его синтаксис очень напоминает рассматриваемые в посте скрипты. Так может лучше обойтись без батника?
- нужны дата запуска печати документа и текст поздравления
- желательно заранее знать, какая операционная система установлена на компьютере, где будет выполняться "поздравлялка" (XP, Vista, 7, 8, 8.1, 10 или серверные редакции систем Windows)?
Как вариант, вам нужно сделать "разделитель", между "самим вирусом" и картинкой.
Сделать это можно следующим образом:
Вы-же всё-равно постоянно считываете сами-себя, так и добавьте например в последние четыре байт исходного вируса флаг-разделитель, например число 0xDEADBEEF.
Далее считываете сами себя, пока не нашли разделитель 0xDEADBEEF, это будет означать, что дальше идет уже картинка и её копировать не нужно.
Более простой, вы-же знаете размер исходного вируса, но считывайте это число байт. Но не рекомендуется, т.к. после каждой перекомпиляции, размер может меняться и вам придется каждый-раз делать это в коде. (
Да вы всё правильно поняли, как реализовать ?
К сожалению бейсик незнаю, но для интереса глянул код, немного подскажу, так вот:
В переменную BytesExeFileFull считали сами себя:
Короче в цикле, пока Ubound(BytesExeFileFull) - размер массива (хз. как получить в бейсике), проверяем на разделитель, как-только нашли разделитель, то выходим из цикла, иначе заполняем массив BytesExeFile, в итоге у нас будет как-раз нужный массив, без картинки, ну и работаем с ним.
Когда-же нужно создать нужный файл, то просто нужно добавить разделитель, между файлом и картинкой:
В принципе, алгоритм понятен, но нужно каким то образом ещё нужно записывать в переменную считанные байты до разделителя, если его нет, то считываем в массив байты полностью, затем всё в файл. А здесь переменная ctr в цикле нахождения разделителя принимает числа, а преобразовать её не получается. Придется продолжать поиски, что-то типа FileStream.Read или BinaryReader.
PS Как записать разделитель между собой и картинкой это понятно, а вот как прочитать и записать себя в массив до разделителя - вот это вопрос
Ну, если уж ничего не накопаю, то придется перейти ко второму методу - объявить константу байт самого себя
Ну тут идея такая, что-бы не менять то-что сделано, вы считываете всё в первый массив байт BytesExeFileFull, а потом из этого массива делаете уже другой массив BytesExeFile, который уже без картинки.
Да идея может-быть не эллегантная, но файлики небольшие, каких-то проблем с памятью быть не должно.
Вообще я бейсик незнаю, как писал уже, возможно что-то неправильно написал, короче проще (можете вначале даже на этом примере поотлаживать).
Допустим есть массив (Считайте, что это файл + разделитель + картинка), для простаты разделитель у нас будет 0x55 0xAA, короче два байта, итак наш массив:
Dim BytesExeFileFull As Byte() =
Файл данных, такой массив:0x01,0x02,0x03
Разделитель:0x55,0xAA
Картинка: 0x11,0x12,0x13
Вам и нужно написать такую программу, которая получит массив файла.
Ну я и привёл пример цикла:
ctrl - Это индекс массива:
Т.е.:
BytesExeFileFull(0) = 0x01;
BytesExeFileFull(1) = 0x02;
*****
Или в бейсики нетак ? Нужно тогда получить доступ к индексу массива.
Кстати на переполнение надо-бы проверить:If ctr != Ubound(BytesExeFileFull) иначе прога может упасть из-за выхода за границы массива, хе-хе. )
В общем примерно похожим образом работают и крипторы, единственное там алгоритмы шифрования, запуск в памяти и т.д., что нетак и важно, если научитесь эту задачу делать, потом можете и крипторы штамповать. )
Здравсвуйте, дорогие любители Ассемблера!
Выпуск № 10
Пей пиво на заре, пей пиво перед сном,
Пей пиво на траве, пей пиво за столом,
Пей пиво на тощак, пей пиво со хмеля,
Пей пиво просто так, пей как "Авария"!
Пей пиво!
"Дискотека "Авария".
Что у нас сегодня?
Почему я с пива-то начал? Да вот почему: в настоящий момент есть четыре хорошие новости:
1. В позапрошлый понедельник (то бишь, 18 сентября 2000 года ) у меня родился сын! С чем вы и можете меня и мою жену поздравить. Одним Калашниковым стало больше. Ну, и, естественно, это дело отмечалось "по полной программе". Пиво текло рекой (особенно мое любимое - "девятка").
3. Я нашел классную работу. Теперь Интернет у меня постоянный (по световому кабелю). Мне нет смысла пользоваться услугами провайдера России-Он-Лайн. В связи с этим у меня меняется адрес электронной почты. Большая просьба: кто присылал мне предыдущие сообщения на адрес [email protected], переслать их по адресу [email protected]. Спасибо!
Я также благодарю всех, кто присылал мне предложения по поводу трудоустройства. Дорогие мои! Низкий вам поклон и море благодарности.
4. Наша рассылка соответствует всем требованиям, предъявлемым к рассылкам класса "золотых" . Так что, я надеюсь, что скоро мы будем в соответствующем разряде. Огромное спасибо всем, кто оставался с нами (т.е. вам всем).
Пожалуйста, возьмите предыдущие выпуски по одному из следующих адресов:
Если у Вас нет доступа в Сеть, то напишите мне письмо с просьбоей выслать тот или иной выпуск либо все вместе:
Сообщаю несколько адресов подписчиков, которые пожелали разместить e-mail в рассылке:
А вот ниже письмо от Леонида. Подобных писем пришло много, поэтому я отвечу на одно как всем:
Добрый день, Олег!
Хотелось бы заняться ассемблером, но не знаю с чего. Подскажи с чего начать (с нуля); если есть что-то в электронном виде, то, если не трудно, вышли.
С уважением Леонид.
Еще многие спрашивают, почему я не рекомендую пользоваться каким-нибудь специальным текстовым редактором. Друзья мои! Текстовых редакторов существует великое множество. Я все же настоятельно советую пользоваться DOS Navigator'ом, который можно взять на нашем сайте, т.к. эти спецредакторы имеют кучу ошибок и недоделок. Скачивайте, кому нужно!
Теперь по поводу предыдущего выпуска. Что у нас была за программа? Да! Она загружала саму себя в память. Т.е. поверх себя (поверх своего кода). Я не зря просил Вас назвать ее именно less009.asm. Т.к. если программа не найдет файл с данным именем (*.com), то она просто выйдет, при этом выдаст звуковой сигнал. Одна девушка, которая интересуется программированием на Ассемблере (да-да, дорогие мои! В наших рядах есть женщины, чему я очень рад!), назвала работу программы "чертовщиной". На самом деле, ничего сложного в ней нет. Надеюсь, Вы поняли, что в Ассемблере можно вытворять невероятные вещи, которые на языках высокого уровня (Бейсик, С, Паскаль) недоступны.
Мне очень понравилось объяснение Александра на форуме. Я опубликовываю (с некоторыми добавлениями. Очень надеюсь, что Александр за это не будет меня бить ногами):
; Программа выполняет запись самой себя в то место памяти, куда она
assume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
mov dx,offset File_name ; Открываем файл
call Open_file ; с помощью спец-процедуры (см. ниже).
jc Error_file ; Переход на метку Error_file при неудаче.
mov bx,ax ; Сохраняем идентификатор файла и
mov ah,3Fh ; начинаем его читать (то бишь файл).
mov cx,offset Finish-100h ; Записываем длину нашей программы (кол-во читаемых байт),
mov dx,offset Begin ; и читаем файл в память,
int 21h ; начиная с указанного адреса. ВЕРНО. (прим. - О. К.)
call Close_file ; Закрываем файл с помощью спец-процедуры (см. ниже).
mov ah,9 ; Выводим сообщение об удачном завершении.
mov dx,offset Mess_ok
; Если файл с указанным именем не нашли (File_name db 'less009.com',0), то пищим и выходим. (прим. - О. К.)
Open_file proc ; Процедура открытия файла для чтения,
cmp Handle,0FFFFh ; в которой выясняется открыт ли файл,
jne Quit_open ; и если не открыт - открываем его.
stc ; Устанавливаем флаг переноса в 1, необходимый
ret ; для подтверждения факта открытия файла (для jc).
Handle dw 0FFFFh
Close_file proc ; Процедура закрытия файла,
cmp Handle,0FFFFh ; при условии, что он был открыт.
File_name db 'less009.com',0
Mess_ok db 'Всё нормально!',0Ah,0Dh,'$' ; 0Ah,0Dh - переход в начало следующей строки,
; типа writeln или puts().
Finish equ $ ; Признак (адрес) конца кода программы.
Подробнее мы рассмотрим принцип работы подобных программ позже.
Большинство из вас проголосовало за изучение Ассемблера таким образом:
быстро DOS, а затем Windows. Я полагаю, что это интереснее и целесообразнее будет, чем просто изучить DOS, либо сразу перейти к Windows. Таким образом, мы начинаем изучать DOS.
Что же касается программы, которую мы будем писать, параллельно изучая Ассемблер, то результаты такие:
1. Оболочка типа Norton Commander;
На первое место все же вышла оболочка, но не на много обогнав вирус.
Что такое вирус? Вирус - это программа, написанная, как правило, на Ассемблере (хотя есть вирусы, написанные на Pascal, С и Visual Basic). Эта программа может сама размножаться, заражая другие программы без участия программиста, который сам же и написал этот вирус. Как так может быть? Элементарно!
Писать вирус на Ассемблере - милое дело. В свое время я писал вирусы как резидентные (постоянно находящиеся в памяти), так и нерезидентные. Более того, я писал и антивирусы (против своих же вирусов, естественно).
Прежде чем перейти к изучению структуры вируса, я хотел бы предупредить Вас об уголовной ответственности за распространение вирусоподобных программ. Если Вы напишите вирус, а затем выпустите его "в свет", то Вас смогут отправить в "места не столь отдаленные" (по Российским законам); например, на Колыму.
Кто пишет вирусы? Да все кому не лень! Прежде всего - это программисты, которые только-только изучили Ассемблер, и не видят иной возможности, как только написать какой-нибудь вирус и напакостить своему другу, соседу и т.д., тем самым проявив себя. Например, у знакомого стоит большой Пень-433, а у Вас - маленькая "тройка". И Вы горите желанием его Пень "заломать".
Теперь представим другую ситуацию: у фирмы X есть конкурент - фирма Y. Как сделать так, чтобы на время фирме Y доставить хлопот? А почему бы их компьютеры не заразить вирусом "собственного производства", который такого-то числа или при таких-то обстоятельствах удалял бы всю информацию на винчестере? Пишется вирус сотрудником фирмы X, а затем он (вирус) заносится в компьютер к конкуренту. И все! Как правило заражаются компьютеры не только фирмы Y, но и другие (сотрудник переписал зараженный файл и приес к себе домой; у него переписал этот же файл знакомый и т.д.).
Естественно, есть т.н. антивирусы (DrWeb, Aidstest, Norton Antivirus, Microsoft Antivirus и пр.). Однако, они пишутся только для тех вирусов, котрые знакомы автору данного антивируса. Если, допустим, я напишу свой вирус, то уверяю Вас, что ни один антивирус его не обнаружит (максимум, что может быть - это то, что антивирус напишет сообщение о возможном заражении файла, но вылечить его не сможет!).
Теперь рассмотрим структуру вируса и принцип его работы. Цель всего этого - научить Вас распознавать вирусы и развеять страх перед ними.
Что должен делать вирус? Прежде всего - определить, загружен ли он с какого-нибудь файла или это его первая загрузка (дальше Вы поймете, о чем идет речь). Затем найти первый попавшийся файл, проверить его, заражен ли уже он или нет, если да, то искать следующий, а если нет, то заразить его. Все это происходит очень быстро и для пользователя практически незаметно.
Сколько занимает вирус в памяти? Все зависит от фантазии программиста (что он хочет сделать с компьтером/файлами). Средний размер вируса - 500 - 600 байт. Хотя есть умельцы, у которых вирус занимает 100 - 150 байт, а есть и такие, у которых простейший вирус занимает 1,5 - 3 и более килобайт.
Что может вирус? Все, что угодно! Например, удалить всю информацию с винчестера за 0,5 - 1 секунду (по принципу работы Fdisk), спалить монитор, физически испортить винчестер и даже убить пользователя (хотя такого не встречал пока)! Все зависит от фантазии программиста.
Какой вирус мы будем изучать? Мы будем рассматривать неризедентный вирус, заражающий *.com-файлы (самый простой). Что он будет делать? Я думаю, ничего особенного, кроме как размножения и создания какой-либо незначительной помехи для пользователя.
Как оформить вирус? Обычно:
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
. ;здесь находится тело вируса.
Т.е. формат обычного *.com-файла, который Вам уже известен. Можно создать и *.exe-файл, однако, его размер будет больше.
Я думаю, что на сегодня с вирусом хватит. Тем более, что по результатам ваших опросов, вирус - это не то, на что бы Вы хотели сделать акцент при изучении Ассемблера.
Приступаем к самому сложному разделу. Будет действительно сложно. Кто сможет разобраться - будет настоящим героем!
Резидентная программа (резидент) - программа, которая постоянно находится в памяти. Примером резидента является драйвер мыши, Norton Guide, всевозможные антивирусы, которые следят за тем, что делает та или иная программа и сообщают о ее действиях пользователю и пр.
Как правило, резидентная программа должна перехватывать то или иное прерывание, с тем чтобы программист или другие программы могли обратиться к ней. Давайте поподробнее рассмотрим прерывания (немного мы изучали их в предыдущих выпусках).
Прерывание - это своего рода процедура (подпрограмма), которая имеет не название (например, print_string), а номер. В компьютере есть 256 различных номеров прерываний. Некоторые номера зарезервированы BIOS (ПЗУ) компьютера (например, 16h; помните: mov ah,10h / int 16h?) или операционной системой (MS-DOS, PC-DOS, OS/2) (например, 21h: mov ah,9 / mov dx,offset String / int 21h).
Тем не менее, ничего не мешает программисту перехватить, скажем, 21h прерывание, тем самым контролировать кто и что делает с ним.
Ну например. Выведем на экран строку:
mov dx,offset Our_string
Our_string db 'Привет!$'
Процессор (MS-DOS) выведет на экран сообщение "Привет". А мы можем перехватить 21h прерывание и, проследив, что кто-то пытается вывести строку (не важно, какую), мы заносим в DX адрес нашей строки. В таком случае, все, что бы не выводилось на экран путем вызова функции 09 прерывания 21h, на экране будет появляться наша и только наша строка. Это можно сделать так:
;представим, что это кусок нашего обработчика 21h прерывания.
; здесь передаем управление "настоящему" 21h.
mov dx,offset My_string
Здесь мы проверяем, вызывается ли функция вывода строки на экран (09) или какая-либо другая. Если вызывается другая функция (например, 3Dh), то мы просто предаем управление оригинальному обработчику.
Что же такое обработчик прерывания? Это процедура, постоянно (или на время) находящаяся в памяти, которая принимает управление первой, делает что хочет, а затем передает управление оригинальному обработчику (т.е. процедуре, которая уже находилась в памяти до загрузки нашего обработчика). Та может также выполнить некоторые действия, а затем передать управление другому обработчику и т.д.
Если что-либо не понятно - не отчаивайтесь! Это действительно очень сложно! Очень скоро все станет на свои места.
Теперь перейдем к обработчику (читайте внимательно описания после точки с запятой):
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
;Переходим на метку инициализации. Нам нужно будет перехватить прерывание 21h, а также оставить программу резидентной в памяти
; Ниже идет, собственно, обработчик 21h прерывания (он будет резидентный). После того, как программа выйдет, процедура Int_21h_proc останется в памяти и будет контролировать функцию 09 прерывания 21h. Он у нас будет жирным.
Int_21h_proc proc
pushf ;сохраним в стеке регистр флагов
cmp ah,9 ;проверим: это функция 09h?
je Ok_09
popf ;восстановим регистр флагов
jmp dword ptr cs:[Int_21h_vect] ;Если нет, прейдем на оригинальный обработчик прерывания 21h. Все. На метку Ok_09 программа уже не вернется
Ok_09:
push ds ;Сохраним регистры
push dx
push cs ;Адрес троки должен быть DS:DX
pop ds
mov dx,offset My_string
pushf ;так надо! Позже рассмотрим
call dword ptr cs:[Int_21h_vect] ;Вывели нашу строку вместо той, которую надо было
pop dx ;восстановим использованные регистры
pop ds
popf
iret ;продолжим работу (выйдем из прерывания)
Int_21h_vect dd ? ;переменная для хранения оргинального адреса обработчика 21h
My_string db 'Моя строка!$'
int_21h_proc endp
;Со следующей метки нашей прогрммы уже не будет в памяти (это нерезидентная часть). Она затрется сразу после выхода.
;установим наш обработчик (Int_21h_proc) (адрес нашего обработчика, если быть точнее) на 21h прерывание. Это позовляет сделать функция 25h прерывания 21h. Но прежде нам нужно запомнить оригинальный адрес этого прерывания. Для этого используется функция 35h прерывания 21h:
mov ah,35h ;AH содержит номер функции (это понятно)
mov al,21h ;AL указывает номер прерывания, адрес (или вектор) которого нужно получить
int 21h ;тепрь в ES:BX адрес (вектор) 21h прерывания (ES - сегмент, BX - смещение)
mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es ;обратите внимание на запись
;итак, адрес сохранили. Теперь перехватываем прерывание:
mov dx,offset Int_21h_proc ;DX должен указывать на наш обработчик (т.е. Int_21h_proc)
;Все! Теперь, если какая-либо программа вызовет 21h, то вначале копьютер попадет на наш обработчик (Int_21h_proc). Что осталось? Завершить программу, оставив ее резидентной в памяти (чтобы никто не затер наш обработчик. Иначе компьютер просто зависнет!)
mov dx,offset Init
; Функция 27h прерывания 21h выходит в DOS (как 20h), при этом оставив нашу программу резидентной. DX должен указывать на последний байт, остающийся в памяти (это как раз метка Init).
Рассмотрим должным образом новые прерывания и операторы.
Функция 35h прерывания 21h: получить адрес (вектор) прерывания:
Вход: | AH =35h | ||||||||||||||||||||||||
Выход: | ES = сегментный адрес вектора прерывания
_________ Функция 25h прерывания 21h: установить вектор прерывания:
_________ Прерывание 27h: оставить программу резидентной в памяти:
_________
_________
_________ Что такое флаги вы помните? На всякий случай рассмотрим кратко на примере еще раз: Здесь после выполнения строки (1) установится/сбросится флаг нуля. В строке (2) проверяем этот самый флаг. Если он установлен, значит команда сравнения верна (т.е. AX=23). Если же не установлен, то AX <> (не равен) 23. Теперь обратите внимание на самое начало процедуры Int_21h_proc. Что мы видим: Мы нарушаем работу программы (изменяем флаг нуля). Это может привести к довольно-таки серьезным изменениям в ходе работы программы, которая вызвала 21h прерывание. Для этого, собственно, мы и сохраняем флаги в стеке. Надеюсь, вы поняли, что в обработчике прерывания (в нашем случае - Int_21h_proc) необходимо сохранять ВСЕ используемые регистры, включая регистр флагов. Теперь рассмотрим следующую строку: Int_21h_vect dd ? ;переменная для хранения оргинального адреса обработчика 21h Данная переменная может хранить двойное слово (Define Double word - определить двойное слово) (четыре байта). Вспоминаем, что один 16-и разрядный занимает 2 байта (одно слово) (DX, AX, ES, SS и т.д., но не AH, DL, BH - это 8-и разрядные регистры, которые занимают один байт!). Если мы хотим загрузить в данную переменную слово (два байта), то нам необходимо указать это таким образом: mov word ptr Int_21h_vect,ax Если же мы хотим загрузить один байт, то пишем так: mov byte ptr Int_21h_vect,ah Вспоминаем, что word - это слово, а byte - это байт. Что-нибудь прояснилось? Затем создайте простейшую программу, которая будет выводить на экран некоторую строку путем вызова 09 функции 21h прерывания. Например, так: assume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG mov dx,offset String String db 'My string.$' Запускаем сперва Программу N 01 . После того, как он вернется в DOS (в Norton Commander, DOS Navigator, Far и пр. оболочки), запускайте Программу N 02 . Что вы увидите? Теперь запустите Программу N 02 в отладчике. Заходите смело "внутрь" 21h-ого прерывание. Что вы видите теперь? Ну что, дорогие мои! Сложно? 1. Все внимательно прочитал несколько раз, но ничего не понял. 2. Плохо объясняешь. "Дошло" на третьи сутки. 3. "Дошло" с трудом. Желательно объяснять поподробнее. А так все нормально. 4. Тяжело, но интересно. Продолжай в том же духе! 5. Все отлично! Классно объясняешь! 6. Элементарщина! Скорее бы к Windows перейти. На сегодня все! Оболочку рассмотрим на следующей неделе (байт не хватит). Удачного программирования вам! Автор рассылки: Калашников Олег Читайте также:
|