Сейчас на форуме: ==DJ==[ZLO], Magister Yoda, Rio, Dart Raiden, Alf (+4 невидимых) |
eXeL@B —› Основной форум —› Дизассемблирование кода |
Посл.ответ | Сообщение |
|
Создано: 24 октября 2004 06:39 · Личное сообщение · #1 Подскажите пожалуйста в таком вопросе Я копирую часть функции в отведенный участок памяти Если в нем встречаются команды относительного перехода, то мне надо их изменить на новые адреса Как по опкоду однозначно определить, что это команда перехода, какую она имеет длинну, изменить адрес и т.д. Спасибо |
|
Создано: 24 октября 2004 06:47 · Личное сообщение · #2 70 - 7F - короткие условные переходы 0F 80 - 0F 8F - длинные условные переходы EB - короткий jmp E9 - длинный jmp. E3 - jcxz, jecxz есть ещё почти неиспользуемые loop, loopz, loopnz, и.т.д. После команды перехода записывается 4-байтовое(или 1-байтовое, если переход короткий) смещение относительно адреса следующей за переходом инструкции. И вообще, если копируется код, то обычно условные переходы править не надо, они же относительные. |
|
Создано: 24 октября 2004 07:55 · Личное сообщение · #3 >> вообще, если копируется код, то обычно условные переходы >>править не надо, они же относительные именно относительные - код то не целиком, а если там переход на 30 байт, а я копирую только 10 - тоесть нитуда будет прыгать >>есть ещё почти неиспользуемые loop, loopz, loopnz, и.т.д. А целиком есть таблица переходов ? P.S. И еще - если короткие переходы придется пересчитывать, то надо будет раздвигать код и вставлять длинный переход. Или можно как-то по-другому ? |
|
Создано: 24 октября 2004 14:57 · Личное сообщение · #4 |
|
Создано: 24 октября 2004 19:47 · Личное сообщение · #5 zss пишет: если короткие переходы придется пересчитывать, то надо будет раздвигать код и вставлять длинный переход. Или можно как-то по-другому ? В некоторых случаях можно все переходы оставить как есть, и для вызова не рипнутого кода добавить длинные переходы - "трамплины"
|
|
Создано: 25 октября 2004 00:47 · Личное сообщение · #6 |
|
Создано: 25 октября 2004 02:16 · Личное сообщение · #7 Изменять короткие переходы не нужно. Когда ты скопируешь код в новое место, то они будут указывать куда-то вне рипнутого кода (но не далее как +127/-128 байт). В эти места и ставь NEAR JUMP. Если окажется, что 2 SHORT JUMP указывают в адреса, разница между которыми < 6 байт (NEAR JUMP не влезет), то ставь туда ещё один SHORT JUMP, указывающий на NEAR JUMP. На практике это всё IMHO проще, чем раздвигать код. |
eXeL@B —› Основной форум —› Дизассемблирование кода |