Редактировать строки Vars в скомпилированном EXE? C ++ win32 - PullRequest
4 голосов
/ 20 мая 2010

Я хочу, чтобы в моем приложении c ++ было несколько строк, и я хочу иметь возможность редактировать их позже в развернутых приложениях (скомпилированный exe), Есть ли способ заставить exe редактировать себя или ресурсы чтобы я мог обновить значение строки?

Приложение проверяет наличие обновлений при запуске, поэтому я подумываю использовать его для отправки команды, когда мне нужно отредактировать строки (например, строку, содержащую URL-адрес, используемый для проверки обновлений).

Я не хочу использовать что-либо внешнее для exe, я мог бы просто использовать реестр, но я предпочитаю хранить все внутри exe.

Я использую Visual Studio 2010 C ++ (или любую другую версию MS Visual C ++).

Ответы [ 6 ]

6 голосов
/ 20 мая 2010

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

3 голосов
/ 20 мая 2010

Другая идея состоит в том, чтобы переместить строки в файл «конфигурации», такой как в формате XML или INI.

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

Обратите внимание, что некоторые средства проверки на вирусы выполняют контрольные суммы CRC или контрольные суммы для исполняемых файлов. Изменение исполняемых файлов - это красный флажок для этих средств проверки на вирусы.

2 голосов
/ 20 мая 2010

Это невозможно, если только ваши строки не изменятся в позиции и длине.

Итак, чтобы сделать это возможным: сделайте «размер», в вашем примере, URL, который используется для получения обновлений, довольно большим (представьте: 512 символов, заполненных нулями в конце). Таким образом, у вас есть место для обновления строки.

Почему нельзя использовать строки переменного размера? Ну, я могу объяснить это с помощью небольшого фрагмента ассемблера x86:

PUSH OFFSET test.004024F0

Скажем так; со смещением test.004024F0 - строка переменного размера. Теперь рассмотрим изменение:

Я хочу вставить строку, которая длиннее исходной строки и хранится перед строкой в ​​004024F0: это переводит 004024F0 в новое значение, скажем: 004024F5 (новая строка, до этой записи, на 5 символов длиннее оригинала).

Вы думаете, что это просто: найти все 004024F0 и заменить его на 004024F5? Неправильный . 004024F0 также может быть обычной «инструкцией» (если быть точным: ADD BYTE PTR DS:[EAX+24],AL; LOCK ...). Если эта инструкция окажется в вашем коде, она будет заменена чем-то неправильным.

Ну, вы можете подумать, а как насчет поиска этой PUSH инструкции? Неправильно : есть практически неограниченные способы «НАЖАТЬ». Например, MOV EAX, 004024F0; MOV ESP, EAX; ADD ESP, 4. Существует также вероятность того, что поле рассчитывается: MOV EAX, 00402000; ADD EAX, 4F0; .... Так что это делает его «практически неограниченным».

Однако, если вы используете поля статического размера; вам не нужно менять код, ссылающийся на строки. Если вы зарезервировали достаточно места для определенного поля, то вы можете легко написать «более длинную» строку, чем оригинал, потому что размер строки рассчитывается путем нахождения первого «нулевого байта»; заполнить остальную часть поля нулями.

Если вы используете поля статического размера, однако, очень трудно найти «позицию в файле» во время компиляции. Учитывая много времени, потраченного на взлом вашего собственного приложения; Вы можете написать код, который изменяет .exe и сохраняет новое значение String с указанным смещением. Это смещение файла не известно во время компиляции, и вы можете исправить это смещение файла позже, используя инструмент, подобный OllyDbg . Это позволяет исполняемому файлу залатать себя: -)

1 голос
/ 20 мая 2010

Теоретически BeginUpdateResource, UpdateResource и EndUpdateResource предназначены для этой цели.На самом деле, заставить их работать вообще довольно сложно.Я совсем не уверен, что они будут работать для обновления ресурсов в запущенном исполняемом файле.

1 голос
/ 20 мая 2010

Не желаю наказывать, но это не похоже на отличную идею. Наличие URL-адреса для проверки наличия обновлений в программе делает ее негибкой.

Вы пытаетесь смягчить негибкость, переписав строки в вашем exe. Это действительно напрашивается на неприятности:

  • Вы уверены, что пользователи, запускающие вашу программу, имеют разрешение на запись, чтобы иметь возможность обновить exe? Пользователи по умолчанию не имеют права на запись в файлы, установленные в папке программы.
  • Если программа запускается несколькими пользователями или просто несколько раз одним и тем же пользователем, исполняемый файл будет заблокирован и не может быть изменен
  • Системным администраторам будет сложно настроить URL.
  • Существует реальный риск, что вы испортите свой exe. Процесс перезаписи, вероятно, будет сложным, особенно если вы хотите, чтобы URL был длиннее, чем выделено в настоящее время.
  • Изменяя ваш exe-файл, вы исключаете возможность использования подписи кода, которая может быть полезна в сетевой среде.

Реестр (несмотря на все его слабые стороны) - это именно то место, куда должны идти данные конфигурации. Вы можете поместить значение по умолчанию в свой EXE, но если вам нужно внести изменения, внесите их в реестр. Это делает изменения прозрачными, а потом избавляет вас от горя.

Ваш алгоритм, который хочет написать новый URL для обновлений, должен сделать это, записав его в реестр. Кроме того, есть файл конфигурации, который поставляется вместе с вашим exe-файлом, и обновите его. (Но имейте в виду, что у вас есть права пользователя - у вас может не быть прав на запись в этот файл, но вы всегда можете записать куст реестра пользователя.)

1 голос
/ 20 мая 2010

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

...