百科问答小站 logo
百科问答小站 font logo



C语言能用指针修改其他程序的地址的值吗? 第1页

  

user avatar   zhang-hao-72 网友的相关建议: 
      

跟c语言没关系,看操作系统和硬件允不允许了。

当年Dos下肯定是可以的,现在的windows就得用一些技巧了。


user avatar   xinyu-chen 网友的相关建议: 
      

这个问题下面怎么那么多人嘲讽题主的,我中学时代也思考过这个问题,后来就走上了写游戏外挂的道路。

首先要明确一个概念,在现代的操作系统里,进程访问的内存地址叫虚拟地址。虚拟地址是每个进程私有的。比如0x12345678这个地址,每个进程访问这个地址读取到的内容都是不一样的。而真正在内存上读写数据时候用到的地址叫物理地址,这些地址对应内存这个硬件上实际的地址。操作系统和CPU共同实现了从虚拟地址到物理地址的映射。所以当一个进程访问0x12345678这个地址的时候,CPU会通过这个映射机制找到它对应的物理地址,假设是0x87654321,然后去读写数据。

C语言里的指针存储的是虚拟地址,所以它只能访问当前进程里的内存数据。假如你通过某种方法找到了一个游戏里的数据的内存地址,0x12345678, 用指针访问的时候,实际上访问的是当前这个进程里0x12345678对应的物理地址里的数据。如果你试图向这个地址写入数据,很有可能这个地址所在的页[1]不能被写入。所以才有题主提到的那个错误。

操作系统提供了一些API使得我们可以在一个进程里修改另一个进程的内容,有很多种方法。最常用的是共享内存,不过这种方式并不适用于修改游戏里的数据。因为共享内存需要两个进程提前“协商”好,而游戏程序显然不希望其他程序随意修改它的内存。在Windows里,需要首先使用OpenProcess函数打开另一个进程,然后找到需要修改的内存地址,再调用WriteProcessMemory函数写入数据。具体实现当然比这个要复杂一点,可以参考王艳平等著作的《Windows程序设计》一书[2],第二章第5节就完整实现了一个内存修改器的例子,代码多半可以在网上找到。

很多时候仅仅修改游戏的数据是不够的。比如射击游戏里子弹的数量,如果每打几下就要改一下内存,非常麻烦。我们还可以通过修改程序的代码来实现更加复杂的效果。以后有时间我会写点文章讲一下原理。

有人提到写外挂是违法的,但是写单机游戏的修改器不违法,反而能为单机游戏增添不少乐趣。

参考

  1. ^ 系统管理内存的一个单位,可以理解为一块连续的内存空间。
  2. ^Windows程序设计 Windows程序设计 作者: 王艳平,张铮编著 https://book.douban.com/subject/2382149/



  

相关话题

  为什么在计算机科学领域及编程中不使用现代数学建立的符号体系进行操作? 
  C++ 有多难? 
  长得丑的女程序员如何向男程序员讨教如何写代码? 
  如何看待华为内部处罚通报任正非被罚一百万,其他四名高管各罚50万? 
  开始慢慢抄代码敲对自己编程提高有用吗? 
  哪一个瞬间,你发现祖国比想象的更强大? 
  国际奥委会主席巴赫点赞中国技术,称「北京冬奥将书写历史」,本届冬奥会有哪些「颠覆性新技术」值得关注? 
  按照现在硬件发展的速度,是否还需要高效的代码? 
  为什么MSVC比GCC/Clang差(功能支持也差,译后性能也差),微软做不好一个C语言编译器吗? 
  为什么耳机线因为虚接的时候,会自动产生「除去主唱保留伴奏」的效果? 

前一个讨论
在未来的五年到十年内,Linux将会替代Windows成为主流操作系统吗?
下一个讨论
怎么给新买的固态硬盘安装win10系统?





© 2024-05-20 - tinynew.org. All Rights Reserved.
© 2024-05-20 - tinynew.org. 保留所有权利