Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
[ASM32] как правильно сделать call на абсолютный адрес? - Вариант. 02.02.02 08:15 Число просмотров: 1056
Автор: Chingachguk <Chingachguk> Статус: Member Отредактировано 02.02.02 08:17 Количество правок: 1
|
> Нужно пропатчить одну задачу, исходник патча представляет > собой текст типа >...
> ; call 401000h > Буду признателен, если кто предложит более изящное решение > проблемы.
org 0
call $+401000h
У меня на masm получилось Ж)
|
|
<programming>
|
[ASM32] как правильно сделать call на абсолютный адрес? 01.02.02 14:17
Автор: ukv Статус: Незарегистрированный пользователь
|
Нужно пропатчить одну задачу, исходник патча представляет собой текст типа
push ebp
mov ebp,esp
push dword ptr [0501000h]
call 401000h
add esp,4
и дальше в таком же духе - несколько сот строк. На релокации можно не обращать внимания - нужно только сгенерировать бинарный код, выдернуть его из obj и прописать прямо в файл.
Проблема с инструкциями call - я пробовал на tasm2.5 и wasm - в чистом виде абсолютный адрес не проходит (tasm дает ошибку, а wasm генерирует тупо E9 00 10 40 00).
Выход из положения я пока вижу такой: сделать макрос на основе такой идеи:
org 0
d_0 = $
org 502000h ; допустим патч будет размещен по адресу 502000
; call 401000h
d_1 = d_0 - $ -5
db 0E9h
dd 401000h + d_1
Буду признателен, если кто предложит более изящное решение проблемы.
|
 |
[ASM32] как правильно сделать call на абсолютный адрес? - Вариант. 02.02.02 08:15
Автор: Chingachguk <Chingachguk> Статус: Member Отредактировано 02.02.02 08:17 Количество правок: 1
|
> Нужно пропатчить одну задачу, исходник патча представляет > собой текст типа >...
> ; call 401000h > Буду признателен, если кто предложит более изящное решение > проблемы.
org 0
call $+401000h
У меня на masm получилось Ж)
|
 |
[ASM32] как правильно сделать call на абсолютный адрес? 01.02.02 14:59
Автор: :-) <:-)> Статус: Elderman
|
mov eax, 401000h
call eax
|
 |  |
[ASM32] как правильно сделать call на абсолютный адрес? 01.02.02 19:38
Автор: ukv Статус: Незарегистрированный пользователь
|
> mov eax, 401000h > call eax
Не универсально - надо вникать в логику программы - ведь eax может использоваться для передачи параметра. Через косвенный вызов надежнее -
например как нибудь так
mov dword ptr cs:[dummy_call_dword],401000h
call dword ptr cs:[dummy_call_dword]
jmp short $+6
dummy_call_dword dd 0
Но неужели нет способа сделать обычный относительный вызов на абсолютный адрес?
|
 |  |  |
[ASM32] как правильно сделать call на абсолютный адрес? 04.02.02 09:06
Автор: :-) <:-)> Статус: Elderman
|
более короткий вариант:
push 401000h
call dword ptr [esp]
|
 |  |  |  |
[ASM32] как правильно сделать call на абсолютный адрес? 04.02.02 18:49
Автор: ukv Статус: Незарегистрированный пользователь
|
> более короткий вариант: > > push 401000h > call dword ptr [esp]
Нельзя менять стек - там уже лежат парамерты вызова. Нежелательно менять регистры или флаги. Мой вариант с промежуточным значением на cs: тоже не проходит (в cs писать нельзя по определению - совсем забыл), но можно воспользоваться тем, что используется flat-модель и ds c cs адресуют одно и тоже. Но это какое-то кривое решение.
А прямо записать
db 0E8h
dd 401000h - $ - 4
нельзя - ассемблер не позволяет вычитать $ из константы, можно вычитать $ только из другой метки.
По-моему, несложный и 100% надежный вариант такой:
push eax
lea eax,$+0Fh
xchg eax,[esp]
push 401000h
ret
|
 |  |  |  |  |
[ASM32] как правильно сделать call на абсолютный адрес? 05.02.02 09:12
Автор: :-) <:-)> Статус: Elderman
|
> > более короткий вариант: > > > > push 401000h > > call dword ptr [esp] > > Нельзя менять стек - там уже лежат парамерты вызова.
Ну и делай так -
push 401000h
push parameter1
push parameter2
call dword ptr [esp+8]
> По-моему, несложный и 100% надежный вариант такой: > push eax > lea eax,$+0Fh > xchg eax,[esp] > push 401000h > ret
Зачем так мудрить ? :-))
push offset $+0Bh
push 040100h
retn
|
 |  |  |  |  |  |
Всем спасибо 05.02.02 11:49
Автор: ukv Статус: Незарегистрированный пользователь
|
> Зачем так мудрить ? :-)) > > push offset $+0Bh > push 040100h > retn
Совсем забыл про ключевое слово offset. Так действительно короче.
|
 |  |  |  |  |
[ASM32] Что-то вы усложняете 04.02.02 20:09
Автор: leo <Леонид Юрьев> Статус: Elderman
|
push target_address
ret
|
 |  |  |
[asm32] еще раз внимательно прочитай, что написал... 02.02.02 01:03
Автор: Sandy <Alexander Stepanov> Статус: Elderman
|
> Но неужели нет способа сделать обычный относительный вызов > на абсолютный адрес?
И как ты себе ЭТО представляешь??? Относительный вызов потому так и называется, что в команде указывается СМЕЩЕНИЕ от текущего IP.
В абсолютном вызове - абсолютный адрес перехода.
|
|
|