Почитав https://blog.nintechnet.com/anatomy-of-the-eicar-antivirus-test-file/ , вдохновился созданием своего самомодифицирующегося кодеса, just for fun. (в помощь http://xor.pw/) Набросал сценарий, - выполняется первая команда, изменяет сама себя - вып. вторая команда, вторая изменяет сама себя, делая из себя 2 нопа - выполняется третья команда = джамп на первую - первая команда изменяет вторую - вторая изм. третью на int 20 Как будем такое делать? Наш условный кодес: Код (ASM): @1: некие 2 байта команды первой @2: некие два байта команды второй @3: jmp @1 Нужны ссылки на первую, на вторую, на джамп (т.е. на третью) - значения этих ссылок заталкиваем в di, bx, si .. Смотрим сценарий. Пойдем с конца. - вторая изм. третью на int 20 Джамп на первую = EB,FA (это третья команда) Xor'ом делаем из нее CD,20 Тогда значение для ксора = 26,DA <- кладем это значение в cx Это сделаем командой (которая вторая) XOR [SI],CX = 31,0C (SI указывает на третью команду, СХ это число для ксорки) .. - первая команда изменяет вторую Из 9090 (2х нопов) получить 31,0c это ксорить на a1,9c <- значение в ax это XOR [BX],AX, на которую прыгнет джамп в пункте сценария "- выполняется третья команда = джамп на первую" .. - вып. вторая команда, вторая изменяет сама себя, делая из себя 2 нопа С помощью XOR [bx],dx = 31,17 3117 xor 9090 = a187 <- кладем значение в DX .. - выполняется первая команда, изменяет сама себя Нужно первой командой из первой сделать XOR [BX],AX = 31,07 С помощью XOR [di],bp = 31,2D 31,2d xor 31,07 = 00,2a <- кладем это значение в BP .. Результат: Код (ASM): .model tiny .code .radix 16 org 0100 stt: mov cx,0da26 mov bp,2a00 mov dx,87a1 mov ax,9ca1 lea di,@1 lea bx,@2 lea si,@3 @1: xor [di],bp @2: xor [bx],dx @3: jmp @1 end stt Скомпилированный код во вложении, пройдите его пошагово в отладчике. На вопросы "Почему dos?" и "Отсыпь?" отвечаю "Сделано ради лулзов!"
Вот досбокс, в папку Virtual можно подкладывать файлы, это рабочая папка. Стартовать через dn.bat В качестве отладчика AvpUtil https://yadi.sk/d/2HXdYybb34tCfk пароль 1
На современных архитектурах Intel такое вряд ли проканает, так как секция кода изначально защищена от записи.
На этапе загрузки-чтения MBR/BOOT, это 16-битный realmode, нет защиты памяти. Конечно, скажете, есть Uefi..
Могу порекомендовать еще, чтобы модифицикация кода происходила только в кэше, с дальнейшим invd - и никаких следов памяти от реального выполненного кода))
Какую еще надо информацию? Модифицируешь код в WB-памяти и периодически выполняешь invd (естественно, уже после выполнения модифицированного кода), чтобы модифицированный код не успел сброситься в память.
Знаю, что есть механизмы управления защитой памяти VirtualProtect, mprotect. Но для этого их сначала следует использовать, чтобы сделать код модифицируемым. И сделать приложение потенциально уязвимым к SMC. Не очень хорошая идея.
Согласен, проблем нет. Просто не будь это 16-разрядный код для DOS, то следовало бы в статье обязательно упомянуть об этом. SMC = Self Modifying Code. Снимая защиту со всей секции кода ради 1-2 мест, где надо выполнить самомодификацию, мы подвергаем в принципе всю секцию кода опасности самомодификации.
Спорно. К примеру предположим обратное, что секция защищена от записи - любая запись туда уже вызовет исключение, что в свою очередь является ошибкой (если это специально не планировалось). Если код ведет себя недетерминировано и может писать данные куда попало - это уже плохой код. В любом случае права доступа можно поменять после исполнения участка самомодифицирующегося кода (если этот участок работает один раз), а преимущество RWE секции в том что код восстановления прав может быть также зашифрован.
На вин32, по всей видимости, может (будет?) мешать многоядерность процессора многозадачность ОС. нужно чтобы исполнение не прерывалось, отсыл к SetProcessorAffinity, ? Речь идет об аппаратном DEP, верно понимаю? (см. http://web.archive.org/web/20080327155809/http://www.insidepro.com/kk/063/063r.shtml, Достаточно лишь воткнуть последний Pentium-4 и обновить ядро, чтобы Windows могла задействовать новые аппаратные возможности, и тогда при попытке выполнения прикладного кода в куче, секции данных или на стеке возбуждается исключение) ох я все смешал в 1 кучу, исполнение данных vs запись в секцию кода ) .. В тему, http://wasm.in/forum/threads/kak-zapolnit-vsju-pamjat.25376/ Там забавный пример приведен со строковой командой, которая сама себя затирает. Но что-то не взлетает он у меня.
Подброшу и я немного "уличной" магии, надеюсь ТС не против Код (ASM): org 100h use16 xor word [0106h],06530h xor byte [bp-33h],010h xor word [0110h],0C0F4h xor bh,dl xor word [0118h],0AF89h xor sp,[bp+03] xor word [0127h],01F13h xor word [011Bh],03C6Ah xor cl,-12h xor word [0136h],016A1h xor word [012Ah],03C6Ah xor bh,al ;db 32h, 0f8h xor word [0144h],044C3h xor word [0138h],03C6Ah xor word [bx+di],0FFD4h xor word [0153h],0BB90h xor word [0147h],03C6Ah xor word [bp+di-56h],0EFE2h xor word [0164h],07E73h xor word [0158h],03C6Ah xor bp,[01B4h] xor word [0174h],0644Ch xor word [0168h],03C6Ah xor word [bp+si+58h],0CE74h xor word [0185h],0DCFFh xor word [0179h],03C6Ah xor bh,ah ;db 32h, 0fch Это COM программа ) Запускать в досе или в WinXP. Ну и это - там где я поставил комменты - обязательно проверьте чтоб компилятор команды скомпилировал именно теми опкодами - там могут быть другие ) Если фасм собирает другие опкоды = замените - это тоже ксоры с теми же регистрами, просто по другому закодированы. И да исходник этот автогенерируемый ) не подумайте, что я от нечего делать вычислял все эти числа. Ну и пользуясь случаем передаю огромный примет и спасибо Uri за идею ) наслаждайтесь )
Вот еще немного "АДА" ))) Сорец там ядерный ) просто скопирую вам HIEW дамп ) Конечно результат работы намного тупее ) но - просто xor уже приелся. Не находите? Код (ASM): sub w,[0106],02A79 ;"*y" sub [10CD],di sub w,[0110],0B6C2 ;"╢┬" sub dh,[bx][07A0] sub w,[011A],052FB ;"R√" sub al,052 ;"R" sub w,[0122],027FA ;"'·" sub bp,ax sub w,[012A],03C6F ;"<o" sub [di][00],al sub w,[0139],03E70 ;">p" sub w,[012D],02396 ;"#Ц" sub ax,[si][00] sub w,[0148],0A073 ;"аs" sub w,[013C],02396 ;"#Ц" sub ax,000C1 ;" ┴" sub w,[0157],076D9 ;"v┘" sub w,[014B],02396 ;"#Ц" sub si,cx sub w,[0165],0A65A ;"жZ" sub w,[0159],02396 ;"#Ц" sub b,[bx],005 ;"♣" sub w,[0174],0DF5A ;"▀Z" sub w,[0168],02396 ;"#Ц" sub b,[bx][si][45],002 ;"☻" sub w,[0184],08E02 ;"О☻" sub w,[0178],02396 ;"#Ц" sub [0445],dl sub w,[0194],0CF28 ;"╧(" sub w,[0188],02396 ;"#Ц" sub ax,001D0 ;"☺╨" sub w,[01A3],02400 ;"$ " sub w,[0197],02396 ;"#Ц" sub bx,005 ;"♣" sub w,[01B2],07BE3 ;"{у" sub w,[01A6],02396 ;"#Ц" sub ax,0A4F1 ;"дё" sub w,[01C1],010CD ;"►═" sub w,[01B5],02396 ;"#Ц" sub al,069 ;"i" sub w,[01CF],02500 ;"% " sub w,[01C3],02396 ;"#Ц" sub sp,00140 ;"☺@" sub w,[01DF],01F38 ;"▼8" sub w,[01D3],02396 ;"#Ц" sub w,[5885],0FFFF ;" " sub w,[01F0],0B128 ;"▒(" sub w,[01E4],02396 ;"#Ц" sub ax,020D1 ;" ╤" sub w,[01FF],01F3A ;"▼:" sub w,[01F3],02396 ;"#Ц" sub w,[2985],0FFFF ;" " sub w,[0210],0BFFB ;"┐√" sub w,[0204],02396 ;"#Ц" sub sp,[si][16CD] sub w,[0220],03D98 ;"=Ш" sub w,[0214],02396 ;"#Ц" sub [bx][di],al В аттаче com программа