Учу асм по рассылке Олега Калашникова дошел до темы написание вируса скачал файл приложение (исходник) сижу созерцаю... что-то понимаю что-то нет. Вот дошел до куска кода следующего содержания: Init: mov es,Seg_move ;ES - сегмент куда будем помещать код вируса, mov di,100h ;DI - смещение. mov cx,offset Finish-100h ;cx - количество передаваемых байт ;cx = конец нашего вируса - 100h (PSP) ;Т.е. CX = длинна нашего вируса в байтах mov si,100h ;DS:SI откуда перемещать будем rep movsb ;Перебрасываем нашу программу в область 7 видеостраницы Первые 3 строки понятно сегмент:смещение 7 видеостраницы а вот остальные не понял что то особенно 4 строку объясните попонятней кто знает. monaliza.nxt.ru/13.rar - исходник (кодировка DOS. far просматривает нормально)
судя по всему это COM програма, она состоит из 1 сегмента и начинает выполнение с адреса 100h байт т.к. в этом сегменте содержится все необходимое для программы. этот кусок кода скопирует Finish-100h байт из ds:si в es:di т.е. весь программный (при условии что Finish стоит в конце программы, если нет, то с начала и до Finish) код из сегмента программы в область 7 видеостраницы. т.е. mov si, 100h эквивалентно lea si, Begin, которая должна стоять в начале программы (но эту lea, поле компиляции, компилятор же и заменит на mov si, 100h). Если только запутал - пишите
SI = 100h если флаг CLD процессора сброшен: Код (Text): 1) скопировать байт из памяти по адресу DS:SI в ES:DI 2) увеличить SI и DI на 1 3) CX не равен 0 ? 4) да - jmp 1. нет - продолжить выполнение отсюда если флаг CLD процессора установлен: Код (Text): 1) тоже 2) уменьшить SI и DI на 1 3) тоже 4) тоже
то есть, флаг процессора называется не CLD, а DF CLD - это инструкция, позволяющая сбросить этот флаг в 0. Более подробно см. Intel 64 and IA-32 Arcitectures Software Developer's Manual. Volume 2B: Instruction Set Reference, N-Z.
max7C4 тобиш выглядеть вот это (mov cx,offset Finish-100h ) будет так: программа будет смотреть где метка 'Finish equ $ ' и что надо все что находиться между ней и смещением 100h переслать куда задано?
Ещё небольшой вопрос )) начал тут эксперементировать и надо мне сделать задержку на некоторое время (в паскале например есть функция delay(на сколько задержаться в милисекундах) ) подскажите кто знает как это организовать.
Coolzoom Задержка примерно на 40мСек под DOS Код (Text): mov ah,0 int 1Ah; get time, return in cx:dx clock count mov bx,dx a1: mov ah,0 int 1Ah cmp bx,dx jnz a1 Под Windows используется api-функция Sleep(t) где t - время в миллисекундах
Еще задержку можно сделать на основе интегрированного в мат.плату таймера, если считать, что прерывание таймера вызывается 18.2 раз с секунду.
Есть функция QueryPerformanceFrequency(&counter), более точная, но и у ней погрешность около 2мс на моём компьютере.