【问题标题】:Pointer to a Pointer of structs C指向结构体指针的指针 C
【发布时间】:2013-03-29 03:03:34
【问题描述】:

大家好,我可能很难解释这一点,但我会尽力而为。

我正在创建一个将注入到程序中的 DLL。为了从 DLL 中访问我想要的数据,我将数据映射到一个“基地址”,其中是指向另一个地址的指针。从那里我必须将该地址增加 0x34 才能访问我的数据。我想我可以使用结构来发挥我的优势,但它似乎不起作用。问题是我似乎无法弄清楚如何增加第二个地址以获得指向我的数据的最终指针。

我有的是这个

typedef unsigned char BYTE;

typedef struct
{
    DWORD Some_Int;
    //big struct of DWORDS simulating what is in the applicaiton.
    //shortened for posting
}DATA;

typedef struct
{
    BYTE Unknown[0x34];
    DATA *p_data;
}VARBASE;


DWORD WINAPI function()
{
    VARBASE *Stats = (VARBASE*)0x00BBC9CC;
    char lol[1000];

    sprintf(lol, "stats pointer: %p  |  DATA pointer: %p", Stats, Stats->p_data);
    SomeFunction(lol); //wrapper for MessageBoxA()

    return NULL;
}

Stats 指向正确的地址,但我无法读取 0x34 字节的数据(或增加指针 0x34)以获取指向我的数据集的第二个指针。当我使用这个当前代码时,p_data 被设置为 0000155A 或类似的东西,当它应该在 0A0*** 范围内时,这会在读取时导致段错误。我知道我的数学是正确的,因为我在 CheatEngine 之类的内存映射器中打开了应用程序,我可以专门添加基指针 -> 地址 + 0x34 -> 我的数据来自 CheatEngine。

有没有更简单的方法来解决这个问题,而不是使用基础结构来指向我的数据?基本上它的指针->指针+0x34->数据,我面临的问题是我不能增加第二个指针并设置它,所以我可以访问我的数据。

【问题讨论】:

  • 未定义行为:sprintf(lol, "stats pointer: %p | DATA pointer: %p", Stats, Stats->p_data);%p 对应于类型为 void * 的参数。传递任何其他类型(可能除了char *)会产生未定义的行为。
  • 有趣。打印指针地址的正确方法是什么。
  • 呃,通过 void * 参数...你在读哪本书?

标签: c pointers memory


【解决方案1】:

您是否知道结构的两个成员之间可能存在填充?这是“我如何以错误的方式做某事?”的一个示例。或许你最好告诉我们你的程序要解决哪个问题

如果您确定0x00BBC9CC + 34 适合对齐以指向DWORD *,那么为什么不直接跳到这一点:DWORD **some_int = 0x00BBC9CC + 34;..?顺便问一下,你从哪里得到这个地址?不幸的是,Win32 C 程序员很少真正编写 C 程序。

【讨论】:

  • :) Linux 程序员也是如此。每天在这里发布多少个 void main() 或 malloc 转换程序,并标记为 C?
  • 0x00bbc9cc 指向 0x0a1ecdc0,然后我需要增加 0x34,然后我必须获取该地址并获取它指向的数据。基地址永远不会改变我已经通过多次重新启动应用程序来验证这一点,并且相同的数学总是指向相同的数据。 0x00bbc9cc -> 0x0a1ecdc0+34 -> my_data(4 bytes long) 编辑:我不能这样做的原因是我希望提取的值不止一个(大约有 35 个)。我想如果我用与应用程序相同大小的变量指向我的结构,我就可以阅读我喜欢的内容
【解决方案2】:

我解决了这个问题。我需要尊重基地址指针并将该值传递给我的 VARBASE 结构。

DWORD WINAPI function()
{
    FILE *fp;
    fp = fopen("testaddr.txt", "a+");
    DWORD *ptr = (DWORD*)0x00BBC9CC;
    VARBASE *Stats = (VARBASE*)*ptr;
    //removed debug output to file
    fclose(fp);
    return NULL;
}

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 2021-07-14
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2016-03-21
    • 2012-03-28
    • 2018-05-16
    相关资源
    最近更新 更多