информационная безопасность
без паники и всерьез
 подробно о проекте
Все любят медПортрет посетителяСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Критическая уязвимость UEFI позволяет... 
 Японский хостинг попросил клиентов... 
 Компрометация eMudhra вынудила... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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.
В абсолютном вызове - абсолютный адрес перехода.
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach