程序可以直接分配内存吗?

Tat*_*tat 6 memory security programming-languages

是否有任何真正的低级编程语言可以直接访问内存变量?例如,如果我有一个程序有一个变量i.任何人都可以访问内存以将我的程序变量更改i为其他值吗?

Ark*_*kku 7

作为如何从"外部"更改程序中的变量的示例,请考虑使用调试器.示例程序:

$ 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
…
Run Code Online (Sandbox Code Playgroud)

(程序打印i每3秒的值.)

在另一个终端中,找到正在运行的程序的进程ID并将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
Run Code Online (Sandbox Code Playgroud)

现在程序的输出发生了变化:

…
i = 42
i = 42
i = 666
Run Code Online (Sandbox Code Playgroud)

所以,是的,如果您有权访问其内存,则可以从"外部"更改程序的变量.这里有很多警告,例如,需要找到存储变量的位置和方式.这很简单,因为我用调试符号编译了程序.对于任意语言的任意程序来说,它要困难得多,但理论上仍然可行.当然,如果我不是正在运行的进程的所有者,那么一个表现良好的操作系统将不允许我访问它的内存(没有"黑客"),但这是另一个问题.