gpt4 book ai didi

pointers - 游戏训练器如何更改内存中的动态地址?

转载 作者:行者123 更新时间:2023-12-02 14:26:27 29 4
gpt4 key购买 nike

假设我是一个游戏,并且我有一个包含我的健康状况的全局 int*。游戏训练师的工作是将这个值修改为任意值以实现上帝模式。我查阅了游戏训练器的教程来了解它们是如何工作的,总体思路是使用内存扫描器来尝试找到某个值的地址。然后通过注入(inject)dll或者其他什么方式修改这个地址。

但是我制作了一个带有全局 int* 的简单程序,并且每次运行应用程序时其地址都会发生变化,所以我不明白游戏培训师如何对这些地址进行硬编码?还是我的例子错了?

我错过了什么?

最佳答案

通常完成此操作的方法是跟踪从静态变量到包含相关变量的堆地址的指针链。例如:

struct CharacterStats
{
int health;
// ...
}

class Character
{
public:
CharacterStats* stats;

// ...

void hit(int damage)
{
stats->health -= damage;
if (stats->health <= 0)
die();
}
}


class Game
{
public:
Character* main_character;
vector<Character*> enemies;
// ...
}

Game* game;

void main()
{
game = new Game();
game->main_character = new Character();
game->main_character->stats = new CharacterStats;

// ...

}

在这种情况下,如果你按照mikek3332002的建议,在Character::hit()函数中设置断点并nop执行减法,那么所有角色,包括敌人,都会变得无懈可击。解决方案是找到“game”变量的地址(它应该驻留在数据段或函数的堆栈中),并跟踪所有指针,直到找到 health 变量的地址。

一些工具,例如 Cheat Engine ,具有自动执行此操作的功能,并尝试自行查找指针链。不过,对于更复杂的情况,您可能不得不诉诸逆向工程。

关于pointers - 游戏训练器如何更改内存中的动态地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926739/

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