Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› "Сдвиг" кода
Посл.ответ Сообщение


Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 30 апреля 2006 22:07
· Личное сообщение · #1

Такой вот вопросец.. как можно без особых сложностей произвести "сдвиг" кода вида:

было:

push _label
nop
nop
nop
_label:
mov eax,1
nop
nop
ret


стало:

push label
_label:
mov eax,1
ret
nop
nop
nop
nop
nop

и чтобы адрес _label изменился в пуше на новый..
моя идея - взять весь код окромя нопов, попутно пересчитать адрес в пуше и т.п. и потом юзая асм-движок(я нашел только олькин и дде бай дероко) получить "байт-код" который записать куда уж надо

-----
Тут не могла быть ваша реклама




Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 30 апреля 2006 23:28
· Личное сообщение · #2

cld
mov ecx,LenCode
mov esi,_label
mov edi,_label-3
movsb

Я думаю что в жтом роде.




Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 30 апреля 2006 23:30
· Личное сообщение · #3

+ пересчитывание смещений jmp/jcc/call/push и т.д. и перемещение кода..

-----
Тут не могла быть ваша реклама




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

Создано: 30 апреля 2006 23:51
· Личное сообщение · #4

Если код именно такой, то дался тебе этот push, его вобще выкинуть можно, и преобразовать в
mov eax,1
ret
и пересчитывать ничего не надо.




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

Создано: 01 мая 2006 00:06
· Личное сообщение · #5

lord_Phoenix
тогда дизасмовый движок в руки и вперёд а зачем тебе нопы эти сдвигать?



Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 01 мая 2006 03:21
· Личное сообщение · #6

lord_Phoenix пишет:
+ пересчитывание смещений jmp/jcc/call/push и т.д. и перемещение кода

Оригинально конечно но ты привел код и получил ответ а в итоге оказываеться что код другой. Хм или я вообще ни черта не понял и задавай вопрос обдуманно.




Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 01 мая 2006 10:34
· Личное сообщение · #7

Cigan пишет:
Оригинально конечно но ты привел код и получил ответ а в итоге оказываеться что код другой.

Я же написал %)
lord_Phoenix пишет:
"сдвиг" кода вида

Мне же не именно такой код надо сдвинуть, я пример привел просто, сорри если сбил с толку..
А вообще по идее Гела надо сделать сначала таблицу push/jmp/call/etc. сдвинуть код, а потом уже смотря какие адреса сдвинулись - поправить команды, занесенные ранее в таблицу

-----
Тут не могла быть ваша реклама





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 01 мая 2006 16:26
· Личное сообщение · #8

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

-----
have a nice day





Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 01 мая 2006 18:16 · Поправил: lord_Phoenix
· Личное сообщение · #9

Nimnul пишет:
если jcc на код который внутри перемещаемого блока, тогда адрес пререщитывать не надо, тоже самое касается других команд, которые работают с относительными адресами.

jmp _label
nop
xor eax,eax
_label:
xor ebx,ebx

джамп править придеться, ибо был jmp $+3 а станет jmp $+2

-----
Тут не могла быть ваша реклама





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 01 мая 2006 20:01 · Поправил: Nimnul
· Личное сообщение · #10

джамп это команда которая работает с абсолютным адресом и с относительным. Заметь я говорил про команды с относительным адресом. Поэтому джампы придется править тогда когда они абсолютные.

-----
have a nice day





Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 01 мая 2006 20:51
· Личное сообщение · #11

Nimnul, че то я не вьехал полностью в твой последний пост %)
Команда JMP передает управление из текущей процедуры в другую процедуру. Адрес процедуры указывается непосредственно в команде, в регистре или в ячейке памяти. Местоположение адреса определяет, интерпретируется ли адрес как относительный адрес или как абсолютный адрес.

Относительный переход использует смещение (непосредственная константа, используемая при вычислении адреса) заданное в команде. Смещение имеет знак и длину (байт или двойное слово). Адрес назначения формируется путем сложения смещения и адреса, хранящегося в регистре EIP. После этого в регистре EIP будет содержаться адрес команды, которая должна выполняться после команды перехода.
Абсолютный адрес. Абсолютный переход используется с 32-разрядным смещением одним из следующих способов :
1.Программа может выполнять переход по адресу в регистре общего назначения. Это 32-разрядное значение копируется в регистр EIP и выполнение продолжается.
2. Адресат назначения может быть переменной в памяти, указанной с использованием сдандартного режима адресации. Операнд копируется в регистр EIP и выполнение продолжается.


-----
Тут не могла быть ваша реклама





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 01 мая 2006 21:07 · Поправил: Nimnul
· Личное сообщение · #12

lord_Phoenix

Ну так почитай внимательно то что ты привел из учебника .

Относительный адрес это EIP + signed константа. а абсолютный это unsigned от 0 до ff ff ff ff. Поэтому команды относительный адрес которых не указывает за границу перемещаемого кода, править не надо.

например:

...
nop
nop
nop ;начало перемещаемого блока
cmp ...
jo m1:
nop
nop
.....
nop
nop
m1:
nop ;конец перемещаемого блока
nop
...


-----
have a nice day





Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 01 мая 2006 21:20
· Личное сообщение · #13

Nimnul пишет:
Поэтому команды относительный адрес которых не указывает за границу перемещаемого кода, править не надо.

так бы сразу =)
Nimnul пишет:
джамп это команда которая работает с абсолютным адресом а не с относительным

Местоположение адреса определяет, интерпретируется ли адрес как относительный адрес или как абсолютный адрес

-----
Тут не могла быть ваша реклама





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 01 мая 2006 21:31 · Поправил: Nimnul
· Личное сообщение · #14

Вобщем:

EB - относительный
E9 - абсолютный косвеный, переход в текущем сегменте
FF - дальний абсолютный
EA - дальний абсолютный

Да к стати если адрес короткого перехода jcc находится за границей перемещаемого кода, то если расстояние больше 127 байт, эта команда должна вырости с двух до шести байт. те. 7x xx должен превратится в 0f 8x xx xx xx xx. Поэтому перемещать блоки, которые разрывают такие переходы не рекомендую .
 

-----
have a nice day





Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 01 мая 2006 21:36
· Личное сообщение · #15

джамп относителен,джамп относителен =)
да и за 127 байт врядле вылезу, так как команда сдвинется на 4-5 нопов примерно..

-----
Тут не могла быть ваша реклама



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


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