информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 На GitHub пугают ложными предупреждениями... 
 Атака на пользователей больших... 
 Notepad++ полгода раздавал зараженные... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[ASM32] Что-то вы усложняете 04.02.02 20:09  Число просмотров: 1003
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
push target_address
ret
<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.
В абсолютном вызове - абсолютный адрес перехода.
1




Rambler's Top100
Рейтинг@Mail.ru


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