Я не уверен, что есть какое-либо значение в изменении исполняемых файлов таким способом. Если вам нужны разные копии программы для использования разных опций, попробуйте использовать файлы конфигурации или переменные среды.
Вы также найдете невозможным распространить модифицированное приложение, если вы используете подпись кода, Без действительной подписи люди будут совсем не склонны запускать ваш код вообще.
Сказав это, я не думаю, что есть смысл начинать подробное изучение форматов исполняемых файлов, чтобы достичь чего-то такая маленькая ценность. Таким образом, вы можете упростить себе жизнь, отметив местоположение данных, которые вы хотите изменить. Вот простой пример того, как вы могли бы сделать это. (Я использую Ma c OS здесь, но аналогичный подход может работать и в Windows.)
Исходный код:
Простая программа, которая печатает число 1 и выходит , Сохраните его в файле с именем app1.c
.
#include <stdio.h>
int main() {
volatile unsigned int v[3] = { 0xdeadbeef, 0x00000001, 0xbadc0de };
printf("This is app%u\n", v[1]);
return 0;
}
Ключевое слово volatile
указывает компилятору сохранить этот массив в скомпилированном коде, даже если его можно оптимизировать.
Скомпилировать:
Скомпилировать исходный код в приложение под названием app1
.
cc app1.c -o app1
Изменить:
Запустить однострочный Perl скрипт для изменения значения v[1]
от 1 до 2 и сохраните результат в файле с именем app2
. Команда chmod 0755
делает выходной файл исполняемым.
perl -pe 's/\xef\xbe\xad\xde\x01\x00\x00\x00\xde\xc0\xad\x0b/\xef\xbe\xad\xde\x02\x00\x00\x00\xde\xc0\xad\x0b/' <app1 >app2
chmod 0755 app2
Примечание. На компьютерах x86 (что в настоящее время означает большинство настольных ПК) значения int
хранятся в порядке байтов с прямым порядком байтов. По этой причине байты, используемые для соответствия содержимому v[]
, отображаются в обратном порядке (например, ef be ad de
вместо de ad be ef
).