Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Добавление произвольной информации в exe-файл


Автор: YoD 20.12.2004, 13:08
Подскажите пожалуйста: можно ли как-нибудь в exe-файл, скомпилированный Visual Basic'om .NET, добавить ещё какую-нибудь информацию? К примеру, я пишу программу архиватор, и мне нужно в уже готовую программу-распоковщик внедрить упаковываемые файлы. Если такое возхможно, то подскажите пожалуйста, как внедрять информацию и как её оттуда доставать самой программой?

Автор: Akina 20.12.2004, 13:55
Да запросто. Вставляешь в текст программы код-болванку работы с этой инфой - полностью правильный, но с неверным смещением (seek). Компиляешь. Смотришь какое получилось реально смещение. Изменяешь код. Пересобираешь.
Блок данных можно вставлять как в неиспользуемое пространство (сегментов, stub'a, relocation table, etc.), так и в хвост.

А вообще это неразумно - для чего, спрашивается, придуманы ресурсы?


Автор: YoD 20.12.2004, 14:09
Спасибо за информацию, но, если не трудно, можно поподробнее про смещения и всё вышеописанное. И буду очень благодарен за пример исходника. А то честно говоря я плохо понял...

Автор: Akina 20.12.2004, 14:17
Чтение куска данных из самого себя (draft):

Код

Const DataOffset as Long = 1000000 ' Смещение данных в собранном файле
Const DataLength as Long = 10000 ' Длина данных

...

MyFileName=GetSelf() ' это функция определения своего имени
                    ' пишется с использованием WinAPI
Handle=FreeFile
Open MyFileName For Input as #Handle
Seek #Handle,DataOffset ' смещаемся на нужное место
tmpStr=Input$(DataLength,#Handle) ' Читаем код в переменную
Close #Handle

... ' Делаем с прочитанными данными чего надо

Автор: arilou 21.12.2004, 12:56
А почему нельзя взять то, что ты хочешь заархивировать, сжать его, а потом с помощью System.Reflection.Emit сгенерить новый EXE'шник, вставив в него в виде embedded resource сжатые данные? Тем более, что если ты модифицируешь .NET assembly после компиляции, она уже не будет запускаться средой.

Вот.

Автор: S.A.P. 21.12.2004, 13:09
Все гораздо проще: берем заренее подготовенную откомпилированную программу, которая будет извлекать из себя данные, присобачиваем к его концу файлы, которые будут извлекаться, а их размеры записываем где нибудь в ресурсах этого файла. Всё smile .
Извлекать файлы удобнее с конца, например, чтобы извлесь последний нам надо знать размер всего экзешника и размер этого файла. Чтобы извлечть предпоследний - смещение последнего и размер предпоследнего. и.т.д smile

Автор: arilou 21.12.2004, 13:22
Мне кажется, что подход с Reflection.Emit более соответствует идеологии .NET. Таким образом свой самораспаковывающийся архив можно будет подписать, чтобы удостоверить его аутентичность.

Автор: YoD 23.12.2004, 15:11
Всем спасибо за информацию...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)