查找具有 'find out what writes to this address' 奇怪偏移量的指针
Finding pointer with 'find out what writes to this address' strange offset
我正在尝试为 UrbanTerror42 找到一个基指针。
我的设置如下,我有一个有 2 个玩家的服务器。
cheat-engine 在客户端 a 上运行。
我和客户 b 一起爬梯子,然后扫描 incease/decrease。
找到值后,我使用 find out what writes to this address
。
但是偏移量非常高并且指向空内存。
我真的不知道如何进行
为了清楚起见,我查了其他几个值,它们都有同样的问题
我已经看过很多教程和论坛,但这些都是关于偏移量在 0 到 100 之间而不是 80614 之间的值。
如果有人能告诉我为什么会发生这种情况以及我必须 do/learn 继续做什么,我将不胜感激。
提前致谢
Urban Terror 使用 Quake 引擎。该引擎的早期版本使用 Quake 虚拟机,游戏逻辑作为字节码实现,由 Quake 虚拟机编译成程序集。自定义分配例程用于将这些模块加载到内存中,相对和硬编码 offsets/addresses 在 运行 时创建以适应这些重定位,并且不使用 por[ 的正常重定位 table 方法=29=] executable 文件格式。这就是为什么您每次 运行 游戏时都会看到这些看似奇怪的数字发生变化的原因。
Quake 虚拟机的文件格式为 .qvm,内存中的这些 qvm 在 QVM table 中进行跟踪。你必须找到 QVM table 才能揭开这个谜团。找到 2-3 个 QVM 并记录它们的地址后,找到 table 就很容易了,因为您只需扫描指向这些地址的指针,并通过找到靠近的地址来缩小结果范围彼此的记忆。
QVM 的定义如下:
struct vmTable_t
{
vm_t vm[3];
};
struct vm_s {
// DO NOT MOVE OR CHANGE THESE WITHOUT CHANGING THE VM_OFFSET_* DEFINES
// USED BY THE ASM CODE
int programStack; // the vm may be recursively entered
intptr_t(*systemCall)(intptr_t *parms);
//------------------------------------
char name[MAX_QPATH];
// for dynamic linked modules
void *dllHandle;
intptr_t entryPoint; //(QDECL *entryPoint)(int callNum, ...);
void(*destroy)(vm_s* self);
// for interpreted modules
qboolean currentlyInterpreting;
qboolean compiled;
byte *codeBase;
int codeLength;
int *instructionPointers;
int instructionCount;
byte *dataBase;
int dataMask;
int stackBottom; // if programStack < stackBottom, error
int numSymbols;
struct vmSymbol_s *symbols;
int callLevel; // counts recursive VM_Call
int breakFunction; // increment breakCount on function entry to this
int breakCount;
BYTE *jumpTableTargets;
int numJumpTableTargets;
};
typedef struct vm_s vm_t;
你原截图中EAX的值应该与QVM结构的codeBase或dataBase成员变量相同。偏移量只是相对于这些地址。与处理 ASLR 的方式类似,您必须在 运行 时间计算地址。
这是我的代码的一个 t运行 版本,它正是这样做的,另外还从内存中获取重要的结构,例如:
void OA_t::GetVM()
{
cg = nullptr;
cgs = nullptr;
cgents = nullptr;
bLocalGame = false;
cgame = nullptr;
for (auto &vm : vmTable->vm)
{
if (strstr(vm.name, "qagame")) { bLocalGame = true; continue; }
if (strstr(vm.name, "cgame"))
{
cgame = &vm;
gamestatus = GSTAT_GAME;
//char* gamestring = Cvar_VariableString("fs_game");
switch (cgame->instructionCount)
{
case 136054: //version 88
cgents = (cg_entities*)(cgame->dataBase + 0x1649c);
cg = (cg_t*)(cgame->dataBase + 0xCC49C);
cgs = (cgs_t*)(cgame->dataBase + 0xf2720);
return;
可在 OpenArena Aimbot Source Code 获取完整的参考源代码,它甚至包括代码的视频概述。
完全披露:这是我网站的 link,也是我所知道的涵盖该主题的唯一可行资源。
我正在尝试为 UrbanTerror42 找到一个基指针。
我的设置如下,我有一个有 2 个玩家的服务器。
cheat-engine 在客户端 a 上运行。
我和客户 b 一起爬梯子,然后扫描 incease/decrease。
找到值后,我使用 find out what writes to this address
。
但是偏移量非常高并且指向空内存。
我真的不知道如何进行
为了清楚起见,我查了其他几个值,它们都有同样的问题
我已经看过很多教程和论坛,但这些都是关于偏移量在 0 到 100 之间而不是 80614 之间的值。
如果有人能告诉我为什么会发生这种情况以及我必须 do/learn 继续做什么,我将不胜感激。
提前致谢
Urban Terror 使用 Quake 引擎。该引擎的早期版本使用 Quake 虚拟机,游戏逻辑作为字节码实现,由 Quake 虚拟机编译成程序集。自定义分配例程用于将这些模块加载到内存中,相对和硬编码 offsets/addresses 在 运行 时创建以适应这些重定位,并且不使用 por[ 的正常重定位 table 方法=29=] executable 文件格式。这就是为什么您每次 运行 游戏时都会看到这些看似奇怪的数字发生变化的原因。
Quake 虚拟机的文件格式为 .qvm,内存中的这些 qvm 在 QVM table 中进行跟踪。你必须找到 QVM table 才能揭开这个谜团。找到 2-3 个 QVM 并记录它们的地址后,找到 table 就很容易了,因为您只需扫描指向这些地址的指针,并通过找到靠近的地址来缩小结果范围彼此的记忆。
QVM 的定义如下:
struct vmTable_t
{
vm_t vm[3];
};
struct vm_s {
// DO NOT MOVE OR CHANGE THESE WITHOUT CHANGING THE VM_OFFSET_* DEFINES
// USED BY THE ASM CODE
int programStack; // the vm may be recursively entered
intptr_t(*systemCall)(intptr_t *parms);
//------------------------------------
char name[MAX_QPATH];
// for dynamic linked modules
void *dllHandle;
intptr_t entryPoint; //(QDECL *entryPoint)(int callNum, ...);
void(*destroy)(vm_s* self);
// for interpreted modules
qboolean currentlyInterpreting;
qboolean compiled;
byte *codeBase;
int codeLength;
int *instructionPointers;
int instructionCount;
byte *dataBase;
int dataMask;
int stackBottom; // if programStack < stackBottom, error
int numSymbols;
struct vmSymbol_s *symbols;
int callLevel; // counts recursive VM_Call
int breakFunction; // increment breakCount on function entry to this
int breakCount;
BYTE *jumpTableTargets;
int numJumpTableTargets;
};
typedef struct vm_s vm_t;
你原截图中EAX的值应该与QVM结构的codeBase或dataBase成员变量相同。偏移量只是相对于这些地址。与处理 ASLR 的方式类似,您必须在 运行 时间计算地址。
这是我的代码的一个 t运行 版本,它正是这样做的,另外还从内存中获取重要的结构,例如:
void OA_t::GetVM()
{
cg = nullptr;
cgs = nullptr;
cgents = nullptr;
bLocalGame = false;
cgame = nullptr;
for (auto &vm : vmTable->vm)
{
if (strstr(vm.name, "qagame")) { bLocalGame = true; continue; }
if (strstr(vm.name, "cgame"))
{
cgame = &vm;
gamestatus = GSTAT_GAME;
//char* gamestring = Cvar_VariableString("fs_game");
switch (cgame->instructionCount)
{
case 136054: //version 88
cgents = (cg_entities*)(cgame->dataBase + 0x1649c);
cg = (cg_t*)(cgame->dataBase + 0xCC49C);
cgs = (cgs_t*)(cgame->dataBase + 0xf2720);
return;
可在 OpenArena Aimbot Source Code 获取完整的参考源代码,它甚至包括代码的视频概述。
完全披露:这是我网站的 link,也是我所知道的涵盖该主题的唯一可行资源。