В качестве примера того, как изменить переменную в программе «извне», рассмотрим использование отладчика. Пример программы:
$ cat print_i.c
#include <stdio.h>
#include <unistd.h>
int main (void) {
int i = 42;
for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
return 0;
}
$ gcc -g -o print_i print_i.c
$ ./print_i
i = 42
i = 42
i = 42
…
(Программа печатает значение i
каждые 3 секунды.)
В другом терминале найдите идентификатор процесса работающей программы и подключите к нему отладчик gdb
:
$ ps | grep print_i
1779 p1 S+ 0:00.01 ./print_i
$ gdb print_i 1779
…
(gdb) bt
#0 0x90040df8 in mach_wait_until ()
#1 0x90040bc4 in nanosleep ()
#2 0x900409f0 in sleep ()
#3 0x00002b8c in main () at print_i.c:6
(gdb) up 3
#3 0x00002b8c in main () at print_i.c:6
6 for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
(gdb) set variable i = 666
(gdb) continue
Теперь вывод программы изменяется:
…
i = 42
i = 42
i = 666
Так что, да, можно изменить переменную программы «извне», если у вас есть доступ к ее памяти. Здесь много предостережений, например нужно найти, где и как хранится переменная. Здесь было легко, потому что я скомпилировал программу с отладочными символами. Для произвольной программы на произвольном языке это намного сложнее, но все же теоретически возможно. Конечно, если бы я не был владельцем запущенного процесса, то хорошо функционирующая операционная система не позволила бы мне получить доступ к ее памяти (без «взлома»), но это совсем другой вопрос.