指向结构C的指针的指针

指向结构C的指针的指针,c,pointers,memory,C,Pointers,Memory,大家好,我可能很难解释这一点,但我会尽我最大的努力 我正在创建一个将被注入程序的DLL。为了从DLL内部访问我想要的数据,我将数据映射到一个“基址”,其中是指向另一个地址的指针。从这里开始,我必须将该地址增加0x34,以便访问我的数据。我想我可以使用structs来发挥我的优势,但它似乎不起作用。问题是,我似乎不知道如何递增第二个地址以获得指向数据的最终指针 我有的是这个 typedef unsigned char BYTE; typedef struct { DWORD Some_I

大家好,我可能很难解释这一点,但我会尽我最大的努力

我正在创建一个将被注入程序的DLL。为了从DLL内部访问我想要的数据,我将数据映射到一个“基址”,其中是指向另一个地址的指针。从这里开始,我必须将该地址增加0x34,以便访问我的数据。我想我可以使用structs来发挥我的优势,但它似乎不起作用。问题是,我似乎不知道如何递增第二个地址以获得指向数据的最终指针

我有的是这个

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_数据被设置为0000155A或类似值,当它应该在0A0***范围内时,读取时会导致segfault。我知道我的数学是正确的,因为我在内存映射器中打开了应用程序,比如CheatEngine,我可以从CheatEngine中添加基本指针->地址+0x34->我的数据


有没有比使用基本结构来指向我的数据更简单的方法?基本上,它的指针->指针+0x34->数据,我面临的问题是,我无法增加第二个指针并将其设置为可以访问我的数据。

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


如果您确定
0x00BBC9CC+34
与指向
DWORD*
的点对齐,那么为什么不直接跳到点:
DWORD**some_int=0x00BBC9CC+34。。?顺便问一下,这个地址是从哪里来的?不幸的是,Win32 C程序员很少实际生成C程序。

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

未定义的行为:
sprintf(lol,“统计指针:%p |数据指针:%p”,统计,统计->p|u数据)
%p
对应于类型为
void*
的参数。传递任何其他类型(除了可能的
char*
)会产生未定义的行为。通过传递
void*
参数打印指针地址的正确方法是什么。。。你在读哪本书?:)不过Linux程序员也是如此。一天有多少void main()或malloc casting程序发布在这里,并标记为C?0x00bbc9cc指向0x0a1ecdc0,然后我需要增加0x34,然后我必须获取该地址并获取它指向的数据。基址永远不会改变我已经多次重启应用程序验证了这一点,并且相同的数学总是指向相同的数据。0x00bbc9cc->0x0a1ecdc0+34->my_数据(4字节长)编辑:我无法这样做的原因是我希望提取多个值(大约有35个)。我想,如果我用与应用程序中的变量大小相同的变量指出我的结构,我就可以随意阅读