eXeL@B —› Основной форум —› Межсегментный вызов |
Посл.ответ | Сообщение |
|
Создано: 18 февраля 2006 10:50 · Личное сообщение · #1 Необходимо добавить код к программе. В общем случае нулей не хватает - приходится что то изобретать. Пробовал расширить секцию кода - не работает (в литературе освещается только расширение последней секции - видимо это не спроста , так что приходится добавлять новую секцию. С этим вроде разобрался, но вод код в .text и новой секцией лежит в разных сегментах памяти - обычные jmp'ы естесственно не проходят. В литературе я нашел этот случай под названием "Межсегментный вызов" - они используются для компановки нескольких obj файлов и для вызова подпрограмм. Делается он так CALL OFFS SEG, и имеет код 9A XXXXXXXX XXXX где последнии 2 байта - код сегмента, который будет занесен в CS. А теперь вопрос, как я могу узнать код сегмента (нового) находясь в .text (как я понимаю, он назначается сегменту при загрузки секции в память)? Я думаю это осуществимо. |
|
Создано: 18 февраля 2006 11:58 · Личное сообщение · #2 |
|
Создано: 18 февраля 2006 12:13 · Личное сообщение · #3 |
|
Создано: 18 февраля 2006 12:25 · Личное сообщение · #4 bkslash пишет: это ты по винду делаешь? какие еще сегменты? ИМХО секция PE файла загруженная в память зовется сегментом (CS, DS)? infern0 пишет: это PE и следовательно модель памяти flat да, это PE. Я смотрел статьи на wasm'e по внедрению своего кода в PE (раздел вирусологии) - там рассматривались способы расширения последней секции и создания новой. Способ расширения секции мне не подходит - а в случае секций я не могу осуществлить прыжок между ними. В принципе, можно было бы расширить секцию .text, но после моих экспериментов экзешник оказался нерабочим. может это невозможно? |
|
Создано: 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есации к любой точке памяти. |
|
Создано: 18 февраля 2006 12:57 · Личное сообщение · #6 Обезьяна в клетке застрелилась Создаешь новую секцию в разделе секций, ставишь верный ImageSize после этого (увеличивай старый на размер новой секции... и пихай в нее данные... я и не думал что это может так озадачить ----- Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе! |
|
Создано: 18 февраля 2006 13:22 · Личное сообщение · #7 |
|
Создано: 18 февраля 2006 14:16 · Личное сообщение · #8 sanniassin пишет: LordPE сам его выставляет не спрашивая (что иногда мешает ), а пихать код можно и в PE Header, если там место остается Речь идет не о LordPE, а как я понял о программном создании новой секции PS: харе грузить сегментами... о них забыли еще 15 лет назад... сейчас о них помнят только кодеры драйверов. А то мартышка уже 3 раза застрелилась со смеху читая топик ----- Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе! |
|
Создано: 18 февраля 2006 23:09 · Личное сообщение · #9 |
|
Создано: 18 февраля 2006 23:12 · Личное сообщение · #10 sanniassin пишет: а пихать код можно и в PE Header, если там место остается я заменяю процедуры своими, к томуже патч должен быть универсальным для целой линейки версий (заменяемые процедуры в экзешнике ищутся). Так что расширение секции или добавление новой - единственные (др не нашел) приемлимые варианты. |
|
Создано: 18 февраля 2006 23:12 · Личное сообщение · #11 |
|
Создано: 18 февраля 2006 23:21 · Личное сообщение · #12 |
|
Создано: 18 февраля 2006 23:22 · Поправил: TRUF · Личное сообщение · #13 |
|
Создано: 18 февраля 2006 23:24 · Личное сообщение · #14 |
|
Создано: 18 февраля 2006 23:38 · Личное сообщение · #15 |
|
Создано: 18 февраля 2006 23:51 · Личное сообщение · #16 |
|
Создано: 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 команды) ----- Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе! |
|
Создано: 22 февраля 2006 15:42 · Личное сообщение · #18 |
eXeL@B —› Основной форум —› Межсегментный вызов |