Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];

Вниз

Как добавить свою секцию в exe-pe файл?   Найти похожие ветки 

 
new_pahan   (2002-09-04 21:00) [0]

Как добавить свою секцию в exe-pe файл и изменить на него точку входа (ну чтоб его запустить), а затем запустить оригинальный код. Скорее надо не пример, а алгоритм действий. Но пример бы тоже не помешал.


 
BAHO   (2002-09-05 01:37) [1]

рассматривай файл как набор байтов...
и дописывай в конец что надо
а потом смещай оригинал в низ на столько
сколько байтов в твоём коде...


 
new_pahan   (2002-09-05 12:30) [2]

To BAHO ©:

Да ты чего, после такого exe-pe файл вообще работать перестанет. Я имел в виду аккуратненько добавить свой код в новую секцию, добавить заголовок в Object table, в pe-header изменить Number of Objects и Entry point RVA и т.д. Вот это меня и интересовало - как это все сделать правильно (например как вычислить новую Entry point RVA, поля в Object table). Как потом передать управление по оригинальной Entry point RVA. И еще возникает проблема с таблицей импорта для моего кода - как ее решить?


 
Digitman   (2002-09-05 13:50) [3]

>new_pahan

Чьей таблицей импорта ? Твоего же модифицирумого модуля ? А зачем ? Ты что, сам себя импортировать собрался ?


 
QymL   (2002-09-05 13:57) [4]


> Digitman

И все же, как осуществить такие действия?


 
new_pahan   (2002-09-05 14:19) [5]

To Digitman ©

Не "модифицирумого модуля", а моего скажем загрузчика, который тоже использует функции kernel32, я же вставляю только код, а секцию импорта СВОЮ (для загрузчика) не вставляю. Ну может я как-то не так выражаюсь непонятно.


 
Digitman   (2002-09-05 14:39) [6]

>new_pahan

Че-то я не понял ... при чем здесь загрузчик и таблица импорта того модуля, который ты пытаешься препарировать ?

Ты вообще все это собираешься в файле проделать или уже в загруженном из него образе в АП своего процесса ?

>QymL

Я пока вообще не понял, о каких "действиях" речь идет ... че-то каша какая-то ...


 
new_pahan   (2002-09-05 15:21) [7]

To Digitman ©

Блин, вообще все запутал (только не пойму кто - я или ты). Давай разберемся.

>>при чем здесь загрузчик и таблица импорта того модуля, который ты пытаешься препарировать ?

Загрузчик - это просто я его условно так назвал, на самом деле это просто кусок моего кода. Таблица импорта того модуля, который я пытаюсь препарировать действительно не при чем? И вообще я пытаюсь препарировать не модуль, а обычный exe-pe файл.

Скажу по другому - есть exe-pe файл, мне надо вставить туда свой код, который делает свое дело и переходит к оригинальному коду (сейчас все закричат что я пишу вирус - ну пусть будет так, мне пох., хотя на самом деле это не так).

Я посмотрел на результаты работы упаковщиков и кодеров еxe - там всегда добавляется новая секция с кодом, которому передается управление при старте, он распаковывает (раскодирует) оригинальные секции и передает туда выполнение. Вот это мне и надо сделать - как? (только мне не распаковывать/раскодировать надо, а проделать свои действия).

Теперь про таблицу импорта. Устройство exe-pe файла - секция кода, секция импорта, где указывается какие функции из каких dll требуются этому коду (при запуске она заполняется реальными адресами этих функций). Когда я вставляю свой код - я вставляю только секцию кода, и как моему коду получить адреса используемых библиотечных функций, не имея таблицы импорта.
Ну теперь понятней?


 
Digitman   (2002-09-05 16:00) [8]

>new_pahan

Теперь понятно. С этого и надо было начинать.
А теперь задавай конкретные и последовательные вопросы - какие шаги во всей этой цепочке тебе неизвестны или вызывают непонимание.

Нудная и длинная же лекция же детальной структуре PE-файла здесь, думаю, неуместна, тем более, что кой-какие подробности из "жизни" PE-файлов тебе уже известны.


 
QymL   (2002-09-05 16:08) [9]


> Digitman

