*.exe с данными
Ситуация:
Программа создает exe (назовем для определенности file.exe) и записывает в него определенные данные, причем в разных ситуациях объем данных может варьироваться. Далее при запуске "file.exe" считывает из себя эти данные и выполняет определенные действия. Своего рода самораспаковывающийся архив.
Вопрос:
Как можно организовать чтение "самого себя" не вызвав исключение?
Допустим ли такой подход:
Программа знает как создать "file.exe" (код, слизанный с отдельно скомпилированного "file.exe", хранится в одномерном массиве - константе). Тот в свою очередь хранит одномерный массив - константу размером, скажем, 1 элемент типа байт. Можно ли из-вне увеличивать размер этого массива размером 1 не нарушив функциональности "file.exe", путем изменения кода exe-шника?
Программа знает как создать "file.exe" (код, слизанный с отдельно скомпилированного "file.exe", хранится в одномерном массиве - константе). Тот в свою очередь хранит одномерный массив - константу размером, скажем, 1 элемент типа байт. Можно ли из-вне увеличивать размер этого массива размером 1 не нарушив функциональности "file.exe", путем изменения кода exe-шника?
Можно и разными способами.
Один из способов - поместить данные в отдельную секцию.
Посмотри, как работают PE-упаковщики, они модифицируют размер существующих секций, добавляют новые секции.
Насколько я понимаю .Data пишется до .Code и если увеличивать .Data то придется менять все адреса, вызываемые call-ми, если я ошибаюсь можно ссылки на теорию?
Учим матчасть! Стоит почитать практически любую книгу по ассемблеру - такое пишут практически в самом начале.. .data и .code - отдельные сегменты, и адресация для них совершенно разная, через соответствующие регистры..
Фактически тебе еще стоит почитать описание PE формата.. Гугл тебе в помощь =)
зачем тебе всё это надо?
у тебя есть экзешник который должен читать из себя. Ты просто в самый его конец приписываешь нужные данные, и куда-нибудь в заголовок записываешь размер данных, если хочешь, списывай контрольную сумму этих данных и т.д.(места там много)и можно даже вписать позицию в файле где начинаются данные. При заспуске программа считывает из заголовка позицию и размер этих данных и читает их. Прога должна открывать свой собственный файл с флагом GENERIC_READ (createfile(...,GENERIC_READ,....))
у тебя есть экзешник который должен читать из себя. Ты просто в самый его конец приписываешь нужные данные, и куда-нибудь в заголовок записываешь размер данных, если хочешь, списывай контрольную сумму этих данных и т.д.(места там много)и можно даже вписать позицию в файле где начинаются данные. При заспуске программа считывает из заголовка позицию и размер этих данных и читает их. Прога должна открывать свой собственный файл с флагом GENERIC_READ (createfile(...,GENERIC_READ,....))
Некрасиво, неудобно, некоторые антивири будут визжать.
Вариант с отдельной секцией - куда аккуратнее.