после копирования кода в трамплин надо пофиксить относительные адреса но некотрые нельзя даже с фиксацией пемещать вот тут список Код (Text): это вариации LOOP' E2 cb LOOP rel8 Decrement count; jump short if count ¹ 0 E1 cb LOOPE rel8 Decrement count; jump short if count ¹ 0 and ZF=1 E1 cb LOOPZ rel8 Decrement count; jump short if count ¹ 0 and ZF=1 E0 cb LOOPNE rel8 Decrement count; jump short if count ¹ 0 and ZF=0 E0 cb LOOPNZ rel8 Decrement count; jump short if count ¹ 0 and ZF=0 вот эти вроде тоже Код (Text): E3 cb JCXZ rel8 Jump short if CX register is 0 E3 cb JECXZ rel8 Jump short if ECX register is 0 а какие еще есть ?
Не совсем понятно, почему их нельзя перемещать? Их как раз можно перемещать, т.к. rel8 расширяется со знаком до размера rIP и прибавляется к rIP.
условимся что мы говорим о x32 вот например как оторвать эту инструкцию и перместить в трамплин loop metka она ведь всего -128 + 127 байт поддерживает прыжки а переместить надо намного дальше
А, в этом смысле. Ну, это код перестраивать надо, и тут многое от обстоятельств зависит. А насчет инструкций: jmp short: 0xEB Jcc: 0x70 - 0x7F
Jcc: 0x70 - 0x7F они же легко заменяются на их аналоги дальние instr + 0x10 << 8 | 0xF все и имеем отображение на Jcc rel8 <---> Jcc rel32 jmp short: 0xEB эта тоже EB на E9 с ними вот проблем нет изменил пофиксил адрес и все а вот такие как loop не имеют дальних аналогов вот и интересно было а какие еще команды не имеют дальних аналогов
впринципе да и так можно вообщем я оставил проверку только на jmp rel32 и call rel32 в прологе на остальное думаю можно забить
63F45EF45RB65R6VR "составные" команды вроде loop это вообще "пережиток старины", сейчас intel склонился в пользу risk архитектуры и сложные команды вроде loop оставил только для совместимости поэтому 'dec ecx'/'jnz XXXXXXXX' еще и быстрее чем loop будет работать.
63F45EF45RB65R6VR перенос loop задача не сложная: Код (Text): loop loop_continue jmp loop_end loop_continue: jmp loop_start гораздо интереснее если внутрь трамплина попадает цель перехода инструкций оставшихся на месте, хотя это наверно маловероятно.
Black_mirror Имеется ввиду вставка джампов после метки и после начала цикла? Смутная польза: Переносим loop в трамплин и делаем еще один трамплин из тела цикла? Лучше уж менять его на 'dec ecx'/'jnz XXXXXXXX'
punxer Я имел ввиду перенос самого loop, но если цель его перенесена в трамплин, то столько jmp'ов конечно не нужно. А c dec ecx как loope/loopne изобразить?
Black_mirror Я к тому что loop является обьектом переноса. Переносим его, а потом вставляем джампы и опять переносим уже тело цикла в другой трамплин итого два трамплина формируем. Вариант с loop меняется проще заменой на те инструкции. Про loope/loopne есть о чем подумать. И вариант со влрженными трамплинами имеет место быть
Вопрос как выполнить декремент до ноля не взволя тф И перепрыгнуть если ноль, не обращая внимания на тф)