Да, да, я это и имел ввиду (т.е. то, о чем написал new_pahan)


 
new_pahan   (2002-09-05 16:54) [10]

To Digitman ©
какие шаги во всей этой цепочке тебе неизвестны или вызывают непонимание
----
Так в том то и дело, что никакие шаги мне неизвестны, я ж этого никогда не делал. Вот по этому я и просил в самом начале пошаговый алгоритм с самого начала, как ПРАВИЛЬНО все это сделать. Например первый же вопрос: мою секцию надо выравнивать по значению в поле Object align или File align? Ну и т.д. (Все названия я брал из описания by Hard Wisdom - а то в разных текстах они зовутся по-разному).

----
Нудная и длинная же лекция же детальной структуре PE-файла здесь, думаю, неуместна----

Не, как раз таки очень даже уместна и интересна. Или хотябы какой линк, где это толково написано (желательно на русском).


 
Digitman   (2002-09-05 17:31) [11]

>new_pahan

Ты отдаешь себе отчет в том, что это "пошаговый алгоритм с самого начала" есть алгоритм линкера ? И что любой линкер есть достаточно серьезная и сложная программа, состоящая из десятков тысяч строк исп.кода, не говоря уже об огромном множестве деклараций для мультиплатформенной сборки ? И даже малый экстракт из этого цельного алгоритма занимает сотни и сотни строк деклараций и кода ?

Ссылки толковые на эту тему ты вряд ли найдешь - множество их, но каждая либо представляет усеченную инф-цию о PE-формате либо содержит искаженные/недостоверные сведения. К тому же ни один из известных производителей линкеров и системных загрузчиков PE-образов не придерживается 100%-но изначальных соглашений о PE-формате. Тебе предстоит тяжелейшая изнурительная работа - переварить множество разрозненных источников инф-ции, перепробовать десятки сомнительных примеров и собственных микротест-алгоритмов для установления истины.

Ты готов к такой работе ?

Тогда - начни, например, вот с этой ссылки (она по кр.мере - русскояз.вариант) :

http://www.reversing.net/articles/infoforbeginner/pefmt120.htm#part030

В сети - масса ссылок на эту тему, просто набери "PE file fotrmat", например, в Апорте.

Ответ на первый вопрос : оба поля используются загрузчиком от MS, оба поля должны содержать актуальные сведения (в установленном для них формате) о выравнивании прогр.секции.

Вот цитата из упомянутой ссылки :

38h DWord Object align -

выравнивание программных секций, должен быть степенью 2 между 512 и 256М включительно, так же связано с системой памяти. При использовании других значений программа не загрузится.


3Ch DWord File align -

фактор используемый для выравнивания секций в программном файле. В байтовом значении указывает на границу на которую секции дополняются 0 при размещении в файле. Большое значение приводит к нерациональному использованию дискового пространства, маленькое увеличивает компактность, но и снижает скорость загрузки. Должен быть степенью 2 в диапазоне от 512 до 64К включительно. Прочие значения вызовут ошибку загрузки файла. Я так думаю, что размер файла штука более важная.



 
new_pahan   (2002-09-05 17:59) [12]

За ссылку конечно спасибо, только этот документ "ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE)" я и использовал в своих изысканиях.
----
Ссылки толковые на эту тему ты вряд ли найдешь - множество их, но каждая либо представляет усеченную инф-цию о PE-формате либо содержит искаженные/недостоверные сведения.
----
Полностью согласен, я это понял перед заданием вопроса в форум. Поэтому и думал, может кто-то в курсе дела.

-----
Ты отдаешь себе отчет в том, что это "пошаговый алгоритм с самого начала" есть алгоритм линкера ? И что любой линкер есть достаточно серьезная и сложная программа, состоящая из десятков тысяч строк исп.кода
-----

Не, ну не все же так сложно. Есть же куча паковщиков (тот же UPX), кодеров. Там же это как то проще решено.

Кстати есть сырцы на асме кодера spec. Просто сложно разобраться в 30 килах асм-текста., тем более что последний раз асм я юзал под дос лет эдак 7 назад. К тому же его за пример брать не очень хочется, процентов 70 файлов потом перестают работать (т.е. алгоритм у него наверно не совсем правильный). После того же UPX процент неработоспособных файлов намного ниже, но нет исходников.

Вообщем наверно мне никто и не ответит толком.......

----
Ответ на первый вопрос : оба поля используются загрузчиком от MS, оба поля должны содержать актуальные сведения (в установленном для них формате) о выравнивании прогр.секции
----

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


 
Digitman   (2002-09-05 18:32) [13]

Нет, это ТЫ должен при добавлении секции записать (модифицировать !) туда (в оба поля) акт.сведения, в соответствии с рекомендацией. После записи секции расчитай в памяти требуемые в этих полях параметры и обнови поля в дисковом файле.

Да полно ссылок ! Ты не искал просто - уткнулся в одну статейку и решил, что круче ее нет нигде ... Искать надо) ... кто ищет, тот всегда)...

P.S.
Есть у меня кроме прочих подобных, скажем, вот такой документ
(правда, ссылка не сохранилась, откуда качал) :

Microsoft Portable Executable and Common Object File Format Specification
Microsoft Corporation
Revision 6.0 - February 1999

Достаточно подробный и достоверный источник. Но ведь тебе же на русском подавай) ...


 
new_pahan   (2002-09-05 19:09) [14]

Но ведь тебе же на русском подавай
----

Ну дык чтож делать, ежели я всю учебную жизнь делал вид что якобы учу немецкий.

Да ладно, вернемся к нашим баранам, то бишь к этим двум полям.
По-мойму ты ошибаешся, не должен я в них ничего писать нового, а только брать из них инфу. Вот к примеру Cdplayer.exe (из 98) - оба этих поля равны 1000h (4096d) и размер всех секций в этом екзешнике кратен 4096. Далее берем кодер spec и обрабатываем Cdplayer. Смотрим эти поля - они не изменились, а новая секция опять же кратна 4096. Так что не должен я их менять, иначе надо делать realign всех секций.


 
Digitman   (2002-09-06 08:52) [15]

>new_pahan

Дык ыть и я всю жизнь немецкий учил - и в школе и в вузе)..
Ан вот такая беда приключилась - англоязычный буржуйский народ уже 40 с лишним лет с флагом и барабаном на шее марширует в первых рядах колонны компьютерных технологий) ... За то "спасибо" великое леонидам ильичам, в одночасье на корню уничтожившим отечественную компьютерную научную мысль и индустриальный прогресс, столь неутомимо, всеми правдами и неправдами двигаемые "босыми" никитами сергеичами до самых последних лет у власти ... ( ..

Ну да это так, к слову) ... Историю нашего "падения", думаю, многие знают ...

Что ж, к баранам так к баранам).

Обратимся за помощью к
Randy Kath
Microsoft Developer Network Technology Group


Вот цитата его статьи "Исследование переносимого формата исполнимых файлов "сверху вниз":

SectionAlignment.

Сегменты загружаются в адресное пространство процесса последовательно, начиная с ImageBase. SectionAlignment предписывает минимальный размер, который сегмент может занять при загрузке (*) - так что сегменты оказываются выровненными по границе SectionAlignment.
Выравнивание сегмента не может быть меньше размера страницы ( в настоящий момент 4096 байт на платформе x86 ), и должно быть кратно размеру страницы, как предписывает поведение менеджера виртуальной памяти Windows NT. 4096 байт являются значением по умолчанию, но может быть установлено также другое значение, используя опцию линковщика -ALIGN:

FileAlignment.

Минимальная гранулярность сегментов в исполнимом файле до его загрузки. Пояснение: линковщик дополняет нулями тела сегментов, ( RAW data - сырые данные сегментов ), чтобы их минимальный размер был кратен FileAlignment в файле. Линковщик версии 2.39, уже упоминавшийся ранее в этой статье, выравнивает содержимое тел сегментов по границе 0x200 байт. Это значение должно быть степенью двойки между 512 и 65,535.

Мой комментарий к (*) :

Можно и не менять, конечно, это поле, если новая секция не требует иной гранулярности, перекрывающей миним.требования по гранулярности для уже имеющихся сегментов

