1

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

我正在创建一个将注入程序的 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->数据,我面临的问题是我不能增加第二个指针并设置它,所以我可以访问我的数据。

4

2 回答 2

0

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

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

于 2013-03-29T03:42:19.580 回答
0

我解决了这个问题。我需要尊重基地址指针并将该值传递给我的 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-03-29T20:55:09.547 回答