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



  

相关话题

  到1949年为止我们中国制造的科技含量最高的武器是啥? 
  如果科技有两个方向,VR的虚拟世界和服务机器人的世界,你选择那个? 
  双十一换手机到底该选4G还是5G? 
  如何减少团队的低质量代码? 
  信息技术中文字到底是什么? 
  掌握很多门计算机编程语言会不会记串啊?记串了咋办? 
  如何看待 2019 年麻省理工选出的全球十大突破性技术,你觉得其中哪个技术会在 5 年内产生巨大影响? 
  如何理解子网掩码? 
  为什么 C++ 没有 C 语言快? 
  有人号称编程零基础学C#4天,用记事本1分钟写个计算器,而且信誓旦旦,这是怎么回事? 

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





© 2024-09-21 - tinynew.org. All Rights Reserved.
© 2024-09-21 - tinynew.org. 保留所有权利