gpt4 book ai didi

windows - C/C++程序中怎么会有静态地址?

转载 作者:IT王子 更新时间:2023-10-28 23:39:10 27 4
gpt4 key购买 nike

我一直在研究 Cheat Engine ,它允许您检查和操作 Windows 上正在运行的进程的内存:您根据变量的值扫描变量,然后您可以修改它们,例如在游戏中作弊。

为了编写机器人或类似的东西,您需要为要更改的变量找到一个静态地址 - 即,如果进程重新启动,该地址保持不变。其方法大致如下:

  1. 寻找你感兴趣的变量的地址,按值搜索
  2. 使用该地址查找代码,例如找到它所属的结构的地址(因为结构偏移是固定的)
  3. 寻找另一个指向该指针的指针,直到找到具有静态地址的指针(在 Cheat Engine 中显示为绿色)

从我看过的教程来看,它似乎工作得很好,但我无法理解为什么它工作。

不是所有变量(包括全局静态变量)在运行时都会获得相当随机的地址吗?

额外问题:

  1. Cheat Engine 如何判断地址是否是静态的(即重启时会保持不变)?
  2. 一个教程提到了许多旧游戏和一些现代游戏(例如使命召唤 4)使用静态地址这一事实。这怎么可能?

最佳答案

我将首先回答附加问题,因为它们介绍了一些您可能需要了解的概念才能理解主要问题的答案。

如果您知道可执行文件是如何工作的,那么回答第一个额外问题很容易:所有全局/静态变量都在 .data 部分中,.exe 在其中存储了部分,所以 Cheat Engine 只检查变量是否在这个地址范围内(从这个部分到下一个部分)。

对于第二个问题,可以只使用静态地址,但这对于游戏来说几乎是不可能的。甚至那些年长的。教程创建者可能想说的是,他想要的所有变量实际上都有一个指向它们的静态指针。但是仅仅因为你创建了一个局部变量,或者甚至将一个参数传递给一个函数,它们的值就被存储到了堆栈中。这就是为什么几乎不可能拥有“仅静态”程序的原因。即使你编译了一个实际上什么都不做的程序,它也可能会在堆栈中存储一些东西。

对于整个问题本身,并不是所有的动态地址变量都指向一个全局变量。这完全取决于程序员。例如,我可以创建一个局部变量,并且从不将其地址分配给 C 程序中的全局/静态指针。在这种情况下,找到该地址的唯一确定方法是实际知道变量第一次在堆栈中赋值时的代码。

有些变量具有动态地址,因为它们只是局部变量,它们在第一次被赋值时存储在堆栈中。

其他一些变量具有静态地址,因为它们被声明为编译器的全局变量或静态变量。这些变量有一个固定的地址偏移量,它是可执行文件中 .data 部分的一部分。

可执行文件里面的每个节都有一个固定的偏移地址,.data节也不异常(exception)。

但值得注意的是,可执行文件本身内部的偏移量是固定的。在操作系统中,情况可能会有所不同(所有随机地址),但这是操作系统的工作,为您抽象这类东西(在这种情况下创建可执行文件的虚拟地址空间)。所以看起来静态变量实际上是静态的,但只在可执行文件的内存空间内。 RAM 上的东西可能在任何地方。

最后,很难尝试向您解释这一点,因为您必须了解可执行文件的工作原理。一个好的开始是寻找一些关于低级编程的解释,比如堆栈框架、调用约定、汇编语言本身以及编译器如何使用一些众所周知的技术来管理函数(一般的作用域)、全局/静态/本地/constant 变量和内存系统(节、堆栈等),也许还有一些对 PE(甚至是 ELF)文件的研究。

关于windows - C/C++程序中怎么会有静态地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541580/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com