【发布时间】:2021-03-02 13:34:06
【问题描述】:
我是 c 编程新手。有一个用例:我需要更改特定内存地址中的值。
int main(){
int *p;
p = 0x111;
*p = 100;
return 0;
}
但是,我无法编译上述代码。它显示了以下问题。
test.c:10:7: warning: incompatible integer to pointer conversion assigning to 'int *' from 'int' [-Wint-conversion]
p = 0x111;
^ ~~~~~
1 warning generated.
我尝试过如下投射:
int main(){
int *p;
p = (int *) 0x111;
*p = 100;
return 0;
}
它可以编译,但是,当我运行它时,它显示segmentation fault。
我的问题:
-
有没有办法强制编译和运行这段代码?我知道有野指针问题。但是,操作内存是一个常见的用例。例如,当我玩本地游戏时。不知何故,我知道游戏运行时我的玩家健康点的具体内存地址,例如地址 = 0x123。如何只更改 0x123 中的值?
-
如果我不能使用上述方式来操作任何特定内存地址中的值,还有其他标准方式来实现我的用例吗?
PS: 顺便说一句,我找到了实现我的用例的示例方法。
可以参考源码:https://github.com/haseeb-heaven/GTLibc/
How do game trainers change an address in memory that's dynamic?
https://www.youtube.com/watch?v=cRCnN987gd8&ab_channel=HaseebMir
【问题讨论】:
-
您需要将其转换为指针。但是,请注意,如果该地址在您的应用程序范围“之外”。然后,您将收到一个尝试访问和不允许访问的地址的段错误。
-
您不能在具有受保护内存寻址的操作系统中执行此操作,现在基本上都是这样。除此之外,一个进程的地址空间与另一个进程完全不同,它们甚至不在同一个星球上。当直接在另一个进程中使用时,来自一个进程的指针完全没有意义。除非这是 DOS 之类的代码,否则它不会工作。
-
你的平台是什么?
-
@maplemaple 那么你不能那样做。你实际上想要达到什么目的?
-
这能回答你的问题吗? Reading Other Process' Memory in OS X?