Как изменить значение переменной в исполняемом файле, записанном C? - PullRequest
1 голос
/ 01 апреля 2020

Например, я написал простую C программу:

#include<stdio.h>
int a;
int main(){
    printf("a:%d\n", a);
    return 0;
}

Затем я использую g cc, чтобы скомпилировать ее, и она выводит исполняемый файл a.exe.
Теперь я хочу написать другую программу для чтения a.exe и изменить значение переменной a.
Как я могу это сделать?


Я просто хочу сохранить некоторые данные, а не взломать.
Есть ли библиотеки, которые помогут мне сделать это?

Ответы [ 2 ]

3 голосов
/ 01 апреля 2020

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

Вы также найдете невозможным распространить модифицированное приложение, если вы используете подпись кода, Без действительной подписи люди будут совсем не склонны запускать ваш код вообще.

Сказав это, я не думаю, что есть смысл начинать подробное изучение форматов исполняемых файлов, чтобы достичь чего-то такая маленькая ценность. Таким образом, вы можете упростить себе жизнь, отметив местоположение данных, которые вы хотите изменить. Вот простой пример того, как вы могли бы сделать это. (Я использую 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).

1 голос
/ 01 апреля 2020

Вам нужно написать программу для чтения исполняемого файла и внесения соответствующих изменений. На Windows ваша программа должна понимать формат файла Portable Executable . На Linux и многих других Unix подобных ОС ваша программа должна понимать ELF или a.out или, возможно, COFF . Mac и другие устройства Apple используют Mach-O . Gosh таких форматов много - ваша программа должна быть довольно умной.

...