c ++将内存转换为数据结构

时间:2017-07-12 14:29:07

标签: c++ memory data-structures reverse-engineering

在调试应用程序时,我在内存中找到了一个结构,我100%肯定只有4个字符串。虽然我不太确定如何将其转换为数据结构,所以我可以使用结构指针地址来访问值。例如,这里是数据结构在内存中的样子(例如,假设它一直位于内存地址0x123456)enter image description here

数据结构由4个单独的字符串组成

string 1 = ad
string 2 = dgdhkkkkkkhkk
string 3 = ggghhjk
string 4 = dgcfoh

我尝试过创建像

这样的数据结构
struct reversedConnectionDat_t
{
    char * data1;
    char * data2;
    char * data3;
    char * data4;
}

这就是我尝试访问数据的方式

reversedConnectionDat_t * storeDat = (reversedConnectionDat_t*)0x123456;
print(storeDat->data3);

但它似乎不起作用。我没有正确地从内存中读取字符串吗?

(哦,字符串有时会改变我在上面发布的示例代码中发布的内容,即有时字符串1的长度为7,字符串3的长度仅为2 ...等等。

4 个答案:

答案 0 :(得分:2)

你有一个指向指针结构的指针,所以即使你将结构指向正确的内存地址,你仍然在结构中有未初始化的指针。你需要为他们提供实际的记忆。我会尝试设置这样的结构......

struct reversedConnectionDat_t
{
    char data1 [3];
    char data2 [50];
    char data3 [50];
    char data4 [50];
}
顺便说一句,我没有数空间。我只是猜到了,但你明白了。

答案 1 :(得分:1)

我认为您错误地识别了该数据结构。我怀疑你拥有的是三个独立的缓冲区,每个缓冲区都可以容纳一个或多个以空字符结尾的字符串。

第一个结构长度为68个字节,包含"ad\0dgdhkkkkkkhkk\0"(后跟足够的\0来填充缓冲区。

这个缓冲区实际上可能只有64个字节长,而后面的四个字节可能用于其他一些数据元素。

第二个缓冲区长度为64字节,包含一个字符串,并填充\0个字符以填充64个字节。

不可能说第三个缓冲区有多长。我们所知道的是它足以保持字符串"dgcfoh\0"。我猜测缓冲区是64字节长,但如果我获得更多数据,愿意修改这个意见。

我认为你想要的结构是:

struct s
{
    char data1[68]; // buffer holds one or more null-terminated strings
    char data2[64];
    char data3[64].
}

根据您提供给我们的信息很少,这就是我的开始。然后,您需要一种方法来解析以null结尾的字符串的缓冲区。也就是说,从第一个缓冲区获取两个单独的字符串。这是一个非常简单的C代码。

答案 2 :(得分:0)

您正在使用指针(char*),结构的结构大小是4个指针的大小。如果要获取字符串,则应使用固定大小的数组(char[])。

仅当您的字符串大小等于缓冲区大小时才会起作用。

IMO最好的方法是获取一个char数组,然后找到空终止符 /0,然后将指针配置为指向每个字符串的开头(在前3个空终止符的开头和右侧)。

char* pointerToMem = something; //your strings data
yourStruct.str1 = pointerToMem;
while(*pointerToMem != '\0')
{
    pointerToMem++;
}
yourStruct.str2 = pointerToMem + 1;

这是你如何使指针结构工作的方法。这段代码不是最佳的,您不应该使用它,但它显示了如何从内存中获取字符串。要拥有一个C字符串,您只需要第一个字符的地址和末尾的一些空终结符。

答案 3 :(得分:0)

除了你的magicnumber:0x123456之外,我无法理解你的代码有什么问题,这可能不适合你的结构。您确定magic-number导致数据与您定义的结构兼容吗?比如,如果你试图访问storeDat->data3,它肯定会导致seg-fault,除非你做了如下的事情,或者你很幸运。

struct R{
    char *a;
    char *b;
};

int main(void)
{
    struct R *r1 = (struct R*) malloc(sizeof(struct R));
    r1->a = "12333";      //Pointing to a string literal
    r1->b = "12331";      //Pointing to a string literal

    int address = (int)&r1;
    struct R *r2 = (struct R*) address;
    std::cout<<r2->b;
    return 0;
}

P.S。 - 我不是一个优秀的程序员。但我只是好奇地回答,因为我认为这可能会有所帮助。对不起,如果我无法正确理解您的问题。