В новых версиях hex-rays есть удобная фишка - создание структуры "на лету". Кликаем ПКМ на переменной, которая хранит указатель на обьект класса и выбираем "Create new structure".У меня нет такой позиции "Create new structure". Версия IDA Version 6.8.150423 (32-bit)
00000000 CAutomobile struc ; (sizeof=0x58C, align=0x4, mappedto_6)
00000000 vehicle db ?
00000001 gap1 db 79 dup(?)
00000050 byte50 db ?
00000051 byte51 db ?
00000052 byte52 db ?
00000053 byte53 db ?
00000054 gap54 db 8 dup(?)
0000005C word5C dw ?
0000005E gap5E db 362 dup(?)
000001C8 byte1C8 db ?
000001C9 gap1C9 db 91 dup(?)
00000224 dword224 dd ?
00000228 gap228 db 92 dup(?)
00000284 dword284 dd ?
00000288 dword288 dd ?
0000028C gap28C db 20 dup(?)
000002A0 byte2A0 db ?
000002A1 gap2A1 db 223 dup(?)
00000380 dword380 dd ?
00000384 gap384 db 4 dup(?)
00000388 dword388 dd ?
0000038C dword38C dd ?
00000390 gap390 db 4 dup(?)
00000394 dword394 dd ?
00000398 gap398 db 321 dup(?)
000004D9 byte4D9 db ?
000004DA db ? ; undefined
000004DB db ? ; undefined
000004DC dword4DC dd ?
000004E0 word4E0 dw ?
000004E2 gap4E2 db 78 dup(?)
00000530 dword530 dd ?
00000534 gap534 db 68 dup(?)
00000578 float578 dd ?
0000057C float57C dd ?
00000580 dword580 dd ?
00000584 dword584 dd ?
00000588 dword588 dd ?
0000058C CAutomobile ends
0000028C gap28C db 20 dup(?)
Как разбираться?
IDA и hex-rays не выдадут полностью готовые структуры, это будет что-то вроде макета, который тебе нужно продолжать разбирать.А размер структур всегда выдают правильно?
Как я понимаю, некоторые структуры в gta III идентичны структурам из gta VC, некоторые будут отличаться. Верно?
...Первый - если память под обьект структуры (класса) выделяется динамически. В таком случае, в коде мы точно увидим размер выделяемой памяти.С этим разобрался. Почему-то в псевдокоде не всегда показывается размер выделяемой памяти, показывается вот так:
...
(см. любой вызов CAutomobile::CAutomobile в базе):...
push 5DCh ; int
call _ZN8CVehiclenwEj ; CVehicle::operator new(uint)
test eax, eax
pop ecx
jz short loc_42773F
mov ecx, eax
push 1
push [esp+1F4h+var_1E0]
call _ZN11CAutomobileC2Eih ; CAutomobile::CAutomobile(int,uchar)
Второй вариант - это когда память под обьект выделяется на стеке или в глобальном пространстве.Хотелось бы почитать и про второй вариант. ;)
Тут я бы тоже выделил 3 случая:
1) Обьект выделен на стеке
2) Обьект находится в глобальном пространстве (глобальный обьект или статическая переменная класса)
3) Массив обьектов в глобальном пространстве (глобальный обьект или статическая переменная класса).
...По всему этому постараюсь завтра расписать.