2010-11-27 2 views
1

Я ищу хороший способ заменить несколько строк внутри встроенного исполняемого файла win32. Например, у меня есть следующие в моем коде:C++ Win32 Замените строки в исполняемом файле

const char *updateSite = "http://www.place.com" 
const char *updateURL = "/software/release/updater.php" 

Мне нужно изменить эти строки с другими строками произвольной длины в пределах ехе. Я понимаю, что я мог хранить этот тип конфигурации в другом месте, но сохранение его в exe соответствует требованиям к переносимости для моего приложения. Я был бы признателен за любую помощь и/или советы по наилучшему способу сделать это.

Спасибо!

Update: Я нашел некоторый код в проекте Metasploit, который, кажется, чтобы сделать это: MSF:Util:Exe

+4

Это очень опасно, если это возможно сделать надежно. Можете ли вы опубликовать эти требования к переносимости, чтобы выяснить, почему это лучший способ? – 2010-11-27 01:03:17

ответ

4

Я бы не стал возиться с самим EXE, если вам действительно нужен 1 файл, затем выполните старый трюк zip append и поместите туда свои конфиги.

может выглядеть следующим образом:

> BINARY DATA 
> ZIP FILE DATA 
> 32bit unsigned int which's value is the size of the appended zip file 

Плюсы:

  • легко расширить/поддерживать
  • вы не запутались с самого ехе
  • вы можете поместить много вещей в нем

Contras:

  • Вы должны связать некоторое сжатие Lib

Если вы не хотите, чтобы пронестись его, то просто написать простой сжатый архив вещь самостоятельно.

0

В файле PE является глобальным переездов table- это список адресов (например, глобальные переменные или константы, которые должны храниться во время выполнения, например, строки), которые должны быть изменены загрузчиком PE. Если бы вы знали, какая запись была этой конкретной переменной, вы можете получить ее адрес, а затем изменить его вручную. Однако это будет полная сука, и вам понадобятся глубокие знания вашего любимого компилятора и формата PE. Легче просто использовать XML или Lua или что-то еще, что полностью портативно - они были изобретены именно для такого рода целей.

Edit:

Почему бы просто не использовать константный символ **? Есть ли что-то не так, что это обычная переменная времени выполнения?

0

IMO лучшее место для хранения этих строк в ресурсе таблицы строк. Он включен в ваш .EXE-файл, поэтому переносимость не будет скомпрометирована.

Use the visual studio editor, чтобы изменить эти значения.

Используйте LoadString WinAPI, или лучше, CString::LoadString, в вашем коде, чтобы загрузить значения.

Существует также 3-х стороннее программное обеспечение, позволяющее изменять строки в скомпилированном .EXE без перекомпиляции.

Смежные вопросы