Сейчас на форуме: ==DJ==[ZLO], Magister Yoda, Rio, Dart Raiden, Alf (+4 невидимых)

 eXeL@B —› Основной форум —› Дизассемблирование кода
Посл.ответ Сообщение

Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 октября 2004 06:39
· Личное сообщение · #1

Подскажите пожалуйста в таком вопросе

Я копирую часть функции в отведенный участок памяти
Если в нем встречаются команды относительного перехода, то мне надо их изменить на новые адреса

Как по опкоду однозначно определить, что это команда перехода, какую она имеет длинну, изменить адрес и т.д.

Спасибо



Ранг: 40.0 (посетитель), 1thx
Активность: 0.030
Статус: Участник

Создано: 24 октября 2004 06:47
· Личное сообщение · #2

70 - 7F - короткие условные переходы
0F 80 - 0F 8F - длинные условные переходы

EB - короткий jmp
E9 - длинный jmp.
E3 - jcxz, jecxz

есть ещё почти неиспользуемые loop, loopz, loopnz, и.т.д.

После команды перехода записывается 4-байтовое(или 1-байтовое, если переход короткий) смещение относительно адреса следующей за переходом инструкции.

И вообще, если копируется код, то обычно условные переходы править не надо, они же относительные.



Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 октября 2004 07:55
· Личное сообщение · #3

>> вообще, если копируется код, то обычно условные переходы >>править не надо, они же относительные

именно относительные - код то не целиком, а если там переход на 30 байт, а я копирую только 10 - тоесть нитуда будет прыгать

>>есть ещё почти неиспользуемые loop, loopz, loopnz, и.т.д.
А целиком есть таблица переходов ?

P.S. И еще - если короткие переходы придется пересчитывать, то надо будет раздвигать код и вставлять длинный переход. Или можно как-то по-другому ?



Ранг: 40.0 (посетитель), 1thx
Активность: 0.030
Статус: Участник

Создано: 24 октября 2004 14:57
· Личное сообщение · #4

zss пишет:
P.S. И еще - если короткие переходы придется пересчитывать, то надо будет раздвигать код и вставлять длинный переход. Или можно как-то по-другому ?


Да, раздвигать придётся.

А целиком есть таблица переходов ?

jmp, jcc, call, loop, loopz, loopnz, опкоды смотри в мануалах интел или амд.



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 24 октября 2004 19:47
· Личное сообщение · #5

zss пишет:
если короткие переходы придется пересчитывать, то надо будет раздвигать код и вставлять длинный переход. Или можно как-то по-другому ?


В некоторых случаях можно все переходы оставить как есть, и для вызова не рипнутого кода добавить длинные переходы - "трамплины"

ripped_code:
jz short foo_trampoline
.........

foo_trampoline:
jz near foo

.........
;some_dll
foo:




Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 октября 2004 00:47
· Личное сообщение · #6

тоесть ты хочешь сказать, что после кода прописать переходы по нужным адресам, а на них оставить измененные короткие переходы ?



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 25 октября 2004 02:16
· Личное сообщение · #7

Изменять короткие переходы не нужно.
Когда ты скопируешь код в новое место, то они будут указывать куда-то вне рипнутого кода (но не далее как +127/-128 байт).
В эти места и ставь NEAR JUMP.
Если окажется, что 2 SHORT JUMP указывают в адреса, разница между которыми < 6 байт (NEAR JUMP не влезет), то ставь туда ещё один SHORT JUMP, указывающий на NEAR JUMP.
На практике это всё IMHO проще, чем раздвигать код.


 eXeL@B —› Основной форум —› Дизассемблирование кода
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати