为什么游戏修改器能修改其它程序的内存?

2020-09-26 16:49:45 +08:00
 aiqier

操作系统不是使用虚拟地址空间管理每个进程的内存,每个进程的内存空间是独立的,其它进程访问不到的么,那为啥可以写游戏修改器,修改游戏程序的内存变量。

3246 次点击
所在节点    程序员
12 条回复
CEBBCAT
2020-09-26 16:58:09 +08:00
kernelpanic
2020-09-26 17:04:27 +08:00
操作系统提供了 API 呗...
lin07hui
2020-09-26 17:08:35 +08:00
不是修改程序内存变量,是直接改写内存的内容(就像改硬盘内容)。
找个制作游戏修改器教程看一下,或用一下这个 Cheat Engine 软件,就明了。
nightwitch
2020-09-26 17:10:08 +08:00
操作系统提供支持啊,不然调试器怎么去看进程的变量。
Linux 下去查
pread
pwrite

Windows 下查
OpenProcess
ReadProcessMemory
WriteProcessMemory
Huelse
2020-09-26 17:42:22 +08:00
肯定是系统提供了支持呀,想想 VS 里的堆栈内存追踪,你又没往你程序里写这些,总不至于编译器自动给你加进去吧
reus
2020-09-26 17:46:03 +08:00
操作系统除了有隔离,也能让其他进程访问进程内存,例如调试器就是独立的进程
thedrwu
2020-09-26 17:55:07 +08:00
有权限可以直接读写,Read/WriteProcessMemory 。
或者 DLL 直接挂到别的进程。
Nitroethane
2020-09-26 18:06:50 +08:00
@nightwitch Linux 下是 ptrace 系统调用,不是 pread
crclz
2020-09-26 18:09:17 +08:00
分 2 种,一种 External,另一种 Internal 。
External 的,使用 WindowsAPI OpenProcess ReadProcessMemory WriteProcessMemory 来操作内存。
Internal 的,通过 dll 注入,直接附着到目标进程,就像在自己家里面一样,例如可以直接`player->health = 5000;`
codehz
2020-09-26 18:25:06 +08:00
@nightwitch pread pwrite 不是你想象的那个 p,直接读写应该是 /proc/xxx/mem,间接的可以 ptrace 进去读写
virusdefender
2020-09-26 18:33:10 +08:00
你可以理解为 gdb 一样的东西
mazhan465
2020-09-27 10:01:57 +08:00
除了直接读写指定进程内存,也可以通过替换动态链接库的方式 hook 进程,不过权限要求比较高

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/710687

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX