Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

*.exe с данными

7.0K
17 октября 2007 года
Rusd
88 / / 26.08.2006
Не знаю в той ли ветке создаю тему.
Ситуация:
Программа создает exe (назовем для определенности file.exe) и записывает в него определенные данные, причем в разных ситуациях объем данных может варьироваться. Далее при запуске "file.exe" считывает из себя эти данные и выполняет определенные действия. Своего рода самораспаковывающийся архив.
Вопрос:
Как можно организовать чтение "самого себя" не вызвав исключение?
Допустим ли такой подход:
Программа знает как создать "file.exe" (код, слизанный с отдельно скомпилированного "file.exe", хранится в одномерном массиве - константе). Тот в свою очередь хранит одномерный массив - константу размером, скажем, 1 элемент типа байт. Можно ли из-вне увеличивать размер этого массива размером 1 не нарушив функциональности "file.exe", путем изменения кода exe-шника?
274
17 октября 2007 года
Lone Wolf
1.3K / / 26.11.2006
Можно, но сложно, да и антивири ругатса будут. ведь собственно ті пишеш примитивную вирусную программу.
7.0K
17 октября 2007 года
Rusd
88 / / 26.08.2006
Думаю будут ругаться при модифицировании exe-шника, но если учесть "обстановку" на этапе создания "file.exe", думаю, антивирус возражать не будет.
3
17 октября 2007 года
Green
4.8K / / 20.01.2000
Цитата: Rusd

Программа знает как создать "file.exe" (код, слизанный с отдельно скомпилированного "file.exe", хранится в одномерном массиве - константе). Тот в свою очередь хранит одномерный массив - константу размером, скажем, 1 элемент типа байт. Можно ли из-вне увеличивать размер этого массива размером 1 не нарушив функциональности "file.exe", путем изменения кода exe-шника?


Можно и разными способами.
Один из способов - поместить данные в отдельную секцию.
Посмотри, как работают PE-упаковщики, они модифицируют размер существующих секций, добавляют новые секции.

268
17 октября 2007 года
Михаил
587 / / 25.06.2005
можно записывать данные как ресурсы
261
17 октября 2007 года
ahilles
1.5K / / 03.11.2005
допустим ты заранее знаешь какой размер твоего экзешника, ты просто открываешь файл через CreateFile с флагом GENERIC_READ, переходишь на определённую позицию, и счиваешь это всё куда нибудь в массив. Насколько я понял вся проблема в том чтобы опеределить размер данных: просто сохрани размер данных-где нибудь в заголовке экзешника (там столько не использующихся полей.....), например если прога не упакована, то есть промежуток между PE заголовком и DOS stub (смещения 80h-100h)
7.0K
17 октября 2007 года
Rusd
88 / / 26.08.2006
Цитата: ahilles
допустим ты заранее знаешь какой размер твоего экзешника, ты просто открываешь файл через CreateFile с флагом GENERIC_READ, переходишь на определённую позицию, и счиваешь это всё куда нибудь в массив. Насколько я понял вся проблема в том чтобы опеределить размер данных: просто сохрани размер данных-где нибудь в заголовке экзешника (там столько не использующихся полей.....), например если прога не упакована, то есть промежуток между PE заголовком и DOS stub (смещения 80h-100h)



Насколько я понимаю .Data пишется до .Code и если увеличивать .Data то придется менять все адреса, вызываемые call-ми, если я ошибаюсь можно ссылки на теорию?

255
18 октября 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Rusd
Насколько я понимаю .Data пишется до .Code и если увеличивать .Data то придется менять все адреса, вызываемые call-ми, если я ошибаюсь можно ссылки на теорию?



Учим матчасть! Стоит почитать практически любую книгу по ассемблеру - такое пишут практически в самом начале.. .data и .code - отдельные сегменты, и адресация для них совершенно разная, через соответствующие регистры..

Фактически тебе еще стоит почитать описание PE формата.. Гугл тебе в помощь =)

7.0K
18 октября 2007 года
Rusd
88 / / 26.08.2006
Вектор принят, еду в гугл )
261
18 октября 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: Rusd
Насколько я понимаю .Data пишется до .Code и если увеличивать .Data то придется менять все адреса, вызываемые call-ми, если я ошибаюсь можно ссылки на теорию?


зачем тебе всё это надо?
у тебя есть экзешник который должен читать из себя. Ты просто в самый его конец приписываешь нужные данные, и куда-нибудь в заголовок записываешь размер данных, если хочешь, списывай контрольную сумму этих данных и т.д.(места там много)и можно даже вписать позицию в файле где начинаются данные. При заспуске программа считывает из заголовка позицию и размер этих данных и читает их. Прога должна открывать свой собственный файл с флагом GENERIC_READ (createfile(...,GENERIC_READ,....))

3
18 октября 2007 года
Green
4.8K / / 20.01.2000
Цитата: ahilles
зачем тебе всё это надо?
у тебя есть экзешник который должен читать из себя. Ты просто в самый его конец приписываешь нужные данные, и куда-нибудь в заголовок записываешь размер данных, если хочешь, списывай контрольную сумму этих данных и т.д.(места там много)и можно даже вписать позицию в файле где начинаются данные. При заспуске программа считывает из заголовка позицию и размер этих данных и читает их. Прога должна открывать свой собственный файл с флагом GENERIC_READ (createfile(...,GENERIC_READ,....))


Некрасиво, неудобно, некоторые антивири будут визжать.
Вариант с отдельной секцией - куда аккуратнее.

7.0K
22 октября 2007 года
Rusd
88 / / 26.08.2006
Почитав документацию по PE-формату остановился на варианте дополнительной секции, но возник вопрос: можно указать количество секций в PE-заголовке, но тогда увеличится таблица секций на одну запись, это влечет увеличение всех смещений следующих за таблицей секций на 40 байт, что по-моему скажется фатально, например, на секциях с исполняемыми кодами, т.о. можно ли указать компилятору (Delphi или Visual C++), что в PE-файл необходимо добавить еще одну секцию, чтобы файл генерировался уже с учетом дополнительной секции?
3
22 октября 2007 года
Green
4.8K / / 20.01.2000
Фигово ты читал документацию по PE-формату. Перечитай.
1.6K
22 октября 2007 года
Vov4ick
476 / / 01.02.2007
А не проще как уже сказали сделать оверлей? Нормальные антивири на него не орут. В программке сохраняем её длину, потом к ней приклеиваем данные, читаем себя, ставим файловый указатель на начало оверлея и читаем приклеенный кусок. Просто и хорошо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог