/*-----------------------------------------------------------------------*/
 /*                       R I N G 0,    I S S U E   # 1                   */
 /*-----------------------------------------------------------------------*/

                          Пермутация это просто!

                                                            by GU // SBVC

  Значит  так,  объясняю  популярно:  за  этим будущее, причём ближайшее.
 Смысл предлагаемого варианта пермутации прост (как всё гениальное :)).

  1.  Берём  код,  предположим  без  замуток с JUMP'ами (обычно такой код
 делают стандартные компилеры).
  2. Дизасмим его по структуркам.
  3.  Делаем  табличку  меток  (по  адресу  в JUMP'е ищем команду в нашем
 списке структурок и её номер заносим в эту табличку).
  4.  У  нас  в  структурке  будет  инфа  о  том,  что  входит  в команду
 (регистры/флаги) и что она может изменить.
  5.  Если две рядом стоящие команды не имеют пересечения входа и выхода,
 то есть из первой не выходит то, что входит во вторую и первая не меняет
 то,  что  может потребоваться второй, то безболезненно меняем их местами
 (с  какой-то  вероятностью).  Это при условии, что на второй команде нет
 меток. Если метки есть на первой, то метка останется, изменится команда,
 на которую эта метка.
  6.  Мутируем  команды поотдельности, причём желательно, чтобы ничего не
 запортилось  лишнего.  (То  есть  регистры/флаги,  которые  не  являются
 выходом нельзя портить по ходу. Здесь нам помогут PUSH/POP :))
  7.  Когда  мы  мутировали,  мы  могли  писать структурками!, а не голым
 кодом.  Тогда можно одной процедуркой будет и собрать. (ясно, что то,что
 не понадобится при сборе заполнять не надо)
  8.  Настраеваем JUMP'ы в соответствии с изменившимися длинами команд по
 таблице меток.
  9. Собираем живой код.

  Это было описание примерных действий по простейшей пермутации.

  Что можно усложнить:
  А. менять местами команды не только рядом стоящие;
  Б. менять местами куски кода;
  В.  отслеживать не перекрываемый выход, то есть не надо будет сохранять
 те  регистры/флаги, которые, хотя в исходном коде не менялись, но дальше
 переписываются(перекрываются)/не используются (напр. EBP/DF и пр. редкие
 вещи);
  Г. сделать подробный список сопровых команд/флагов;
  Д. обрабатывать стек;
  Е. пытаться обратно сворачивать группы команд в одну;
  Ж. пытаться обрабатывать хитрые прыжки: не подряд дизасмить, а по метке
 после безусловных прыжков;
  З. бороться с процедурами;
  И. чего ещё придумаете.

  Пример.
1 MOV AX, DX ; in: DX            out: AX
2 MOV BX, AX ; in: AX            out: BX
3 MOV CX, DX ; in: DX            out: CX
4 ADD AX, DX ; in: DX, AX        out: AX, CF
5 ADD CX, BX ; in: BX, CX        out: CX, CF
6 SUB CX, DX ; in: DX, CX        out: CX, CF
7 MUL AL     ; in: AL            out: AX, flags
------------------------------------------------
 можно менять местами по нашему алгоритму:
 2<->3
 4<->5, а если их поменять, то можно будет менять дальше: 4<->6
 6<->7, а если их поменять, то можно будет менять дальше: 5<->7


                                                               08.11.2001