Сейчас на форуме: Rio, YDS (+10 невидимых)

 eXeL@B —› Основной форум —› Межсегментный вызов
Посл.ответ Сообщение

Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 февраля 2006 10:50
· Личное сообщение · #1

Необходимо добавить код к программе. В общем случае нулей не хватает - приходится что то изобретать. Пробовал расширить секцию кода - не работает (в литературе освещается только расширение последней секции - видимо это не спроста , так что приходится добавлять новую секцию. С этим вроде разобрался, но вод код в .text и новой секцией лежит в разных сегментах памяти - обычные jmp'ы естесственно не проходят. В литературе я нашел этот случай под названием "Межсегментный вызов" - они используются для компановки нескольких obj файлов и для вызова подпрограмм. Делается он так CALL OFFS SEG, и имеет код 9A XXXXXXXX XXXX где последнии 2 байта - код сегмента, который будет занесен в CS.
А теперь вопрос, как я могу узнать код сегмента (нового) находясь в .text (как я понимаю, он назначается сегменту при загрузки секции в память)? Я думаю это осуществимо.



Ранг: 53.8 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 18 февраля 2006 11:58
· Личное сообщение · #2

TRUF пишет:
код в .text и новой секцией лежит в разных сегментах памяти

это ты по винду делаешь? какие еще сегменты?



Ранг: 160.1 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 18 февраля 2006 12:13
· Личное сообщение · #3

bkslash пишет:
по винду делаешь? какие еще сегменты?

например в случае NE образов. Хотя судя по наличию фразы TRUF пишет:
находясь в .text
это PE и следовательно модель памяти flat



Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 февраля 2006 12:25
· Личное сообщение · #4

bkslash пишет:
это ты по винду делаешь? какие еще сегменты?

ИМХО секция PE файла загруженная в память зовется сегментом (CS, DS)?


infern0 пишет:
это PE и следовательно модель памяти flat

да, это PE. Я смотрел статьи на wasm'e по внедрению своего кода в PE (раздел вирусологии) - там рассматривались способы расширения последней секции и создания новой. Способ расширения секции мне не подходит - а в случае секций я не могу осуществлить прыжок между ними.

В принципе, можно было бы расширить секцию .text, но после моих экспериментов экзешник оказался нерабочим. может это невозможно?



Ранг: 53.8 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 18 февраля 2006 12:50
· Личное сообщение · #5

TRUF пишет:
ИМХО секция PE файла загруженная в память зовется сегментом (CS, DS)?

вот почитай http://wasm.ru/article.php?article=1001001
Под Win32, мы больше не должны беспокоиться о моделях памяти или сегментах! Тепеpь только одна модель память: плоская, без 64-ти килобайтных сегментов. Тепеpь память - это большое последовательное 4-х гигабайтовое пpостpанство. Это также означает, что можно не париться с сегментными pегистpами, зато можноиспользовать любой сегментный pегистp для адpесации к любой точке памяти.




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 18 февраля 2006 12:57
· Личное сообщение · #6

Обезьяна в клетке застрелилась

Создаешь новую секцию в разделе секций, ставишь верный ImageSize после этого (увеличивай старый на размер новой секции... и пихай в нее данные... я и не думал что это может так озадачить

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 31.0 (посетитель), 1thx
Активность: 0.040
Статус: Участник

Создано: 18 февраля 2006 13:22
· Личное сообщение · #7

GPcH пишет:
ставишь верный ImageSize

LordPE сам его выставляет не спрашивая (что иногда мешает ), а пихать код можно и в PE Header, если там место остается




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 18 февраля 2006 14:16
· Личное сообщение · #8

sanniassin пишет:
LordPE сам его выставляет не спрашивая (что иногда мешает ), а пихать код можно и в PE Header, если там место остается

Речь идет не о LordPE, а как я понял о программном создании новой секции

PS: харе грузить сегментами... о них забыли еще 15 лет назад... сейчас о них помнят только кодеры драйверов. А то мартышка уже 3 раза застрелилась со смеху читая топик

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 февраля 2006 23:09
· Личное сообщение · #9

Может нужно разжиться книжкой поновее (у меня был под рукой только Абель)

Секцию я добавлял программно, и руками и все там правильно. Сформулирую вопрос по другому.

Что нужно вписать в код из секции .text чтобы совершить прыжок на код из свежедобавленной секции и назад?



Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 февраля 2006 23:12
· Личное сообщение · #10

sanniassin пишет:
а пихать код можно и в PE Header, если там место остается


я заменяю процедуры своими, к томуже патч должен быть универсальным для целой линейки версий (заменяемые процедуры в экзешнике ищутся). Так что расширение секции или добавление новой - единственные (др не нашел) приемлимые варианты.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 18 февраля 2006 23:12
· Личное сообщение · #11

CALL и RET



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 18 февраля 2006 23:21
· Личное сообщение · #12

jmp xxxxxxxx
@1:
,где хххххххх - разница мехду @2 и адресом прыхка.

TRUF
в литературе освещается только расширение последней секции - видимо это не спроста

Поищи в сети "Техника внедрения и удаления кода из PE-файлов" Автор: Крис Касперски



Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 февраля 2006 23:22 · Поправил: TRUF
· Личное сообщение · #13

А что в параметрах CALL'a?



Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 февраля 2006 23:24
· Личное сообщение · #14

asd пишет:
jmp xxxxxxxx
@1:
,где хххххххх - разница мехду @2 и адресом прыхка.


Между секциями не сработает. Есть jmp CS:VA, Но нужно передавать jmp новый CS




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 18 февраля 2006 23:38
· Личное сообщение · #15

TRUF пишет:
Между секциями не сработает. Есть jmp CS:VA, Но нужно передавать jmp новый CS

Е-мое, почитай доки, которые тебе дали...Гнешь всё одно своё..



Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 февраля 2006 23:51
· Личное сообщение · #16

OK




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 19 февраля 2006 11:54
· Личное сообщение · #17

TRUF
Есть добавленная секция с VA 406000
Есть первая секция из которой нужно сделать jmp на последнюю.
Если хочешь как проще просто в первой секции напиши

push 00406000
ret

или так:

mov eax, 00406000
jmp eax

Если же делать с умом, то есть в одну команду то придется заниматься небольшими вычислениями, для генерации относительного Jmp'аю А именно из адреса новой секции ( к примеру 00406000) нужно вычесть адрес следующей за Jmp'ом команды. То есть 0xE8 (команда Jmp) + Invert(00406000 - адрес следующей после jmp команды)

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 22 февраля 2006 15:42
· Личное сообщение · #18

Все спасибо - разобрался Про сегменты, это я конечно загнул - книжки надо брать поновее.
Сделал наконец универсальный патч для WinAmp 2.x - 5.x на JumpToFile функцию. Вот только он чего-то на v2.6 и 2.7 глючит


 eXeL@B —› Основной форум —› Межсегментный вызов
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати