Вопрос по асму под дос по рассылке Олега Калашникова

Тема в разделе "WASM.BEGINNERS", создана пользователем Coolzoom, 25 сен 2009.

  1. Coolzoom

    Coolzoom New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2009
    Сообщения:
    5
    Учу асм по рассылке Олега Калашникова дошел до темы написание вируса скачал файл приложение (исходник) сижу созерцаю... что-то понимаю что-то нет. Вот дошел до куска кода следующего содержания:

    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 просматривает нормально)
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    судя по всему это COM програма, она состоит из 1 сегмента и начинает выполнение с адреса 100h байт т.к. в этом сегменте содержится все необходимое для программы.
    этот кусок кода скопирует Finish-100h байт из ds:si в es:di т.е. весь программный (при условии что Finish стоит в конце программы, если нет, то с начала и до Finish) код из сегмента программы в область 7 видеостраницы. т.е. mov si, 100h эквивалентно lea si, Begin, которая должна стоять в начале программы (но эту lea, поле компиляции, компилятор же и заменит на mov si, 100h). Если только запутал - пишите
     
  3. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    SI = 100h

    если флаг CLD процессора сброшен:
    Код (Text):
    1.    1) скопировать байт из памяти по адресу DS:SI в ES:DI
    2.    2) увеличить SI и DI на 1
    3.    3) CX не равен 0 ?
    4.    4) да - jmp 1. нет - продолжить выполнение отсюда
    если флаг CLD процессора установлен:
    Код (Text):
    1.    1) тоже
    2.    2) уменьшить SI и DI на 1
    3.    3) тоже
    4.    4) тоже
     
  4. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    то есть, флаг процессора называется не CLD, а DF
    CLD - это инструкция, позволяющая сбросить этот флаг в 0.

    Более подробно см. Intel 64 and IA-32 Arcitectures Software Developer's Manual.
    Volume 2B: Instruction Set Reference, N-Z.
     
  5. Coolzoom

    Coolzoom New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2009
    Сообщения:
    5
    max7C4
    тобиш выглядеть вот это (mov cx,offset Finish-100h ) будет так: программа будет смотреть где метка 'Finish equ $ ' и что надо все что находиться между ней и смещением 100h переслать куда задано?
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну если с флагами все в порядке, то да.
     
  7. Coolzoom

    Coolzoom New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2009
    Сообщения:
    5
    спасибо за помощь :)))
     
  8. Coolzoom

    Coolzoom New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2009
    Сообщения:
    5
    Ещё небольшой вопрос :))) начал тут эксперементировать и надо мне сделать задержку на некоторое время (в паскале например есть функция delay(на сколько задержаться в милисекундах) ) подскажите кто знает как это организовать.
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Coolzoom
    Задержка примерно на 40мСек под DOS
    Код (Text):
    1.       mov ah,0
    2.       int 1Ah; get time, return in cx:dx clock count
    3.       mov bx,dx
    4. a1: mov ah,0
    5.       int 1Ah
    6.       cmp bx,dx
    7.       jnz a1
    Под Windows используется api-функция Sleep(t) где t - время в миллисекундах
     
  10. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Еще задержку можно сделать на основе интегрированного в мат.плату таймера,
    если считать, что прерывание таймера вызывается 18.2 раз с секунду.
     
  11. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Только учти, что у Sleep() точность около 10мс.
     
  12. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Есть функция QueryPerformanceFrequency(&counter), более точная, но и у ней погрешность около 2мс на моём компьютере.