Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

Игры настоящих кодеров

Shen (_shen_@mail.ru)

Спецвыпуск Xakep, номер #035, стр. 035-054-5


JMP 0, <-10

Да, такая маленькая, но крайне эффективная против Импов. Как же это работает? Ты, наверное, удивлен, почему у команды JMP вдруг появилось B-поле. Помнишь ситуацию с DAT, когда второй операнд задавал данные, а A-поле ничего не делало? Тут похожая ситуация, но сначала о знаке «<». Инструкция «<-10» уменьшает на единицу B-поле команды, находящейся на 10 инструкций раньше текущей. Таким образом, команда «JMP 0, <-10» каждый цикл выполняет сразу два действия: продолжает выполнять бесконечный цикл и уменьшает второй операнд некой инструкции, находящейся на 10 позиций раньше JMP. А какая инструкция находится там в случае чистого поля? Правильно, «DAT #0, #0». Значит, после первого цикла там будет уже «DAT #0, #-1», после второго – «DAT #0, #-2» и т.д. Вот это место и называется Gate (или ловушка). Все это очень интересно, но причем здесь Импы? Чтобы понять это, рассмотрим бой между Импом и Имполовкой (для краткости листингов предположим, что Имп и Имполовка расположены недалеко друг от друга - сути дела это не меняет):

Первый цикл (стрелкой обозначена инструкция, которую Имп будет выполнять следующей):

MOV 0, 1 ; <---

DAT #0, #0 ; здесь намечается создать ловушку

Второй цикл:

MOV 0, 1

MOV 0, 1 ; <---

DAT #0, #-1 ; здесь уже создана ловушка

Третий цикл (после хода Импа):

MOV 0, 1 ; здесь высадился Имп

MOV 0, 1

MOV 0, 1 ; <--- здесь была ловушка

На третьем цикле Имп переписывает собой ловушку. В свой черед JMP уменьшает B-поле ловушки на единицу. Но там же уже не ловушка, а Имп! А какая разница?

Третий цикл (после хода Имполовки):

MOV 0, 1 ; здесь высадился Имп

MOV 0, 1

MOV 0, 0 ; <--- JMP уменьшил B-поле MOV’а на единицу

Четвертый цикл (после хода Импа):

MOV 0, 1 ; здесь высадился Имп

MOV 0, 1

MOV 0, 0 ; здесь была ловушка

; <---

Имп выполняет команду «MOV 0, 0»: копирует эту команду на ее же место, т.е. вообще ничего не делает, но счетчик команд работает и следующая инструкция, которую выполнит Имп – данные, а не код - «DAT #0, #0»!

Четвертый цикл (после хода Имполовки):

MOV 0, 1 ; здесь высадился Имп

MOV 0, 1

MOV 0, -1 ; здесь была ловушка

; <---

На пятый цикл Имп пытается выполнить данные и погибает. Победа!

Адвансед

Как я уже говорил, изучив техники Imp, Dwarf и ImpGate, можно считать, что базовый курс Redcode и CoreWar пройден. Но помнишь, я говорил, что многие программы так или иначе используют принципы работы Импа, и даже называл одну из таких тактик – «Кольцо»? Тем, кто дочитал до этого места, я расскажу об этом самом «Кольце». И если Имп, Дварф и Имполовка были просто обучающими программами, то ImpRing – настоящий боевой модуль.

Новая команда – SPL. «SPL A» передает управление на адрес A (в точности как JMP A), но при этом продолжает выполнение следующей инструкции. Таким образом команда SPL (сокращение от Split – расщепить, разделить) создает новый процесс. Вот мы и добрались до программ со многими процессами! Классический пример, на котором обычно объясняют принцип работы SPL, выглядит так:

Назад на стр. 035-054-4  Содержание  Вперед на стр. 035-054-6