Само модифицирующийся код.

Тема в разделе "WASM.BEGINNERS", создана пользователем Otebebe, 15 май 2007.

  1. Otebebe

    Otebebe New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2006
    Сообщения:
    91
    Покажите какие нибудь небольшие примеры,плиз....
    Спасибо.
     
  2. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    хм.. ну например:
    Код (Text):
    1. mov eax, 123h
    2. mov ebx, 987h
    3. xor eax, ebx
    4.  
    5. mov dword[$], 08EBD831h   ;  <-- Инструкция модифицирует сама себя.
    6. jmp $-10 ; Передаем управление на предыдущую инструкцию
    7. ret
    В результате eax будет равен не 8A4h, а по прежнему 123h, несмотря на то, что он вначале ксорится с 987h. Это происходит потому, что инструкция mov dword[$], 08EBD831h затирает сама себя байтами 08EBD831h, что представляет собой две инструкции:
    Код (Text):
    1. xor eax, ebx
    2. jmp $+8
    Они и ксорят еще раз eax на ebx, а как известно (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a
    Ну и далее перепрыгивается полузатертая инструкция, и исполнение кода продолжается как и должно было.
    P.S. Ну у тебя естественно должно стоять "section '.code' code readable writeable executable"
    P.P.S. Это под fasm. Под masm32 несколько сложнее с выбором опций линковки.
     
  3. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    в masm32 ключ линкера /SECTION:.text,ERW
     
  4. Otebebe

    Otebebe New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2006
    Сообщения:
    91
    mix_mix
    Cпасибо.
    Пример который я видел ранее тоже использует xor.
    Код (Text):
    1. mov cx,3
    2. _e:
    3.   mov di,offset tau
    4.  ;add di,cx
    5.  mov al,cs:[di]
    6.  xor al,01H
    7.   mov cs:[di],al
    8. loop _e
    9. tau: mov cx,0336H
    Т.е надо понимать это часто используемый конструктив ?
     
  5. Otebebe

    Otebebe New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2006
    Сообщения:
    91
    Дабы не плодить тем,спрошу в этом топике.
    Предположим я получил IVT(interrupt vector table) и знаю
    адрес 21H.Тогда я могу оформить любой int 21H в виде
    например:
    DB 9AH
    DB 45H
    DB 04H
    DB 0D9H
    DB 0EH
    Т.е можно "замутить" процедуру.
    Все бы здорово и работает,но не понятна одна вещь
    вызов функции 4СH.
    Куда будет возврат из ядра DOS если программы уже нет :)
     
  6. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Зачем?
    Вызывать DOS я так понял будешь по сохранённому адресу старого обработчика.? Тогда туда, откуда вызвал и вернётся.
     
  7. Otebebe

    Otebebe New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2006
    Сообщения:
    91
    mov AX,4C00H
    call DOS
    По 4С00H-"освобождает всю выделенную процессу память,закрывает все дескрипторы,
    из PSP восстанавливает векторы...."

    пусть
    DOS proc
    .....
    DB 9AH
    DB 45H
    DB 04H
    DB 0D9H
    DB 0EH
    ....
    ret
    DOS endp

    Т.е iret,a потом ret (так же вроде правильно описывать процедуры).Куда будет этот
    ret ?
     
  8. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Вообще перед CALL DOS надо сделать PUSHF - как и делает INT xx
    Только сейчас понял - из 4ch ведь возврата нет, то есть произойдёт передача управления в дочерний процесс (обычно тов. комманд.ком) который при следующем же вызове int 21 передаст управление неизвестно куда.
     
  9. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Otebebe
    Вот пример
    Код (Text):
    1.               mov eax,12345678h
    2.               call metka1
    3.               dd ?
    4. metka1:  pop edi
    5.             stosd
    Т.о. можно создать прогу, которая будеть базонезависима и самомодифицирующая себя.
     
  10. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Otebebe
    Да еще забыл - на современных процессорах используется предвыборка комманд, потому чтобы быть уверенным, что самомодифицирующийся код будет исполняться правильно необходимо исполнить после модификации любую инструкцию сериализации типа cpuid или mov eax,cr3 mov cr3,eax
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    PROFi
    Угу, а также автоматическое отслеживание записи в код, поэтому старые фокусы с предвыборкой как на 486 давно не прокатывают. К тому же P4 и атлоны, в отличие от P6, работают с преддекодированными инструкциями и поэтому щучат модификацию в окне до 1Кб от исполняемого в данный момент кода, отсюда и большие тормоза при самомодификации
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Otebebe
    Я так понимаю, человек подменяет прерывание 21h и тихо сваливает. Есть два выхода из этой ситуации.
    1) Воспользоваться эквивалентом Ah=4Ch /int 21h которых целых два 1) int 20h и 2) push 0 /ret, если что-то осталось в стеке или просто ret, если sp такое же как и при старте программы.
    2) Подменить прерывание 21h, перебросив его на какое-нибудь незадействованное, например на XXh, и выйти из программы по 4Ch int XXh
     
  13. Otebebe

    Otebebe New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2006
    Сообщения:
    91
    PROFi
    Код (Text):
    1.  
    2.              mov eax,12345678h
    3.               call metka1
    4.               dd ?
    5. metka1:  pop edi
    6.             stosd
    Что-то не могу проникнуться ...:-(.Ну перенесли содержимое EAX по адресу из ES:EDI...
    там где dd ? как мы туда попадем ? или мы не должны туда попасть а должны в какое-то др. место ?
    Или надо подразумевать что в EAX оп.код и мы скопировав его бросаемся к нему ?
    Сорри... :)
     
  14. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    показан пример самомодифицируещегося кода, необязательно туда будет вообще переход, но код сам себя модифицировал.
     
  15. Otebebe

    Otebebe New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2006
    Сообщения:
    91
    Mikl__
    Сейчас попытаюсь расказать чего хочу...:)
    Каждая прг. после старта имеет PSP.
    Пусть мы имеем примитивный обработчик прерывания.(для 1СH.его длина (у меня)~ 34H байта).
    Хочется скопировать его в PSP(c offset 80H ) и через 251СH "завести" его адрес в IVT.
    А потом из PSP-же (из обработчика ?( например через 3 секунды)) "выбросить" (4C00H) "инициализатора" (основную прг.)
    PSP есть.Прграммы нету. ТSR ?
    :)
     
  16. Otebebe

    Otebebe New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2006
    Сообщения:
    91
    Так и объясните в чём заключается модификация ....8-)
    Вот пример бесконечной модификации регистра АХ:
    ;----------------
    A:
    inc AX
    jmp A:
    ;----------------
    Но нужна ли такая бесконечность ?
     
  17. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Одно дело - модификация регистра, другое - модификация кода. Первое - это просто обычное исполнение кода (инструкций). Второе - изменение самих инструкций!!! Короче, вот тебе пример от Профи, тока измененный:
    Код (Text):
    1.   mov eax,12345678h
    2.   call metka1
    3.   mov ebx,0FFFFFFFFh
    4.   retn
    5. metka1:
    6.   pop edi
    7.   mov [edi+1],eax
    8.   call edi
    Т.е. изначально в третьей строке было mov ebx,0FFFFFFFFh, а после модификации станет mov ebx,12345678h. Т.е. ты по сути меняешь инструкцию mov (точнее ее операнд), а не сам регистр. В результате, код выполнится немного не так, как ВЫГЛЯДЕЛ с самого начала.
     
  18. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    ВОПРОС
    Куда это все применить можно!
    я вот эти коды смотрю смотрю...
    а зачем они нужны?
     
  19. Otebebe

    Otebebe New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2006
    Сообщения:
    91
    MSoft
    Гуд.Буду разбираться...сейчас.... устал.

    AndreyATC
    Для свободы.
     
  20. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    ну простейшее применение - оптимизация...
    вместо того чтобы песать
    Код (Text):
    1. asd dd ?
    2. mov [asd],ebx
    3. ...большой кусок кода
    4. mov eax,[asd]
    можно сделоть
    Код (Text):
    1. mov [asd+1],ebx
    2. ...большой кусок кода
    3. asd:
    4. mov eax,12345678h