如何解决从堆定义一个可变长度的结构数组
我有以下反编译,我不知道如何设置为 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 举报,一经查实,本站将立刻删除。