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



  

相关话题

  王小波的计算机水平有多好? 
  句柄是什么? 
  如何评价何同学最新视频:我做了苹果放弃的产品——AirDesk? 
  你有哪些最装逼而且成功的神操作? 
  为什么中国出了这么多厉害的互联网公司,但没有自己设计过编程语言? 
  汽车行业目前有什么高大上的科技技术?你对未来汽车高科技有什么期待? 
  2000元左右有什么笔记本电脑推荐? 
  去互联网公司/软件公司(技术岗) 实习要注意哪些问题? 
  学 C# 的是不是被绑在 Windows 上? 
  学习编程必须要会英语吗? 

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





© 2025-01-27 - tinynew.org. All Rights Reserved.
© 2025-01-27 - tinynew.org. 保留所有权利