gpt4 book ai didi

c - 如何在Linux中读取和更改内存中的值?

转载 作者:行者123 更新时间:2023-11-30 14:33:53 25 4
gpt4 key购买 nike

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
...

最佳答案

您正在打印实际的地址编号,但以十进制表示,而不是地址上的内容。

const int *addr = (int *) 0x772d85fa1008;
printf("%d\n", *addr);

您必须将addr声明为指针类型。更具体地说,是一个指向整数的指针。其值 (0x772d85fa1008) 保存整数的地址

然后,在 printf 调用中,您取消引用它以获取存储在该地址处的实际整数。

尽管在实践中我不能保证这是否有效,因为现代操作系统中的内存并不像你想象的那么简单。但我没有足够的知识来评估这一点。

关于c - 如何在Linux中读取和更改内存中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59120908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com