Семантический анализ структуры EXE файла и дисассемблер (с примерами и исходниками), вирусология

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

Для того чтобы скачать эту работу.
1. Подтвердите что Вы не робот:
2. И нажмите на эту кнопку.
закрыть



оманды:

110706040200OFSFZFAFPFCFrrrrrrПрименение:
Команда add используется для сложения двух целочисленных операндов. Результат сложения помещается по адресу первого операнда. Если результат сложения выходит за границы операнда приемник (возникает переполнение), то учесть эту ситуацию следует путем анализа флага cf и последующего возможного применения команды adc. Например, сложим значения в регистре ax и области памяти ch. При сложении следует учесть возможность переполнения.

 

О б ъ е к т н ы й к о д (три формата):

 

Регистр плюс регистр или память:

|000000dw|modregr/rm|

Регистр AX (AL) плюс непосредственное значение:

|0000010w|--data--|data, если w=1|

Регистр или память плюс непосредственное значение:

|100000sw|mod000r/m|--data--|data, если BW=01|

 

 

CALL

(CALL)

Вызов процедуры или задачи

Схема команды:call цельНазначение:

  • передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата;
  • переключение задач.

Алгоритм работы:
определяется типом операнда:

  • метка ближняя в стек заносится содержимое указателя команд eip/ip и в этот же регистр загружается новое значение адреса, соответствующее метке;
  • метка дальняя в стек заносится содержимое указателя команд eip/ip и cs. Затем в эти же регистры загружаются новые значения адресов, соответствующие дальней метке;
  • r16, 32 или m16, 32 определяют регистр или ячейку памяти, содержащие смещения в текущем сегменте команд, куда передается управление. При передаче управления в стек заносится содержимое указателя команд eip/ip;
  • указатель на память определяет ячейку памяти, содержащую 4 или 6-байтный указатель на вызываемую процедуру. Структура такого указателя 2+2 или 2+4 байта. Интерпретация такого указателя зависит от режима работы микропроцессора:

Состояние флагов после выполнения команды (кроме переключения задачи):

выполнение команды не влияет на флагиПри переключении задачи значения флажков изменяются в соответствии с информацией о регистре eflags в сегменте состояния TSS задачи, на которую производится переключение.
Применение:
Команда call позволяет организовать гибкую и многовариантную передачу управления на подпрограмму с сохранением адреса точки возврата.

 

О б ъ е к т н ы й к о д (четыре формата):

 

Прямая адресация в сегменте:

|11101000|disp-low|diep-high|

Косвенная адресация в сегменте:

|11111111|mod010r/m|

Косвенная адресация между сегментами:

|11111111|mod011r/m|

Прямая адресация между сегментами:

|10011010|offset-low|offset-high|seg-low|seg-high|

 

 

CMP

(CoMPare operands)

Сравнение операндов

Схема команды:cmp операнд1,операнд2Назначение: сравнение двух операндов.

Алгоритм работы:

  • выполнить вычитание (операнд1-операнд2);
  • в зависимости от результата установить флаги, операнд1 и операнд2 не изменять (то есть результат не запоминать).

Состояние флагов после выполнения команды:

110706040200OFSFZFAFPFCFrrrrrrПрименение:
Данная команда используется для сравнения двух операндов методом вычитания, при этом операнды не изменяются. По результатам выполнения команды устанавливаются флаги. Команда cmp применяется с командами условного перехода и командой установки байта по значению setcc.

О б ъ е к т н ы й к о д (три формата):

 

Регистр или память с регистром:

|001110dw|modregr/m|

Непосредственное значение с регистром AX (AL):

|0011110w|--data--|data, если w=1|

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

|100000sw|mod111r/m|--data--|data, если sw=0|

 

 

DEC

(DECrement operand by 1)

Уменьшение операнда на единицу

Схема команды:dec операндНазначение: уменьшение значения операнда в памяти или регистре на 1.

Алгоритм работы:
команда вычитает 1 из операнда. Состояние флагов после выполнения команды:

1107060402OFSFZFAFPFrrrrrПрименение:
Команда dec используется для уменьшения значения байта, слова, двойного слова в памяти или регистре на единицу. При этом заметьте то, что команда не воздействует на флаг cf.

О б ъ е к т н ы й к о д (два формата):

 

Регистр: |01001reg|

Регистр или память: |1111111w|mod001r/m|

 

 

DIV

(DIVide unsigned)

Деление беззнаковое

Схема команды:div делительНазначение: выполнение операции деления двух двоичных беззнаковых значений.

Алгоритм работы:
Для команды необходимо задание двух операндов делимого и делителя. Делимое задается неявно и размер его зависит от размера делителя, который указывается в команде:

  • если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток в ah;
  • если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток в dx;
  • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток в edx.

Состояние флагов после выполнения команды:

110706040200OFSFZFAFPFCF??????Применение:
Команда выполняет целочисленное деление операндов с выдачей результата деления в виде частного и остатка от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.

 

О б ъ е к т н ы й к о д:

 

|1111011w|mod110r/m|

 

INT

(INTerrupt)

Вызов подпрограммы обслуживания прерывания

Схема команды:int номер_прерыванияНазначение: вызов подпрограммы обслуживания прерывания с номером прерывания, заданным операндом команды.

Алгоритм работы:

  • записать в стек регистр флагов eflags/flags и адрес возврата. При записи адреса возврата вначале записывается содержимое сегментного регистра cs, затем содержимое указателя команд eip/ip;
  • сбросить в ноль флаги if и tf;
  • передать управление на программу обработки прерывания с указанным номером. Механизм передачи управления зависит от режима работы микропроцессора.

Состояние флагов после выполнения команды:

0908IFTF00Применение:
Как видно из синтаксиса, существуют две формы этой команды:

  • int 3 имеет свой индивидуальный код операции 0cch и занимает один байт. Это обстоятельство делает ее очень удобной для использования в различных программных отладчиках для установки точек прерывания путем подмены первого байта любой команды. Микропроцессор, встречая в последовательности команд команду с кодом операции 0cch, вызывает программу обработки прерывания с номером вектора 3, которая служит для связи с программным отладчиком.
  • Вторая форма команды занимает два байта, имеет код операции 0cdh и позволяет инициировать вызов подпрограммы обработки прерывания с номером вектора в диапазоне 0255. Особенности передачи управления, как было отмечено, зависят от режима работы микропроцессора.

О б ъ е к т н ы й к о д (два формата):

 

Регистр: |01000reg|

Регистр или память: |1111111w|mod000r/m|

 

JCC
JCXZ/JECXZ

(Jump if condition)

(Jump if CX=Zero/ Jump if ECX=Zero)

Переход, если выполнено условие

Переход, если CX/ECX равен нулю

Схема команды:jcc метка
jcxz метка
jecxz меткаНазначение: переход внутри текущего сегмента команд в зависимости от некоторого условия.


Алгоритм работы команд (кроме jcxz/jecxz):
Проверка состояния флагов в зависимости от кода операции (оно отражает проверяемое условие):

  • если проверяемое условие истинно, то перейти к ячейке, обозначенной операндом;
  • если проверяемое условие ложно, то передать управление следующей команде.

Алгоритм работы команды jcxz/jecxz:
Проверка условия равенства нулю содержимого регистра ecx/cx:

  • если проверяемое условие истинно, то есть содержимое ecx/cx равно 0, то перейти к ячейке, обозначенной операндом метка;
  • если проверяемое условие ложно, то есть содержимое ecx/cx не равно 0, то передать управление следующей за jcxz