Настольная книга компьютерного исследователя


Motorola Assembler/BB

Не знающих людей волнует первый вопрос — «Что такое AmigaOs и с чем его едят?». AmigaOs — это операционная система для компьютеров Amiga. Компьютеры Amiga базируются на процессорах семейства motorola 680xx. На сегоднешний день, самая распространенная машина в бывшем CCCP это amiga1200 на базе 68030 микропроцессора. 030 представляет собой 32-битный микропроцессор второго поколения, содержащий центральный CPU, кэш-память команд и много чего интересного вместе с регистрами данных, адреса, стэка, управляющими регистрами. Вся прелесть старой amiga в ее трех дополнительных чипах. Это Agnus, Denice и Paula. Они ответственны за звук, вывод графики и спрайты. (и это в 85 году! всего 3 человека! Чувствуете аналогию с современным аксельным барахлом?). Касаясь памяти, можно выделить 2 основных вида это chip и fast память (кроме ranger/etc). Chip память — основная память, в ней происходит работа чипов, почти всех каналов dma и т.д. Fast память — дополнительная память, ее использует только cpu (еще каналы dma ZorroIII). Вся она (память) распределена вот по такому принципу:

                  $000000-$07FFFF      чип RAM
                  $080000-$1FFFFF      зарезервировано
                  $200000-$9FFFFF      потенциальная fast RAM
                  $A00000-$BEFFFF      зарезервировано
                  $BFD000-$BFDF00      PIA B (even addresses)
                  $BFE001-$BFEF00      PIA C (odd addresses)
                  $C00000-$DFEFFF      reserved for expansion
                  $DFF000-$DFFFFF      custom chip registers
                  $E00000-$E7FFFF      зарезервировано
                  $E80000-$EFFFFF      expansion ports
                  $F00000-$F7FFFF      зарезервировано
                  $F80000-$FFFFFF      системная ROM

Регистры:

Регистры данных (d0-d7)
Адресные регистры (a0-a7)
Регистр состояния (sr)
2 стэковых указателя (usp и ssp) (аналоги intel’a bp и sp)
и Программный счетчик (pc) (аналог intel’a ip)

Под amiga существует также достаточное количество компиляторов, hex views, etc. Самые яркие из компиляторов это AsmOne и DevPac. Все примеры указанные здесь расчитаны под DevPac компилятор. Синтаксис достаточно прост и кое-где напоминает at&t синтаксис *nix осей:

$e — 16-ричное число.
%0110 — 2-ичное число.
move.b,w,l — byte, word, longw, etc.

Библиотеки amigaos хранятся в файлах library (dos library, etc). Кроме одной. Это exec.library. Она находится в пзу и ее открывать/закрывать никогда не нужно (она всегда открыта, в отличии от всех остальных). Схема действий такова: открыли библиотеку, сделали дела, закрыли библиотеку:

;---great file and data wr.--------------------------------------------------
start:
       lea dosname(pc),a1       ;
       move.l 4,a6              ;  Open dos.library
       jsr -$228(a6)            ;  OpenLibrary()
       move.l d0,a6             ;

       move.l #filename,d1      ;
       move.l #$3ee,d2          ;  Great/Open file
       jsr -$1e(a6)             ;  Open()

       mve.l d0,conhandle       ;

       move.l conhandle,d1      ;
       move.l $c,d2             ;  Position in file
       move.l #1,d3             ;
       jsr -$42(a6)             ;  Seek()

       move.l conhandle,d1      ;
       move.l #buffer,d2        ;
       move.l #lenght-buffer,d3 ;  Write() in file
       jsr -$30(a6)             ;

       move.l conhandle,d1      ;
       jsr -$24(a6)             ;  Close() file

       move.l DosBase,a1        ;
       move.l 4,a6              ;  Close dos.library
       jsr -$19e(a6)            ;  CloseLibrary()

       rts                      ;  ret ;)

filename: dc.b "work:lalalal",0
DosName : db.b "dos.library",0
       even
DosBase : dc.l 0
conhandle : dc.l 1
buffer : dc.b "***"
lenght:
       even
end

;---EOF----------------------------------------------------------------------

После некоторой вводной части можно ознакомится с классиком жанра, а именно с вирусом имя которому Byte Bandit. Вот как его характеризует Computer Virus Catalog 1.2:

;—————————————————————————-

                ==== : BYTE BANDIT (Сентябрь 17, 1989) ====

Вход.......................:  BYTE BANDIT
Алиас(ы)...................:  ---
Тип вируса.................:  BYTE BANDIT
Когда обнаружен вирус......:  Январь 1988
                  где......:  Елмшорн, ФРГ
Классификация..............:  Системный вирус (bootblock), резидент
Размер вируса..............:  1. Размер файла : 1024 байта
                              2. Размер в RAM : 1024 байта

Операционная система(ы)....:  Amiga-Dos
Версия/Релиз...............:  1.2/33.166, 1.2/33.180 и 1.3/34.20
Модель(и) компьютера.......:  AMIGA 500, AMIGA 1000, AMIGA 2000A, AMIGA 2000B
                              (И только с расширением памяти $0C000000 типа)

Идентификация..............:  Текст: 'Virus by Byte   Bandit in  9.87.
                                      Number of       copys :'

