Windows内存管理中的内存访问控制:为何无法通过ACL阻止作弊进程访问游戏内存?
为什么Windows内核无法用ACL或其他访问控制方法禁止作弊程序访问游戏进程内存?
ACL的设计场景不匹配:ACL是用来管控命名内核对象(比如文件、注册表项、管道)的访问权限,进程的私有内存属于进程地址空间的一部分,并不是这类可被ACL保护的独立对象。Windows内核从一开始就没给进程内存关联ACL的机制,自然没法用ACL来限制跨进程内存访问。
跨进程内存访问的权限逻辑不靠ACL:要访问其他进程内存,核心是先通过
OpenProcess拿到目标进程的句柄,再调用ReadProcessMemory/WriteProcessMemory。这里的权限管控看两个点:一是打开进程时请求的访问权限(比如PROCESS_VM_READ),二是调用进程的令牌权限——如果是管理员权限的进程,默认拥有SE_DEBUG_NAME权限,能绕过绝大多数限制打开任意进程。至于内存页的保护属性(如PAGE_READONLY),只管控同一进程内的内存访问,跨进程只要拿到合法句柄,页属性只影响能不能读写,不影响能不能访问该进程的内存空间。内核级作弊直接绕开所有用户态控制:很多作弊程序是驱动级的,运行在内核态。内核态代码可以直接访问任意进程的地址空间,根本不需要通过用户态的内存访问API,ACL这类用户态/对象级的控制对内核态代码完全无效。
兼容性限制:Windows本身允许大量合法的跨进程内存访问场景,比如调试器、内存分析工具、输入法、系统监控程序等。如果强行给进程内存加上类似ACL的限制,会直接破坏这些合法程序的运行,这是Windows设计时不能接受的 trade-off。
内容的提问来源于stack exchange,提问作者Ahmed Waleed
相关产品推荐
相关产品推荐

