|
|
| Посл.отвђт | Сообщен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 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.100 |