· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Позиционно независимый jmp - возможен ли?

. 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Июл 10, 2004 21:31:28

Сабж.
Без использования регистров конечно, т.е. чиста по опкоду..


Дата: Июл 10, 2004 21:52:15

Только вместе с сегментом:
db 0EAh
dd ofs
dw seg

или jmp seg:ofs если использовать fasm


Дата: Июл 10, 2004 23:37:00

Black_mirror
Понятно. Нашёл то же самое у The Svin'а в Opcodes Book.
Теперь у меня другой вопрос, как железно определить этот seg(segment selector) не полагаясь на константу, мало ли чего в будущем изменит M$, т.е. я собираюсь кодировать jmp в runtime'е ?


Дата: Июл 11, 2004 00:13:04

Asterix
без самомодифицирующегося кода никак:
        db 0EAh
        dd ofs
jumpseg dw ?

....

mov [jumpseg],cs

Хотя межсегментный переход, очищает конвеер и если уж переходить к самомодифицирующемуся коду, то с постороением относительного jump'а проблем не возникает:
jump db 0E9h
     dd ?

...

mov dword [jump+1],target-(jump+5)


Дата: Июл 11, 2004 00:36:54

Black_mirror
Спасибо за разъяснения.
А он и будет самомодифицирующийся, код будет находиться в .data, и в рантайме после его настройки копироваться в нужное место. Мне кажется первый вариант потребует меньше вычислений. А вобще это всё нужно для постановки хука, чтоб не подумали что я вирь надумал писать ;-)


Дата: Июл 11, 2004 00:46:55

Что-то я не пойму, The Svin пишет:
CS:
CS is the same for all user mode apps.
It is 1Bh in NT family OSs and 227h in 9x.


А у меня код:
mov ax, cs

даёт 1AFh в ax под 98-й ??? Кто ошибается?


Дата: Июл 11, 2004 00:56:42 · Поправил: Asterix



Дата: Июл 11, 2004 01:22:05 · Поправил: The Svin

Asterix
Я ошибался. Насчёт 9х. Но Opcode Book это составленная не мной дока, хотя из моих статей. Поэтому там нет исправлений.


Дата: Июл 11, 2004 01:39:01

The Svin
Спасибо за ответ, ясно.

> Но Opcode Book это составленная не мной дока, хотя из моих статей.

Я с удовольствием почитал бы то же самое но на русском.

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


Дата: Июл 11, 2004 02:19:01

Без использования регистров конечно, т.е. чиста по опкоду..
Как то неопределённо сказано. Что такое "чиста по опкоду"?
Вынуждаешь догадываться. Имеется ввиду чтобы операнд был представлен только как часть опкода? Непосредственный операнд в теле опкода?
Тогда EA и дальше байты представляющие непосредственный операнд seg:offset.
Но можно с помощью памяти.
11111111 md100m/r - без сегментной составляющей.
11111111 md101m/r - с сегментной составляющей.
Если не хочется использовать ссылки на секцию данных.
И не хочется писать самомодифицирующий то можно использовать стек. Запушить данные в стек и использовать
адресацию перехода через указатель стека. Если указатель стека не хочется портить - то его можно восстановить сразу после push и использовать уже не jmp [esp] а jmp [esp+4]
push адрес
pop ненужный регистр
jmp [esp+4]
Но тогда проще уже адресовать прыжок с помощью регистра.
push НепосредственноеЧислоНужныйАдресс
pop reg
jmp reg


Дата: Июл 11, 2004 03:07:51

Если возможен самомодифицирующийся код (разрешена запись в секцию кода) то вот простенький макрос который пришёл в голову для использование EA формата когда CS неизвестно:
CodMdAB macro offsPart
LOCAL segpart
	push cs
	pop word ptr segpart
	db 0EAh
	dd offsPart 
segpart:
	dw 0	
endm


Посылаю тестовую программу которая дважды использует абсолютные прыжки и скомпилена с использованием макроса.
PS. При собственной компиляции обязательно проверить что
при линковке \SECTION:.text,ERW


_600584219__absjmp.rar


Дата: Июл 11, 2004 03:18:30

Во первых нужно поставить @jmphere1 перед GetCommandLine
Во вторых забавная вещь, мною пока не объяснённая.
Все jmpы выполняются корректно проверено в дебагере. Но во MessageBox не появляется. Нет никаких ошибок, передаются правильные адреса и правильные параметры, но MessageBox не появляется. При простом jmp @jmphere1 появляется.
Мистика :)


Дата: Июл 11, 2004 03:26:32

> Имеется ввиду чтобы операнд был представлен только как часть опкода? Непосредственный операнд в теле опкода?

Ну да так я и подразумевал ;-)

А вообще я уже выше намекал что это для хука, допустим код этого jmp'а будет лежать у меня в .data в виде:
        db 0EAh
address dd ofs
jumpseg dw 0


В рантайме я собираюсь заполнить переменные address и jumpseg, и потом скопировать код jmp'а в нужное место в другой процесс, поэтому собственно через регистры меня не устраивает.
В случае же просто дальнего jmp'а мне пришлось бы высчитывать смещение, это займёт больше места и поэтому не подходит тоже.


Дата: Июл 11, 2004 03:37:57

Asterix

А чем
push target
ret

не устраивает? всего 6 байт, и тоже позиционно не зависимо.


Дата: Июл 11, 2004 03:41:44 · Поправил: Asterix

The Svin
> Все jmpы выполняются корректно проверено в дебагере. Но во MessageBox не появляется.

У меня всё работает, в 98-й, сейчас проверю ещё в 2k.


_983643817__absjump.rar

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.100