2013-10-30 102 views
1

由于我是一个汇编语言初学者和学习目的,我试图在游戏中扫描内存地址和指针。我对指针和地址感到困惑。汇编指针和基地址

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

enter image description here

enter image description here 我不明白如何将这些偏移和地址加在一起,给存储1000

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

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

回答

1

在进程的虚拟内存空间中,加载了映像文件(“something.exe”)。如果您将0x00F8EBE0添加到该地址并阅读该位置,您将获得0x127B5450。将箭头读作“指向”,将方括号中的值看作“地址加偏移量”。您可以通过编程获得图像库using the 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)将不相同。

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++中,通常有类。从汇编器的角度来看,这和结构是一样的,所以你有一个basepointer,它是你的类的地址,偏移地址指向那个特定类/结构中的每个成员。但是,您应该记住,当您在C/C++中创建一个strcut /类时,编译器可以在成员之间添加填充字节,这实际上意味着来自membner的偏移并不是必需的,您在阅读C/C++代码。

i.E.

struct { char a; int b; } myStruct; 

的在这种情况下B的偏移将很可能MYSTRUCT + 2(或4),而不是MYSTRUCT + 1,因为编译器将有可能增加一个aligment使其偶数地址或一个DWORD对齐的地址。