Не уверен, что realign имеющихся уже секций не придется выполнять. Поскольку ты дополняешь section table новым 40-байтным элементом (заголовком сегмента), все, что следует за section table, возможно придется сдвинуть на величину FileAlignvent "вниз", а это аовлечет за собой пересчет всех уже имеющихся эл-тов таблицы section table.


 
new_pahan   (2002-09-06 10:52) [16]

Ну вот и договорились :)
То бишь если мой сегмент равен например 13,7K, а выравнивание на 4096, то я свой сегмент должен дополнить нулями до 16K.

----
Не уверен, что realign имеющихся уже секций не придется выполнять. Поскольку ты дополняешь section table новым 40-байтным элементом (заголовком сегмента), все, что следует за section table, возможно придется сдвинуть...
-----

Вроде не прийдется. Абсолютно все экзешники, которые я смотрел, имеют место для добавления еще нескольких секций. То есть number_of_section*40 всегда намного меньше размера Object Table.


 
Digitman   (2002-09-06 11:22) [17]

>new_pahan


> Вроде не прийдется. Абсолютно все экзешники, которые я смотрел,
> имеют место для добавления еще нескольких секций. То есть
> number_of_section*40 всегда намного меньше размера Object
> Table.


Полагаться на это не следует. Если в выравненной Object Table есть своб.место для нового элемента, то - да. Но в любом случае это нужно проверять при попытке добавления сегмента, в противном случае дело осложняется : смещения существующих уже секций могут "поплыть" и для предотвращения этого придется, перезаписывая секцию за секцией, корректировать из RVA в заголовках элементов обновленной Object Table.

Кр.того,
- правке будет подлежать base relocation table
- для разрешения ссылок из кода во вновь добавляемом сегменте на внешние модули скорей всего придется править секции в Import Directory
- resource table, если новый сегмент будет использовать некие доп.ресурсы

Все эти таблицы/сегменты могут быть разбросаны линкером по файлу в произвольном, удобном ему порядке, и правка одного из этих элементов запросто может потянуть за собой цепочку правок зависимых (из-за RVA) элементов

Учитывай это тоже.


 
new_pahan   (2002-09-06 12:27) [18]

Ну конкретно в моем случае задача порще - у меня место есть. Мне же надо "поправить" только этот конкретный экзешник, а не вообще любой. Хотя чувствую, мороки предстоит дофига.


 
Digitman   (2002-09-06 13:03) [19]

>new_pahan


> чувствую, мороки предстоит дофига.


Правильно "чувствуешь") ... А то ты с наскоку хотел - дайте, мол, алгоритм да пример))) ... Это не батоны на формы кидать - сабж серьезный достаточно...

Читать и вникать, вникать и пробовать.. Только так !


 
paul_shmakov   (2002-09-09 22:40) [20]

2 new_pahan:

советую сначала сделать добавление секции "ручками" с помощью hiew. это достаточно просто. тем более, если патчить нужно конкретный exe - на нем и тренируйтесь.
не садитесь сразу писать программу - поверьте, написать универсальный патчер, подходящий для всех exe-pe сложно, т.к. очень много тонкостей всплывает.
после того, как руку набьете - можно и за программу приниматься.

рад бы что-нибудь посоветовать из литературы, да в голову ничего не приходит.
то описание pe формата от hard wisdom - вполне приличное. только не верьте описанию каждого поля - все линкеры линкуют как хотят (сравните, например, использование полей VirtualSize и PhysSize в PE от майкрософта и борланда - такое впечатление, что они читали разные стандарты).
когда-то давно читал приличную статью Крис Касперски про расширение возможностей программ путем модификации их кода - советую, поищите.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.008 c
1-33990
Алексей-Сам
2002-11-01 12:35
2002.11.11
Проблемы при создании Help-системы


1-33960
Tornado
2002-10-31 16:11
2002.11.11
DOS-команда


1-34091
Zergling
2002-10-30 06:15
2002.11.11
Как корректно завершить работу потоков в программе!?


1-33953
Шурик Ш
2002-11-01 11:57
2002.11.11
Проверка существования файла


1-34118
TankMan
2002-10-30 21:41
2002.11.11
Люди поможите! Опять с хуками...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский