百科问答小站 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/



  

相关话题

  如何看待罗永浩透露锤子科技将于 5 月 15 号在鸟巢开万人发布会,发布颠覆性产品? 
  使用命令行形式的程序的时候,能不能把需要输入的命令们提前编制好,再自动执行呢? 
  如何看待脸书威胁,如果欧盟坚持不能将用户数据传回美国,就将退出欧洲? 
  国外的程序员是如何保养「革命的本钱」? 
  美国作为当今世界上最强大的发达国家,会被其他国家超越吗? 
  如果现在全世界合力建造一台《流浪地球》中的行星发动机,将会有哪些难点? 
  中国传统文化对科技创新抑制大于支持吗? 
  为什么程序语言要设计成使用这么多shift? 
  从《头号玩家》再到《失控玩家》,物理世界与虚拟世界的墙是否正在被打破? 
  程序员开发进度太慢被公司告上法庭,索赔 90 万,如何评价该公司的这种行为? 

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





© 2025-04-13 - tinynew.org. All Rights Reserved.
© 2025-04-13 - tinynew.org. 保留所有权利