2011-01-02 4 views
2

Все,Изменение содержимого ресурса исполняемого исполняемого файла

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

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

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

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

+3

Зачем вам это нужно? С того места, где я сижу, задание этого вопроса указывает на серьезный недостаток дизайна приложения. Это заслуживает полного исправления, а не решения для групповой помощи. –

+1

Я собирался предложить решение вашей проблемы, но вы прямо заявили, что не хотите, чтобы кто-нибудь предлагал решение. Извините, что я не могу помочь. –

+2

Обычно это не работает, даже если ваше изображение не загружается в процесс. Вы не можете получить доступ на запись к исполняемому файлу, когда пользователь будет соответствующим образом ограничен. UAC является обычным делом. Давайте закроем этот вопрос, вас не интересует реальный ответ. –

ответ

5

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

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

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

Вместо того, чтобы удалить его, очевидно, что вы хотите внести изменения. Идея безумия - то же самое - вы должны размонтировать файл.

+0

@ddebug: Я согласен, это прекрасный вопрос, и это прекрасный ответ (+1). У вас должно быть больше открытости, как вы. –

+1

@ddebug, чтобы завершить рассказ, возможно, вы также можете объяснить, как писать в файл, если у вас нет достаточных прав для этого –

+0

@ Давид Хеффернан, я не думаю, что понимаю, что вы пытаетесь получить , Нет, где в заявлении г-на Мрвоика он сказал, что у него нет разрешения на запись его исполняемого файла. Он хотел изменить свой образ во время выполнения. Windows блокирует ваш файл, когда он используется во время его выполнения. Вы можете удалить эту блокировку, используя UnmapViewOfFile. Хотя это предотвращает дальнейшее выполнение кода вашего исполняемого файла, но ссылка, опубликованная выше, показывает обходной путь для этого. Это может быть слишком продвинутым для вашего Дэвида, но, если вы прочитаете ресурс, который я связал, вы МОЖЕТЕ его понять. – ddebug

0

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

1
  1. К сожалению, что SelDelNT не работает на XP + - это может отменить отображение файла, но ех ручка изображения не 0х4 больше - на самом деле стандартный ввод ручка 0x3 и STDOUT ручка 0x7, поэтому его вероятности того, что ех ручка была намеренно сделана недоступной (-1 или что-то).
  2. Одна из возможностей заключается в том, чтобы переименовать exe (его разрешено), а затем скопировать в файл с оригинальным именем и изменить его, а также использовать MoveFileEx с MOVEFILE_DELAY_UNTILL_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. Вот учебник по обновлению ресурсов в разблокированном ехе - http://www.codeproject.com/KB/DLL/Modify_UpdateResources_.aspx?msg=3307326
  7. Вот еще один учебник со списком самостоятельно удаление методов: http://www.catch22.net/tuts/selfdel Последний метод (создание приостановленный процесс со случайным ехе как исследователь или cmd.exe, а затем захват его) звучит так, как будто он также будет работать для модификации exe - вы можете запустить cmd.exe в приостановленном состоянии, а затем скопировать exe-образ в память об этом процессе и освободить исходный exe.