【问题标题】:Assembly Pointer and base address汇编指针和基地址
【发布时间】:2013-10-30 20:00:18
【问题描述】:

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

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

我不明白这些偏移量和地址如何加起来并给出存储值 1000 的最终地址。

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

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

【问题讨论】:

    标签: assembly


    【解决方案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) 的第一个偏移量将不一样。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

       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++ 代码。

      i.E.

       struct { char a; int b; } myStruct;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        相关资源
        最近更新 更多