Тип инфекции...............:  Метод само-идентификации: ---
                              Инфекция системы: RAM резидент, reset резидент,
                              bootblock

Триггер инфекции...........:  reset (CONTROL + Left-AMIGA + Right-AMIGA)
                              операция: любой доступ к диску

Действие на носителях......:  только floppy диски (3.5'' и 5.25'')

Перехват прерываний........:  vertical blank interupt

Повреждения................:  Постоянное повреждение: Перезапись bootblock
                              Неризедентное повреждение: "обработка" буфера
                              экрана:
                              Экран иногда становится темным , клавиатура
                              начинает сбоить. От этого можно избавиться
                              путем нажатия специальной комбинации : LEFT-ALT
                              + LEFT-AMIGA ( на более новых амигах COMMODORE
                              клавиша) + SPACE + RIGHT-AMIGA + RIGHT ALT (но
                              сам вирус все равно остается активным)

Аварийный триггер..........:  Постоянное повреждение: reset
                                           операция: любой доступ к диску
                              Неризедентное повреждение:только при следующем:
                              либо 2 reset'a , либо 6 инфекций ,либо 5208 вы-
                              полнений прерывания "Бандита".

Сведения...................:  Использует StartIOVector других резидентных
                              программ использующих системный резидентный
                              список (KickTagPointer, KickMemPointer) вы-
                              рубается по счетчику копий : 19 слов.

;—EOF———————————————————————-

Вирус использует trackdisk.device и dos.library.

Что такое trackdisk.device? Вообще любой *.device выполняет функцию драйвера устройства. trackdisk.device обслуживает странное блочное устройство имя которому Дисковвод! Ниже указан набор команд используемый этим девайсом:

trackdisk.device/CMD_CLEAR
trackdisk.device/CMD_READ
trackdisk.device/CMD_UPDATE
trackdisk.device/CMD_WRITE
trackdisk.device/TD_ADDCHANGEINT
trackdisk.device/TD_CHANGENUM
trackdisk.device/TD_CHANGESTATE
trackdisk.device/TD_EJECT
trackdisk.device/TD_FORMAT
trackdisk.device/TD_GETDRIVETYPE
trackdisk.device/TD_GETGEOMETRY
trackdisk.device/TD_GETNUMTRACKS
trackdisk.device/TD_MOTOR
trackdisk.device/TD_PROTSTATUS
trackdisk.device/TD_RAWREAD
trackdisk.device/TD_RAWWRITE
trackdisk.device/TD_REMCHANGEINT
trackdisk.device/TD_SEEK
trackdisk.device/CMD_CLEAR

Скажем TD_FORMAT форматирует дорогу, TD_MOTOR — «играет» с мотором, CMD_READ — читает и т.д.

Что делает Byte Bandit — берет DoIO() вектор и …

Что такое DoIO()? Это функция exec.library, которая как я говорил постоянно открыта (библиотека). Функция эта выполнят как бы 2 функции. Первая из которых это SendIO() — запускает операцию, а управление задаче породившей вызов функции, немедленым образом возвратится. Вторая из них это функция все того же exec.library — WaitIO() — не возвращает управление задаче пока, операция не сделает своих дел. В итоге DoIO() выполняет операцию, а управление задаче возвращает только по завершению операции.

Так вот. Byte Bandit — переназначает на себя DoIO() вектор. Т.е.копируется в первый ханк, и ставит указатель на себя. (Файл на амиге разбит на различные сегменты, которые называются «ханки», например: Hunk_Header — заголовок, Hunk_Code — непосредственно исполняемый код, Hunk_Name, Hunk_unit, Hunk_bss, etc). Он остается в памяти не Capture вектором, а «резидентным модулем». Резидентная структура создается такой, чтобы обойти «теплую» перезагрузку. Вирь следит за каждым вставленным диском, результат чего можно наблюдать в каждом boot block’e диска. В итоге после одного сеанса с тачкой вы можете зарабатывать кучу денег, показывая свой зоопарк. Также вирус использует прерывание для краха системы каждые 5 минут (или около того). VirusX (надо сказать это такой амижный анти-вирус by Steve Tibbett) не может перезаписать boot block (надо вначале его получить из RAM). Как я уже сказал для работы с дисковводом используется trackdisk.device, а для рутинной работы dos.library.

Что представляет из себя dos.library? Это библиотечка (как я думаю уже было понятно из выше накорябанного исходника) ответственненая за работу с файлами, консолями, форматированием, файловыми системами (в общем чем не 21h) Для примера несколько функций dos.library из автодок:

dos.library/Cli
dos.library/Format
dos.library/VFWritef
dos.library/VPrintf
dos.library/WaitForChar
dos.library/WaitPkt
dos.library/Rename
dos.library/Open
dos.library/Read
dos.library/Seek

Скажем Format() — Quick format, WaitPkt() — работа с Dos-пакетами и т.д.

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

p.s. А кого на серьезном уровне заинтересовала эта платформа и программирование под нее, советую взять первые выпуски PowerAmiga, доку RDC (Дениса Сотченко) — «Программирование под AmigaOS для начинающих» и Guru Book.

(с) MadCr



©2013 Журнал Хакера Entries (RSS) and Comments (RSS)