Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых) |
eXeL@B —› Программирование —› "Сдвиг" кода |
Посл.ответ | Сообщение |
|
Создано: 30 апреля 2006 22:07 · Личное сообщение · #1 Такой вот вопросец.. как можно без особых сложностей произвести "сдвиг" кода вида: было:
стало:
и чтобы адрес _label изменился в пуше на новый.. моя идея - взять весь код окромя нопов, попутно пересчитать адрес в пуше и т.п. и потом юзая асм-движок(я нашел только олькин и дде бай дероко) получить "байт-код" который записать куда уж надо ----- Тут не могла быть ваша реклама |
|
Создано: 30 апреля 2006 23:28 · Личное сообщение · #2 |
|
Создано: 30 апреля 2006 23:30 · Личное сообщение · #3 |
|
Создано: 30 апреля 2006 23:51 · Личное сообщение · #4 |
|
Создано: 01 мая 2006 00:06 · Личное сообщение · #5 |
|
Создано: 01 мая 2006 03:21 · Личное сообщение · #6 |
|
Создано: 01 мая 2006 10:34 · Личное сообщение · #7 Cigan пишет: Оригинально конечно но ты привел код и получил ответ а в итоге оказываеться что код другой. Я же написал %) lord_Phoenix пишет: "сдвиг" кода вида Мне же не именно такой код надо сдвинуть, я пример привел просто, сорри если сбил с толку.. А вообще по идее Гела надо сделать сначала таблицу push/jmp/call/etc. сдвинуть код, а потом уже смотря какие адреса сдвинулись - поправить команды, занесенные ранее в таблицу ----- Тут не могла быть ваша реклама |
|
Создано: 01 мая 2006 16:26 · Личное сообщение · #8 |
|
Создано: 01 мая 2006 18:16 · Поправил: lord_Phoenix · Личное сообщение · #9 Nimnul пишет: если jcc на код который внутри перемещаемого блока, тогда адрес пререщитывать не надо, тоже самое касается других команд, которые работают с относительными адресами. jmp _label
джамп править придеться, ибо был jmp $+3 а станет jmp $+2 ----- Тут не могла быть ваша реклама |
|
Создано: 01 мая 2006 20:01 · Поправил: Nimnul · Личное сообщение · #10 |
|
Создано: 01 мая 2006 20:51 · Личное сообщение · #11 Nimnul, че то я не вьехал полностью в твой последний пост %) Команда JMP передает управление из текущей процедуры в другую процедуру. Адрес процедуры указывается непосредственно в команде, в регистре или в ячейке памяти. Местоположение адреса определяет, интерпретируется ли адрес как относительный адрес или как абсолютный адрес. Относительный переход использует смещение (непосредственная константа, используемая при вычислении адреса) заданное в команде. Смещение имеет знак и длину (байт или двойное слово). Адрес назначения формируется путем сложения смещения и адреса, хранящегося в регистре EIP. После этого в регистре EIP будет содержаться адрес команды, которая должна выполняться после команды перехода. Абсолютный адрес. Абсолютный переход используется с 32-разрядным смещением одним из следующих способов : 1.Программа может выполнять переход по адресу в регистре общего назначения. Это 32-разрядное значение копируется в регистр EIP и выполнение продолжается. 2. Адресат назначения может быть переменной в памяти, указанной с использованием сдандартного режима адресации. Операнд копируется в регистр EIP и выполнение продолжается. ----- Тут не могла быть ваша реклама |
|
Создано: 01 мая 2006 21:07 · Поправил: Nimnul · Личное сообщение · #12 lord_Phoenix Ну так почитай внимательно то что ты привел из учебника . Относительный адрес это EIP + signed константа. а абсолютный это unsigned от 0 до ff ff ff ff. Поэтому команды относительный адрес которых не указывает за границу перемещаемого кода, править не надо. например:
----- have a nice day |
|
Создано: 01 мая 2006 21:20 · Личное сообщение · #13 Nimnul пишет: Поэтому команды относительный адрес которых не указывает за границу перемещаемого кода, править не надо. так бы сразу =) Nimnul пишет: джамп это команда которая работает с абсолютным адресом а не с относительным Местоположение адреса определяет, интерпретируется ли адрес как относительный адрес или как абсолютный адрес ----- Тут не могла быть ваша реклама |
|
Создано: 01 мая 2006 21:31 · Поправил: Nimnul · Личное сообщение · #14 Вобщем: EB - относительный E9 - абсолютный косвеный, переход в текущем сегменте FF - дальний абсолютный EA - дальний абсолютный Да к стати если адрес короткого перехода jcc находится за границей перемещаемого кода, то если расстояние больше 127 байт, эта команда должна вырости с двух до шести байт. те. 7x xx должен превратится в 0f 8x xx xx xx xx. Поэтому перемещать блоки, которые разрывают такие переходы не рекомендую . ----- have a nice day |
|
Создано: 01 мая 2006 21:36 · Личное сообщение · #15 |
eXeL@B —› Программирование —› "Сдвиг" кода |