从堆定义一个可变长度的结构数组

问题描述

我有以下反编译,我不知道如何设置为 struct* 或 struct 数组。 decomp 似乎有几个字段的结构跨度(结构之间的偏移量)为 0x19 而不是 0x32。通常制作 DAT_0045f9e0 类型模型*可以解决以下地址。但这个人拒绝这样做。有办法强制吗? 0x19 来自哪里?

在 Ghidra 中定义动态大小的结构数组的正确方法是什么?必须创建一个只包含“struct model items[0]”的类型似乎很不寻常???

  fread(&numItems,4,1,hFile);
  count = 0;
  if (0 < (int)numItems) {
    do {
      fread(&index,hFile);

      fread(&DAT_0045f9e0 + index* 0x32,2,hFile);
      fread(&DAT_0045f9e2 + index* 0x19,hFile);
      fread(&DAT_0045f9e4 + index* 0x32,hFile);
      
      fread(&dwRead,hFile);
      *(size_t *)((int)&DAT_0045f9e8 + index * 0x32) = dwRead + (int) g_ptrBaseAddress;
      fread(&DAT_0045fa04 + index* 0x32,hFile);

      (&DAT_0045fa10)[index* 0x19] = (&DAT_0045fa10)[index* 0x19] | 1;

      count = count + 1;
    } while (count < (int)numItems);
  }

与 asm :

        0041b953    LEA        EDX => dwReadBytes,[ESP  + 0x28 ]
        0041b95a    CALL       fread                                    
        0041b966    XOR        EDI,EDI
        0041b96a    JLE        LAB_0041ba3c
        0041b972    LEA        EAX => model_id,[ESP  + 0x1c ]
        0041b979    CALL       fread                                    
        0041b98f    LEA        EDX,[count *0x2  + DAT_0045f9e0 ]       
        0041b997    CALL       fread                                    
        0041b9ad    LEA        count,[EAX *0x2  + DAT_0045f9e2 ]       
        0041b9b5    CALL       fread                                    
        0041b9cb    LEA        EAX,[EDX *0x2  + DAT_0045f9e4 ]         
        0041b9d3    CALL       fread                                    
        0041b9db    LEA        count => dwRead,[ESP  + 0x10 ]
        0041b9e4    CALL       fread                                    
        0041b9fd    ADD        EDX,count
        0041ba06    SHL        EAX,1
        0041ba08    MOV        dword ptr [EAX  + DAT_0045f9e8 ],EDX     
        0041ba0e    LEA        EDX,[EAX  + DAT_0045fa04 ]              
        0041ba15    CALL       fread                                    
        0041ba27    OR         word ptr [EAX *0x2  + DAT_0045fa10 ],BX  
        0041ba33    INC        EDI
        0041ba36    JL         LAB_0041b970

结构应该是:

typedef struct  // 0X32 (50) bytes
{
    uint16_t  Count;
    uint16_t  Start;
    uint32_t  Offset1;
    uint32_t  Offset2;
    uint32_t  unkNown1;
    uint32_t  unkNown2;
    uint32_t  unkNown3;
    uint16_t  Flags;
}model;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)