【发布时间】:2023-03-30 18:50:01
【问题描述】:
main.c中的代码
#include <stdio.h>
#include <unistd.h>
int main() {
int c_variable = 0; // the target
for(int x = 0; x < 100; x++) {
c_variable += 5; // increase by 5 to change the value of the int
printf("%i\n", c_variable); // print current value
sleep(8); // sleep so I have time to scan memory
}
return 0;
}
我想要实现的是读取整数c_variable,然后在另一个 .c 程序中对其进行修改。我在 linux 上,所以我做了ps -A | grep main 并得到了正在运行的程序的 PID。然后我做了sudo scanmem PID 并输入了c_variable 的当前值几次。我只剩下三个内存地址,执行命令set 500 更改了程序打印的值,有效地将内存地址的值更改为 500 而不是 35 或程序当前的任何值。然后我执行了以下代码
#include <stdio.h>
int main() {
const long unsigned addr = 0x772d85fa1008; // one of the three addresses from scanmem
printf("%lu\n", addr);
return 0;
}
但我得到了一些随机的长串数字,而不是当前数字。我读过的关于如何在 linux 上读写内存的教程和答案不必使用long unsigned,而是可以使用 char* 或只使用 int* 。我的内存地址似乎有点长,我以前没有看到内存地址那么久。无论如何,如何读写整数c_variable的内存地址?
编辑:scanmem 的输出看起来像这样
info: we currently have 3 matches.
3> list
[ 0] 7771ff64b090, 6 + 1e090, stack, 20, [I64 I32 I16 I8 ]
[ 1] 7771ff64b5d8, 6 + 1e5d8, stack, 20, [I64 I32 I16 I8 ]
[ 2] 7771ff64b698, 6 + 1e698, stack, 20, [I32 I16 I8 ]
3> set 50
info: setting *0x7771ff64b090 to 0x32...
info: setting *0x7771ff64b5d8 to 0x32...
info: setting *0x7771ff64b698 to 0x32...
输出
...
150
155
160
165
170
175
55
60
65
...
【问题讨论】:
-
您打印的是实际地址号码,而不是地址上的号码。
-
随机数字串是否与 0x772d85fa1008 或其十进制表示 131037404991496 相同?
-
您知道当前大多数操作系统中两个正在运行的程序的地址空间是相互独立的吗?同一个地址在不同的程序中可以保存不同的值。
-
@Yunnosch 你能给我推荐一个学习资源吗?
-
一个有效的问题,但我不得不让你失望。我不知道有什么值得推荐的资源。