2016-05-25 1 views
0

При замене более длинной инструкции на более короткую, мы можем просто надеть nop с.Замена короткими инструкциями толкателей на месте (монтаж)

Как мне сделать встроенную замену другого?

И inline Я имею в виду не jmp в какую-либо другую свободную память, а затем возвращаюсь.

Сказал другими словами, можно как-то вставить больше ops? Как это делается? Должен ли заголовок двоичного файла каким-то образом изменить? Что происходит со всеми операциями jmp (они будут продолжать работать после этого теоретического изменения?). А если есть абсолютные jmp s? Те также должны быть изменены, не так ли? Что еще нужно сделать (если это действительно возможно)?

+0

Какой компилятор вы используете? – zx485

+0

Это не имеет значения, поскольку вопрос теоретический, но я использовал https://www.onlinedisassembler.com/odaweb/, чтобы получить эти коды операций. – alexandernst

+2

Я написал код, чтобы сделать именно это в прошлом, но он был довольно сложным, поскольку мне приходилось писать базовый opcode dissasembler для идентификации и исправления ссылок. Я подошел к нему немного по-другому, но вместо добавления инструкций я выделил больше бара, скопировал ассемблер, который будет перезаписан инструкцией длинного перехода, а затем обновил все ссылки в моем скопированном ассемблере, чтобы он мог быть выполнен из нового местоположение (на лету PIC). Скачок был направлен на мой новый метод, который затем мог наследовать код старого метода, перепрыгнув на модифицированный сборщик, который я скопировал. – Geoffrey

ответ

2

Есть несколько проблем в игре здесь:

Всех типов простых прыжков, будь то условный (je, jne, и так далее) или безусловный (jmp), существует в двух формах, коротких и близких, где первый имеет подписанное смещение по размеру байта (диапазон от -128 до +127), а у последнего есть подписанное смещение размера слова (диапазон от -2147483648 до +2147483647).

Изменение условия при условном переходе не требует изменения размера перехода, но изменение целевого адреса прыжка может привести к тому, что желаемый целевой адрес будет за пределами допустимого диапазона.

Если вы хотите на самом деле изменить цель перехода на новое место, находящееся вне диапазона текущего типа перехода, или вставить дополнительные инструкции на сайт кода, вам нужно будет переместить код, который приходит после него.

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

Трудность такой операции идет от умеренно сложного к невозможному, в зависимости от того, насколько хорошо структурирован код и какая у вас информация.

Если код, о котором идет речь, был выпущен компилятором, и у вас есть доступная информация о символе, это может быть сделано, в противном случае это обычно очень сложно, если только требуемые изменения очень малы.

+0

Это отвечает на мой первоначальный вопрос (и подтверждает мои страхи). Кстати, знаете ли вы, знает ли IDA Pro это правильно? Как они это делают? – alexandernst

+0

Я не уверен, что вы подразумеваете под 'handles'. Я использовал IDA Pro только как дизассемблер - я смутно знаю, что у него есть некоторые возможности исправления, но я их не использовал. –

1

Если у вас есть машинные инструкции

A; B; C; D; E; 

и нужно заменить B с большим X, то вы можете удалить C, D и т.д., чтобы сделать достаточно места для прыжка.

Скажите C; D; достаточно большой. Итак, вы попали в

A; jmp freeSpace; back: E 
... 
<previous end of binary> 
freeSpace: X; C; D; jmp back; 

Это немного меняется, если сами С и/или D сами прыгают. Но вы всегда можете заставить его работать.

В тот же день я использовал это, чтобы исправить двоичный файл, где был доступен только лист бумаги. Не изящно, но отлично работает. Не удивительно, если это то, что делает Ida Pro.

+0

Действительно, я знал об этом решении. Это должно быть намного труднее, но он чувствует себя взломанным. – alexandernst

+0

@alexandernst Как я уже сказал, «Не изящный» ... – Gene

Смежные вопросы