指向结构体指针的指针



大家好,我可能很难解释清楚,但我会尽力的。

我正在创建一个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这样的内存映射器中打开了应用程序,我可以特别从CheatEngine内部添加基指针->地址+ 0x34 ->我的数据。

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

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

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

我解决了这个问题。我需要遵从base地址指针,并将该值传递给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;
}

最新更新