1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Самомодификация, или по стопам Еикара

Тема в разделе "WASM.A&O", создана пользователем _edge, 29 янв 2017.

  1. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    576
    Адрес:
    Russia
    Почитав https://blog.nintechnet.com/anatomy-of-the-eicar-antivirus-test-file/ , вдохновился созданием своего самомодифицирующегося кодеса, just for fun.

    (в помощь http://xor.pw/)

    Набросал сценарий,

    - выполняется первая команда, изменяет сама себя
    - вып. вторая команда, вторая изменяет сама себя, делая из себя 2 нопа
    - выполняется третья команда = джамп на первую
    - первая команда изменяет вторую
    - вторая изм. третью на int 20


    :)

    Как будем такое делать?

    Наш условный кодес:

    Код (ASM):
    1. @1:
    2. некие 2 байта команды первой
    3.  
    4. @2:
    5. некие два байта команды второй
    6.  
    7. @3:
    8. 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):
    1. .model tiny
    2. .code
    3. .radix 16
    4.  
    5. org 0100
    6.  
    7. stt:
    8.  
    9.  
    10. mov cx,0da26
    11.  
    12. mov bp,2a00
    13. mov dx,87a1
    14.  
    15. mov ax,9ca1
    16.  
    17. lea di,@1
    18. lea bx,@2
    19.  
    20. lea si,@3
    21.  
    22.  
    23.  
    24. @1:
    25. xor [di],bp
    26.  
    27. @2:
    28. xor [bx],dx
    29.  
    30. @3:
    31. jmp @1
    32.  
    33.  
    34. end stt
    35.  
    Скомпилированный код во вложении, пройдите его пошагово в отладчике.

    На вопросы "Почему dos?" и "Отсыпь?" отвечаю "Сделано ради лулзов!"
     

    Вложения:

    • FT8.zip
      Размер файла:
      178 байт
      Просмотров:
      158
    shufps и Mikl___ нравится это.
  2. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    576
    Адрес:
    Russia
    Вот досбокс, в папку Virtual можно подкладывать файлы, это рабочая папка.
    Стартовать через dn.bat

    В качестве отладчика AvpUtil

    https://yadi.sk/d/2HXdYybb34tCfk пароль 1
     
  3. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.543
    Адрес:
    г. Санкт-Петербург
    На современных архитектурах Intel такое вряд ли проканает, так как секция кода изначально защищена от записи.
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    473
    VirtualProtect в помощь, к тому же можно задать RWE атрибут для кода при компиляции.
     
  5. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    576
    Адрес:
    Russia
    На этапе загрузки-чтения MBR/BOOT, это 16-битный realmode, нет защиты памяти.
    Конечно, скажете, есть Uefi..
     
  6. Medstrax

    Medstrax Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    674
    Могу порекомендовать еще, чтобы модифицикация кода происходила только в кэше, с дальнейшим invd - и никаких следов памяти от реального выполненного кода))
     
  7. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    576
    Адрес:
    Russia
    Интересно. Информации не черкнете? Или хотя бы гугл-строки для поиска?
     
  8. Medstrax

    Medstrax Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    674
    Какую еще надо информацию? Модифицируешь код в WB-памяти и периодически выполняешь invd (естественно, уже после выполнения модифицированного кода), чтобы модифицированный код не успел сброситься в память.
     
    Mikl___ и _edge нравится это.
  9. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.543
    Адрес:
    г. Санкт-Петербург
    Знаю, что есть механизмы управления защитой памяти VirtualProtect, mprotect.
    Но для этого их сначала следует использовать, чтобы сделать код модифицируемым.

    И сделать приложение потенциально уязвимым к SMC. Не очень хорошая идея.
     
  10. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    473
    Не вижу проблемы в этом.
    Можно поподробней?
     
  11. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.543
    Адрес:
    г. Санкт-Петербург
    Согласен, проблем нет. Просто не будь это 16-разрядный код для DOS, то следовало бы в статье обязательно упомянуть об этом.

    SMC = Self Modifying Code. Снимая защиту со всей секции кода ради 1-2 мест, где надо выполнить самомодификацию, мы подвергаем в принципе всю секцию кода опасности самомодификации.
     
  12. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    473
    Спорно. К примеру предположим обратное, что секция защищена от записи - любая запись туда уже вызовет исключение, что в свою очередь является ошибкой (если это специально не планировалось). Если код ведет себя недетерминировано и может писать данные куда попало - это уже плохой код. В любом случае права доступа можно поменять после исполнения участка самомодифицирующегося кода (если этот участок работает один раз), а преимущество RWE секции в том что код восстановления прав может быть также зашифрован.
     
  13. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    576
    Адрес:
    Russia
    На вин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/

    Там забавный пример приведен со строковой командой, которая сама себя затирает. Но что-то не взлетает он у меня.
     
    Последнее редактирование: 30 янв 2017
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.132
    Адрес:
    Russia
    Подброшу и я немного "уличной" магии, надеюсь ТС не против

    Код (ASM):
    1.  
    2. org 100h
    3. use16
    4. xor word [0106h],06530h
    5. xor byte [bp-33h],010h
    6. xor word [0110h],0C0F4h
    7. xor bh,dl
    8. xor word [0118h],0AF89h
    9. xor sp,[bp+03]
    10. xor word [0127h],01F13h
    11. xor word [011Bh],03C6Ah
    12. xor cl,-12h
    13. xor word [0136h],016A1h
    14. xor word [012Ah],03C6Ah
    15. xor bh,al  ;db 32h, 0f8h
    16. xor word [0144h],044C3h
    17. xor word [0138h],03C6Ah
    18. xor word [bx+di],0FFD4h
    19. xor word [0153h],0BB90h
    20. xor word [0147h],03C6Ah
    21. xor word [bp+di-56h],0EFE2h
    22. xor word [0164h],07E73h
    23. xor word [0158h],03C6Ah
    24. xor bp,[01B4h]
    25. xor word [0174h],0644Ch
    26. xor word [0168h],03C6Ah
    27. xor word [bp+si+58h],0CE74h
    28. xor word [0185h],0DCFFh
    29. xor word [0179h],03C6Ah
    30. xor bh,ah ;db 32h, 0fch
    31.  
    Это COM программа )
    Запускать в досе или в WinXP.
    Ну и это - там где я поставил комменты - обязательно проверьте чтоб компилятор команды скомпилировал именно теми опкодами - там могут быть другие ) Если фасм собирает другие опкоды = замените - это тоже ксоры с теми же регистрами, просто по другому закодированы.

    И да исходник этот автогенерируемый ) не подумайте, что я от нечего делать вычислял все эти числа.
    Ну и пользуясь случаем передаю огромный примет и спасибо Uri за идею )

    наслаждайтесь )
     
    Коцит, rococo795, Ronin_ и ещё 1-му нравится это.
  15. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    576
    Адрес:
    Russia
    Сэр, это безумие, сэр, но оно работает! )

    smc.JPG
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.132
    Адрес:
    Russia
    это опкоды неправильные у вас )) замените увидите красивее )
     
  17. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    237
    И размер такой душевный - 135 байт. :)
     
  18. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.132
    Адрес:
    Russia
    Вот еще немного "АДА" )))
    Сорец там ядерный ) просто скопирую вам HIEW дамп )
    Конечно результат работы намного тупее ) но - просто xor уже приелся. Не находите? :angel:

    Код (ASM):
    1.  
    2. sub         w,[0106],02A79 ;"*y"
    3. sub         [10CD],di
    4. sub         w,[0110],0B6C2 ;"╢┬"
    5. sub         dh,[bx][07A0]
    6. sub         w,[011A],052FB ;"R√"
    7. sub         al,052 ;"R"
    8. sub         w,[0122],027FA ;"'·"
    9. sub         bp,ax
    10. sub         w,[012A],03C6F ;"<o"
    11. sub         [di][00],al
    12. sub         w,[0139],03E70 ;">p"
    13. sub         w,[012D],02396 ;"#Ц"
    14. sub         ax,[si][00]
    15. sub         w,[0148],0A073 ;"аs"
    16. sub         w,[013C],02396 ;"#Ц"
    17. sub         ax,000C1 ;" ┴"
    18. sub         w,[0157],076D9 ;"v┘"
    19. sub         w,[014B],02396 ;"#Ц"
    20. sub         si,cx
    21. sub         w,[0165],0A65A ;"жZ"
    22. sub         w,[0159],02396 ;"#Ц"
    23. sub         b,[bx],005 ;"♣"
    24. sub         w,[0174],0DF5A ;"▀Z"
    25. sub         w,[0168],02396 ;"#Ц"
    26. sub         b,[bx][si][45],002 ;"☻"
    27. sub         w,[0184],08E02 ;"О☻"
    28. sub         w,[0178],02396 ;"#Ц"
    29. sub         [0445],dl
    30. sub         w,[0194],0CF28 ;"╧("
    31. sub         w,[0188],02396 ;"#Ц"
    32. sub         ax,001D0 ;"☺╨"
    33. sub         w,[01A3],02400 ;"$ "
    34. sub         w,[0197],02396 ;"#Ц"
    35. sub         bx,005 ;"♣"
    36. sub         w,[01B2],07BE3 ;"{у"
    37. sub         w,[01A6],02396 ;"#Ц"
    38. sub         ax,0A4F1 ;"дё"
    39. sub         w,[01C1],010CD ;"►═"
    40. sub         w,[01B5],02396 ;"#Ц"
    41. sub         al,069 ;"i"
    42. sub         w,[01CF],02500 ;"% "
    43. sub         w,[01C3],02396 ;"#Ц"
    44. sub         sp,00140 ;"☺@"
    45. sub         w,[01DF],01F38 ;"▼8"
    46. sub         w,[01D3],02396 ;"#Ц"
    47. sub         w,[5885],0FFFF ;" "
    48. sub         w,[01F0],0B128 ;"▒("
    49. sub         w,[01E4],02396 ;"#Ц"
    50. sub         ax,020D1 ;" ╤"
    51. sub         w,[01FF],01F3A ;"▼:"
    52. sub         w,[01F3],02396 ;"#Ц"
    53. sub         w,[2985],0FFFF ;" "
    54. sub         w,[0210],0BFFB ;"┐√"
    55. sub         w,[0204],02396 ;"#Ц"
    56. sub         sp,[si][16CD]
    57. sub         w,[0220],03D98 ;"=Ш"
    58. sub         w,[0214],02396 ;"#Ц"
    59. sub         [bx][di],al
    В аттаче com программа
     

    Вложения:

    • sub_pal.zip
      Размер файла:
      369 байт
      Просмотров:
      149
  19. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    576
    Адрес:
    Russia
    Спасибо ) В первом исходнике - должно быть синим цветом, Fasm действительно неверно компилит.
     
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.623
    Я описал метод, модер удалил его и меня. Все остались довольны.