Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Запись параметров в exe


Автор: ecspertiza 23.6.2010, 12:17
Есть задача, сохранять некоторые параметры, точнее даже один параметр, но сохранять его нужно непосредственно в самом исполняемом файле, как это можно реализовать или где об этом можно почитать? использую компилятор MinGW.

Автор: EvilsInterrupt 23.6.2010, 12:34
ecspertiza, А куда тебе в него нужно  писать? Может в оверлей?

Автор: ecspertiza 23.6.2010, 12:38
Если честно я в этом вопросе не особо осведомлен, знаю что можно хранить небольшие значения, непосредственно в самом исполняемом файле, которое при загрузке можно вытащить и при желании изменить. Если бы меня в этом вопросе хоть как то просветили был бы признателен, ибо у меня что то ничего путевого найти не получается.

Автор: EvilsInterrupt 23.6.2010, 12:45
ecspertiza, Просто задачи бывают разными! Бывает поменять логику работы ПО,т.е. поменять бинарный код и тут уже совсем другое! А бывает просто сохранить конфигурацию, т.к. не  хочется таскать файл-базуданных и тут уже лучше всего оверлей программы.

Оверлеем принято считать все что не попадает в виртуальное пространство запущенного приложения. На начальном этапе можете упростить себе понимание оверлея до следующего:

OverlayRaw = RvaToRaw(  ALLIGN_UP ( PE->OptionalHeader.SizeOfImage, PE->OptionalHeader.SectionAllignemnt )  );
OverlayLen  = FileLength  - OverlayRaw;

где:

PE -  это объект IMAGE_NT_HEADERS32
RvaToRaw - это функция конвертирования смещения используемого для адресации в виртуальном адресном пространстве в смещение используемое для адресации в файлвом пространстве

Рекомендуется сходить на rsdn.ru, wasm.ru на предмет устройства PE-формата

Автор: Abyx 23.6.2010, 12:53
EvilsInterrupt, ты бы лучше начал с того, что сделать это во время выполнения этого .exe - весьма сложно

Автор: ecspertiza 23.6.2010, 13:01
Возможно и оверлея хватит, мне нужно просто при первом запуске записать значение даты и время, а потом просто его читать, насколько я понял те ф-ции которые ты скинул они для студии, а есть ли что то подобное в MinGW ?


Цитата(Abyx @  23.6.2010,  12:53 Найти цитируемый пост)
EvilsInterrupt, ты бы лучше начал с того, что сделать это во время выполнения этого .exe - весьма сложно 


это я понимаю, поэтому мог бы писать значение при инсталляции.

Автор: EvilsInterrupt 23.6.2010, 13:04
ecspertiza, Те функции что привел, поясняют чего тебе надо сделать, их можно  написать и самому! Более того,  каждый работающий с PE программно пишет каждый свою реализацию! И правильно! Потому что надо понимать что делаешь, это не простой формат

Автор: Abyx 23.6.2010, 13:19
если надо писать при инсталляции - то проще писать в заголовок, например в стаб, 
по смещениям в файле (и в памяти) в интервале [0x4; 0x3C)

Автор: Alexeis 23.6.2010, 13:22
  Это делать плохо по нескольким причинам.
1) Теряется поддержка различных пользователей.
2) Виста+ запрещает записывать, что-то в папку Program Files
3) Антивирус может принять за вирусоподобное действие.

Автор: Abyx 23.6.2010, 14:11
Цитата(Alexeis @  23.6.2010,  13:22 Найти цитируемый пост)
1) Теряется поддержка различных пользователей.
2) Виста+ запрещает записывать, что-то в папку Program Files

1) если сохраняемые параметры одинаковы для всех юзеров - все ОК
2) в скрипте установки - не запрещает

Добавлено через 42 секунды
хотя при установке проще писать в реестр %)

Автор: ecspertiza 23.6.2010, 14:27
Раз так все непросто, может подскажете как лучше поступить, нужно разрешить пользователю использовать программу только 10 дней, я думал записать в исполняемый файл дату при инсталляции , потом при запуске сверять, и если что запрещать запускать, но раз все не так просто может есть лучший вариант, в реестр писать не хочется, ибо значение слишком просто поправить. 

Автор: borisbn 23.6.2010, 14:32
Цитата(Alexeis @  23.6.2010,  13:22 Найти цитируемый пост)
2) Виста+ запрещает записывать, что-то в папку Program Files

Интересно, а функции http://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx#_win32_Updating_Resources тоже запрещены ? Не "сырой" PE-формат а именно FindResource, UpdateResource и т.п.

Автор: Abyx 23.6.2010, 14:48
borisbn, на запись - запрещены

Автор: GremlinProg 23.6.2010, 14:50
Цитата(ecspertiza @  23.6.2010,  16:27 Найти цитируемый пост)
Раз так все непросто, может подскажете как лучше поступить

http://msdn.microsoft.com/ru-ru/library/9sh96ycy(VS.90).aspx
думаю, еще лучше не придумать

Автор: W4FhLF 23.6.2010, 15:01
GremlinProg, что-то там везде .NET. К обычным то файлам можно применить? 

Автор: GremlinProg 23.6.2010, 15:12
да можно, конечно, подпись - часть PE
только вот я не уверен на счет того, кодируется ли непосредственно содержимое образа этим ключом
или кодируется только информация о поставщике

с полным кодированием было бы очень удобно

Добавлено через 55 секунд
подписал на 10 дней и забыл )

Автор: xvr 23.6.2010, 16:16
Цитата(ecspertiza @ 23.6.2010,  14:27)
Раз так все непросто, может подскажете как лучше поступить, нужно разрешить пользователю использовать программу только 10 дней, я думал записать в исполняемый файл дату при инсталляции , потом при запуске сверять,

Пользователь пользуется программой 10 дней, потом сносит ее и ставит заново - еще 10 дней. И т.д.
Цитата

в реестр писать не хочется, ибо значение слишком просто поправить.
В данном случае лучше писать в реестр, по крайней мере человек должен знать, что такое реестр и где там искать. А просто переустановить программу сможет кто угодно.

Самый правильный способ будет сохранить привязку при установке где то на компьютере, желательно прямо в его потрохах  smile Например в TPM (если он есть). Привязка будет неубиваемая.

Или хотя бы через CryptoAPI в приватном хранилище ключей. Снять привязку можно будет только переустановкой ОС

Автор: EvilsInterrupt 23.6.2010, 17:31
>>Пользователь пользуется программой 10 дней, потом сносит ее и ставит заново - еще 10 дней. И т.д.
Зачем сносить? Один лодырь с перехватом и возвратом "правильной" таймстамп ;)

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