;▄▄                   ▄
;▀▀▀ STEALTH GROUP WW █ Mail:   BOX 15, 125080 MOSCOW   ████████ █████████ █▀▀█
;▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀   ┌─┐┬ ┬┌─┤┬ ┬ ╥ ┬┐┌ █▄▄█
; ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█   ▌ █ ▄▀█ █ ▄▀▀ █▄▄    ├┬┘│ │└─┐├─┤   │└┤ ▄  █
;  █ █ █ █▀  █▀  █    █  █▀  █ █   █ █ █ █ █ █   █      ┴└─└─┘└─┘┴ ┴   ┴ ┴ ▀▀▀▀
;  █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀    ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄   ████  WINTER ' 96  ████
;  ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ███████████████████████
;
;    █████████████ ЧТЕНИЕ С ВИНЧЕСТЕРА С ПОМОЩЬЮ ПОРТОВ ██████████████ 
       
;Представляю вашему вниманию две статьи из австралийского журнала VLAD.
;Чтение и запись секторов напрямую через порты.
;Очень полезная вещь, особенно для любителей записываться в MBR.
;Опция "Virus Warning"  в CMOS иногда (специально редко кто догадывается
;ее включать, несмотря на то, что это практически непреодолимая преграда
;для записи в MBR) бывает включенной, и при записи на экран выскакивает
;этот самый Ворнинг с вопросом "Разрешить или запретить запись?" Естессно,
;на английском, из-за чего боящиеся перечить компьютеру отвечают "Yes" -
;единственное знакомое для них слово в этом окошке, однако, если юзер знает,
;то вирусу вашему пришел конец. 
;"Virus Warning" легко снять (процедуры для снятия см. в предыдущих выпусках 
;нашего журнала), однако запись через порты позволяет это сделать короче и
;и без лишнего геммороя. AWARD даже и не пикнул. Все AMIшные и AWARDовские
;навороты летят ко всем ЕБН. Читайте и пользуйтесь. Сам возьму это на воору-
;жение, надоело снимать Virus Warning.
; Процедура тестировалась на нескольких IDE винтах,
; другие типы винтов тестирование не проходили (я также тестировал. LG)
;							LovinGOD.

;       Чтение с винчестера через порты!
;       +-------------------------------+   by qark
;
;
;  На эту работу у меня ушли месяцы, и теперь вы можете писать свой вирус в 
;  загрузочный сектор и никакие резидентные сторожа и BIOS не смогут вам
;  в этом помешать. Мы разговариваем с винчестером напрямую, без обвешанных
;  проверками обработчиков прерываний.
;
;  Данная программа работает только для 286 и выше (здесь используюется
;  комманда INSB/W)
;
;  Техническая информация по портам:
;      Порт   Чтение/запись   Описание
;     ------  ------------- -------------------------------------------------
;       1f0       r/w       регистр данных, сюда пишутся/читаются байты
;       1f1       r         регистр ошибки (для себя вы можете просмотреть их)
;       1f2       r/w       счетчик секторов, кол-во секторов для чтения
;       1f3       r/w       номер сектора, начальный номер сектора the actual sector wanted
;       1f4       r/w       нижняя часть значения дорожки, (0-1024)
;       1f5       r/w       верхняя часть значения дорожки; остальные более 1024
;       1f6       r/w       диск/головка 
;                              bit 7 = 1
;                              bit 6 = 0
;                              bit 5 = 1
;                              bit 4 = 0  выбор диска 0 
;                                    = 1  выбор диска 1
;                              bit 3-0    бит выбора головки
;       1f7       r         регистр статуса
;                              bit 7 = 1  контроллер выполняет комманду
;                              bit 6 = 1  диск готов
;                              bit 5 = 1  ошибка записи
;                              bit 4 = 1  поиск окончен
;                              bit 3 = 1  буфер сектора нуждается в обработке
;                              bit 2 = 1  чтение данных с диска откорректировано
;                              bit 1 = 1  индекс - установить каждое вращение в 1
;                              bit 0 = 1  предыдущая комманда закончилась ошибочно
;       1f7       w         регистр комманд
;                            комманды:
;                              50h форматировать дорожку
;                              20h читать сектора с попытками повторить
;                              21h ------""------ без попыток повторить
;                              22h читать длинный с попытками повторить
;                              23h ------""------ без попыток повторить
;                              30h читать сектора с попытками повтора
;                              31h читать сектора без попыток потвора
;                              32h читать длинный с попытками повтора
;                              33h читать длинный без попыток повтора
;
;  Большинство этого кода должно работать также на не-IDE жестких дисках.
;  Данный код предназначен для чтения, код для записи см. в следующей статье.

;-------------------------------------------------------------------------
; Заголовок программы:
  .model tiny
  .286
  .code
  org 100h
  start:
;------------------------------- сам код 
	mov     dx,1f6h         ;Порт выбора диска и головки
	mov     al,0a0h         ;Диск 0, головка 0
	out     dx,al

	mov     dx,1f2h         ;Порт счетчика секторов
	mov     al,1            ;Прочитать один сектор
	out     dx,al

	mov     dx,1f3h         ;Порт номера сектора
	mov     al,1            ;Прочитать сектор #1
	out     dx,al

	mov     dx,1f4h         ;Порт младшего значения циллиндра
	mov     al,0            ;Циллиндр 0
	out     dx,al

	mov     dx,1f5h         ;Порт старшего значения циллиндра
	mov     al,0            ;Остаток циллиндра 0 The rest of the cylinder 0
	out     dx,al

	mov     dx,1f7h         ;Коммандный порт
	mov     al,20h          ;Прочитать с попыткой повтора
	out     dx,al
still_going:
	in      al,dx
	test    al,8            ;Это значит, что буффер сектора требует его
				;обслужить
	jz      still_going     ;Не продолжать до тех пор, пока буффер сектора 
				;не будет готов.

	mov     cx,512/2        ;Один сектор /2
	mov     di,offset buffer
	mov     dx,1f0h         ;Порт данных - они приплывают сюда и уплывают 
				;отсюда
	rep     insw

;   ------

	mov     ax,201h         ;Читаем с помощью int13h для сравнения.
	mov     dx,80h
	mov     cx,1
	mov     bx,offset buffer2
	int     13h

	mov     cx,512
	mov     si,offset buffer
	mov     di,offset buffer2
	repe    cmpsb
	jne     failure
	mov     ah,9
	mov     dx,offset readmsg
	int     21h
	jmp     good_exit
failure:
	mov     ah,9
	mov     dx,offset failmsg
	int     21h
good_exit:
	mov     ax,4c00h        ;Выход из программы.
	int     21h

	readmsg db      'Буффера совпадают. Сектор прочитан успешно через порты.$'
	failmsg db      'Буффера не совпадают.$'

buffer  db      512 dup ('V')
buffer2 db      512 dup ('L')

  end start


; ─────────────────────────────────────────────────────────────────────────
; ──────────────── Remember Where You Saw This Phile First ────────────────
; ───────[=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]───────
; ─────────────────────────────────────────────────────────────────────────
