大家好,我可能很难解释清楚,但我会尽力的。
我正在创建一个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;
}