Изменение содержимого ресурса исполняемого файла - PullRequest
2 голосов
/ 02 января 2011

Все,

Я храню настройки своего приложения в ресурсе.Когда моя программа загружается впервые, я читаю указанный ресурс с помощью WinAPI.Затем я анализирую полученные байтовые данные.Это работает для меня безупречно.

Теперь предположим, что пользователь изменяет настройку в моем приложении.Он / она проверяет флажок управления.Я хотел бы сохранить обновленную настройку на свой ресурс.Однако, кажется, что мой вызов UpdateResource не будет работать, пока мое приложение работает.Я не могу изменить данные своего ресурса, даже если они одного размера.

Во-первых, возможно ли изменить данные ресурса рабочего образа?Во-вторых, если это невозможно, какие у меня есть альтернативы для внутреннего хранения настроек в моем приложении?

ПРИМЕЧАНИЕ. У меня должны быть настройки в моем исполняемом файле.Они не могут быть на жестком диске или в реестре.Пожалуйста, даже не предлагайте это как вариант.

Ответы [ 3 ]

6 голосов
/ 02 января 2011

На 100% можно написать самоизменяющийся код. Это просто не очень легко сделать.

Когда вы запускаете свой исполняемый файл, Windows отображает его в памяти. Это по существу блокирует файл и предотвращает редактирование во время его работы. Очевидно, что вы можете удалить свою программу (используя недокументированную функцию в ntdll). Когда ваш файл не сопоставлен, вы сможете записать в него изменения.

Это похоже на то, что вы хотите сделать: http://www.johnfindlay.plus.com/lcc-win32/asm/SelDelNT.htm

Очевидно, что вместо удаления вы хотите внести изменения. Идея, лежащая в основе безумия, та же: вы должны удалить файл.

1 голос
/ 03 января 2011
  1. К сожалению, SelDelNT не работает на XP + - он может разархивировать файл, но дескриптор изображения exe больше не 0x4 - на самом деле дескриптор stdin равен 0x3, а дескриптор stdout равен 0x7, поэтому вполне вероятно, что дескриптор exe былнамеренно сделан недоступным (-1 или что-то).
  2. Одна из возможностей - переименовать exe (это разрешено), затем скопировать его в файл с оригинальным именем и изменить его, а также использовать MoveFileEx с MOVEFILE_DELAY_UNTIL_REBOOT (или каким-либо другимМожет быть, уловка), чтобы удалить его позже.
  3. Более очевидная версия [2] - сначала скопировать exe в% TEMP% и перезапустить оттуда.
  4. VSS (http://msdn.microsoft.com/en-us/library/aa384645(v=VS.85).aspx) может разрешитьэто (через «восстановление»), но оно очень медленное и имеет заметные побочные эффекты.
  5. A / SWAPRUN: опция NET linker / editbin представляется уместной.
  6. Вот учебник по обновлению ресурсов вunlocked exe - http://www.codeproject.com/KB/DLL/Modify_UpdateResources_.aspx?msg=3307326
  7. Вот еще один учебник со списком методов самоудаления: http://www.catch22.net/tuts/selfdel Последний метод (создание приостановленного процесса со случайным exe, например, explorer или cmd.exe, затем захватывает его) звучит так, как будто он также будет работать для модификации exe - вы можете запустить cmd.exe в приостановленном состоянии, затем скопировать образ exe в память этого процесса и выпустить исходный exe.
0 голосов
/ 03 января 2011

Вы читали MSDN (функция UpdateResource)? В нем есть список вещей, которые не обновляют ваши изменения. Может быть, вы пытаетесь один из них.

...