Как изменить сегмент .code во время выполнения?

Я хочу написать программу, которая сможет изменять сам сегмент кода. например, рассмотрим этот ассемблерный код:

Исходный код:

i1: mov eax,0
i2: mov eax,0X01

результирующий код, который я хочу сделать во время выполнения тем же кодом:

i1: mov eax,0
i": // some modifing instructions that when are excuted they change the i2 and/or add or remove some instruction such i3
i2: jmp 0x32
i3: mov ebx,0x67 

вы видите, что i2 изменяется после выполнения инструкции (инструкций) i". i" обязан изменить свои инструкции кода переадресации.

Теперь мои вопросы:

  1. Как изменить сегмент кода? Или как адресовать область памяти сегмента кода?
  2. Можем ли мы изменить там тот же сегмент кода (а не другую программу, к которой у него нет доступа)?
  3. как мы можем решить проблемы, вызванные изменением размера сегмента кода?
  4. последняя проблема, возможно, это антивирусы! которые проверяют поведение программы во время выполнения и чувствительны к самомодификации.

Спасибо, друзья.


person Ali Adlavaran    schedule 24.02.2014    source источник
comment
1) записать в память. 2) Возможно. 3) Сложно, лучше изначально оставить пробел (вставить щедрые заглушки). 4) Подтвердить.   -  person Kerrek SB    schedule 24.02.2014
comment
Пожалуйста, добавьте соответствующие детали (ОС, ЦП) - это требует очень мало усилий.   -  person MSalters    schedule 24.02.2014
comment
Привет. Существует хорошее руководство по глубокому обучению, расположенное здесь: ic.unicamp.br/~pannain/mc404/aulas/pdfs/ . Страница 136 с главой 3.6.7 должна Вам помочь. Я делал это 5 лет назад.   -  person icbytes    schedule 24.02.2014
comment
на самом деле мы хотим пронзить самомодифицирующуюся программу, которая модифицирует свой исполняемый код. Детали ЦП или ОС не имеют значения, потому что нам просто нужно изменить код в любом случае. например, копирование конкретной инструкции в коде.   -  person Ali Adlavaran    schedule 25.02.2014
comment
@KerrekSB Как записать в память кода? и, второй вопрос: подумайте о ситуации, когда есть три инструкции без пробелов, и мы хотим добавить некоторые инструкции между ними. Как это сделать? Перенос инструкций по пересылке может занять много времени! а с другой стороны, для добавления прыжка в другое место снова требуется как минимум одна смена. так ...! Как вы справляетесь с этими проблемами? Спасибо.   -  person Ali Adlavaran    schedule 25.02.2014
comment
Если у вас нет места, это действительно сложно, потому что обычный код использует жестко заданные адреса и цели перехода. Вы можете вырезать больший фрагмент кода и переместить его в другое место, но проанализировать его, чтобы увидеть, нуждается ли он в исправлении, и заполнить дыру переходом к вашему собственному коду, который делает свое дело, а затем выполняет перемещенный исходный код. , а затем прыгает обратно. Все зависит от того, сколько работы вы хотите проделать и насколько злой хак вам нужно выполнить. Если это ваш собственный код, то вы должны просто перекомпилировать его с пробелами.   -  person Kerrek SB    schedule 25.02.2014


Ответы (1)


В 16-битном реальном режиме и режиме v86 мы можем просто записать в кодовый сегмент:

i1: inc bx         ; 43h = opcode of "INC BX"
    mov al,4Bh     ; 4Bh = opcode of "DEC BX"
    mov cs:[i1],al

Кортик

person Dirk Wolfgang Glomp    schedule 28.02.2014