植物大战僵尸外挂原理-程序的内存访问

由 Greyson 发布

操作系统给一个程序分配的内存

假如你在玩植物大战僵尸,你想把你的阳光值改成无限,那么该怎么办?

以32位机,字节编址的机器为例

根据上图可知,存储阳光值变量的地址为:0x000000F2

要点:

  • 用户自己编写的程序是否知道物理内存的存在?
  • 两个不同的程序,在程序内部都访问了0x000000F2 地址,他们对应的值是否一样(或:他们所指向的内存单元是否一致)?
  • 阳光值的变量地址为:0x000000F2 ,该地址是物理地址还是虚拟地址?

源代码编译为二进制程序

什么时候产生逻辑地址?真题【2011-30】

2^10=1024 > 1K 1M 1G

32位机器,把所有地址都分配给进程,可以让进程感觉有多大的内存可以用? 4GB = 2^32B

你是银行行长,你只有一亿现金,但是你给每个人的贷款额度也都是一亿。因为大概率不会有人直接借走一亿。

虚实地址转换

程序给CPU一个虚拟地址,CPU把虚拟地址换成物理地址,CPU通过物理地址查询内存并把数据返回给程序

角色 对应看到
玩家 ☀️阳光值
高级程序员(C/Java/Python等) 💻变量 sumShine
汇编程序员 👴变量的虚拟地址: 0x000000F2
CPU 通过MMU把0x000000F2转换为 0x00001

  • MMU机构

  • 如何区分中断和异常?
  • 缺页是中断还是异常?

如何自己编写外挂来修改其他程序的内存?

首先,每个进程的虚拟地址空间都是独立的,而且程序员是无法操作内存的物理地址,那要怎么改阳光值?

进程

  • 定义:是一个程序的执行实例,是操作系统资源分配的基本单位
  • 特点:
  1. 独立性:每个进程都有自己的地址空间、全局变量、文件描述符等资源。

  2. 资源分配:操作系统为每个进程分配独立的资源,如内存、文件、I/O设备等。

  3. 安全性:进程之间相互独立,一个进程的崩溃不会影响其他进程。

  4. 开销大:创建和销毁进程需要较多的系统开销(如内存分配、表项维护)。

  • 通信方式:管道、消息队列、共享内存、信号等

线程

  • 定义:线程是进程中的一个执行单元,是CPU调度的基本单位。
  • 特点:
  1. 共享性:同一进程的线程共享进程的地址空间、全局变量、文件描述符等资源。

  2. 独立性:每个线程有自己的栈、程序计数器和寄存器。

  3. 效率高:创建和销毁线程的开销较小,线程切换的速度较快。

  4. 安全性较低:因为线程共享进程的资源,一个线程的崩溃可能导致整个进程的崩溃。

进程与线程的对比

属性 进程 线程
定义 操作系统资源分配的基本单位 CPU调度的基本单位
地址空间 独立 共享
资源 独立 共享
创建和销毁开销
通信方式 复杂(IPC) 简单(共享内存)
崩溃影响范围 进程间独立,一个进程崩溃不影响其他进程 线程共享进程资源,一个线程崩溃可能影响整个进程

使用场景

  • 进程:适用于需要较高隔离性和独立性,以及需要分配较多资源的任务。例如,独立的应用程序、服务等。
  • 线程:适用于需要高效并发执行,共享数据和资源的任务。例如,多线程服务器、并行计算等。

通过理解进程和线程的特点和差异,可以根据具体应用需求选择合适的并发模型,以优化系统性能和资源利用率。

那么假设操作系统提供了一种特殊的系统调用,能够让你写的程序给其他应用进程中注入一个线程,那么你的程序是不是可以改其他应用程序的内存?

比如你写了一个外挂程序,通过从植物大战僵尸.exe注入一个线程,这个线程执行的是你自己写的代码程序,就能够完成对游戏内存的自由修改。


扫描二维码,在手机上阅读
收藏

0条评论

发表评论


验证码