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



  

相关话题

  马斯克发文称特斯拉暂停使用比特币支付,会对比特币带来什么影响? 
  Uber 的工资待遇怎样? 
  你觉得印度未来的发展方向是怎样的? 
  如何评价《中国全屋Wi-Fi白皮书》,对我们的生活有哪些影响? 
  如何看待代码中的中文变量名? 
  要实现《头号玩家》里的游戏世界,需要消耗多少金钱和资源? 
  如何看待 NIPS 2018 submission达到近 5000 篇? 
  罗永浩曝下一个创业项目是「元宇宙公司」,此前他曾表示「不相信元宇宙会成为未来」,你看好他的选择吗? 
  路由表里的子网掩码有什么作用? 
  如何看待改革开放以来武汉从强势到疲软再到强势的发展轨迹? 

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





© 2025-05-29 - tinynew.org. All Rights Reserved.
© 2025-05-29 - tinynew.org. 保留所有权利