1

由于我是汇编语言初学者和学习目的,我正在尝试在游戏中扫描内存地址和指针。我对指针和地址有点困惑。

我通过 youtube 上的教程找到了指针,但我想深入了解这个指针和偏移量。

在此处输入图像描述

在此处输入图像描述 我不明白这些偏移量和地址如何加起来并给出存储值 1000 的最终地址。

我的理解是 00F8EBE0 是基地址,“22,20,10,C,20”是五个偏移量。

00F8EBE0 -> 11DA0924 = 1000 这是怎么回事?我如何用 C++ 读取 00F8EBE0 值?我是否需要这些抵消来帮助我获得最终价值?

4

2 回答 2

1

如果您将指针和偏移量转换为 C/C++,那么您最好考虑数组。对于数组,通常有一个基指针,即数组指针。当您想要访问特定值时,您添加索引,该索引转换为偏移量。最简单的情况是 char 数组,因为这里索引和偏移量之间存在 1:1 的关系。

 char p[100];
 p[10] = 32;

10 是您的偏移量,假设“p”的值为 0x1000,那么分配值 45 的地址将为 0x100A。

 mov eax, 1000h
 mov [eax+0ah], 20

现在下一种情况将是一个整数数组,其中一个 int 的大小为四个字节。此处的索引必须相乘,编译器会为您执行此操作。

 int p[100];
 p[10] = 32;

这将转化为:

 mov eax, 1000h
 mov edx, 0ah
 mov [eax+edx*4], 20

所以目标地址是 1000h + 10*4= 40 (28h) -> 1028h

在 C++ 中,您通常有类。从汇编程序的角度来看,这与结构相同,因此您有一个基指针,它是您的类的地址,而偏移地址是该特定类/结构中每个单独成员的地址。但是您应该记住,当您在 C/C++ 中创建 strcut/class 时,编译器可以在成员之间添加填充字节,这实际上意味着来自成员的偏移量不一定是您在阅读时认为的位置C/C++ 代码。

IE

 struct { char a; int b; } myStruct;

在这种情况下,b 的偏移量很可能是 myStruct+2(或 4)而不是 myStruct+1,因为编译器可能会添加一个对齐以使其成为偶数地址或 DWORD 对齐地址。

于 2013-10-30T11:30:17.957 回答
1

在进程的虚拟内存空间中,加载了映像文件(“something.exe”)。如果您添加0x00F8EBE0到该地址并读取该位置,您将获得0x127B5450. 将箭头读作“指向”,方括号中的值读作“地址加偏移量”。您可以使用 ToolHelp32 API 以编程方式获取图像库。

您在这里拥有的是指向对象结构的指针链,每个偏移量都为您提供下一个指针在结构/对象中的位置。

要使用来自另一个程序的此信息,您可以使用ReadProcessMemory。从第一个偏移量(图像库)开始,调用ReadProcessMemory并添加相关偏移量,然后重复。一般流程如下:

//assuming you've calculated the image base of the target
//and acquired a handle to the process:

LPVOID base = ImageBase + 0x00F8EBE0; //note: EntryPoint needs obtaining properly
LPVOID value;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0x20;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0xc;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0x10;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0x20;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0x44;
ReadProcessMemory(hnd,base,buf,sizeof value, NULL);
//value will now contain the number 1000.

请注意,不能保证每次运行时进程的地址空间看起来都一样;如果它分配任何内存,则入口点 ( 0x00F8EBE0) 的第一个偏移量将不同。

于 2013-10-30T12:00:18.607 回答