Ida pro генерирует эту строку в псевдокоде, и у меня есть указатель рабочего класса и обратный инженерный класс, но я не хочу читать что-то непосредственно из файла класса.
Пример в IDA Pro:
*(_DWORD *)(v3 + 9649) = 1;
// Alignment: 1
class CVehicle
{
DWORD modelid; // 0
float pos[3]; // 4
WORD player; // 16
}
CVehicle *pVehicle;
Я знаю, если я хочу получить игрока, то мне нужно сделать это:
pVehicle->player
Но что, если я хочу получить игрока по смещению? Потому что иногда мне нужно читать по смещению, потому что я не перепроектировал полный класс. пример
*(WORD*)(pVehicle + 16) // That should work, should return player, but will crash. Why?
Предполагая, что я понимаю, что вы говорите в своем сообщении, вот как я это сделаю:
Заголовок:
#pragma pack(push, 1)
class CPlayer
{
public:
unsigned char Unknown00[9649];
char Unknown9649;
};
class CVehicle
{
public:
DWORD modelid; // 0
float pos[3]; // 4
CPlayer *pPlayer; // 16
};
#pragma pack(pop)
Код:
char SomethingIWant;
CVehicle *pVehicle; // set previously
CPlayer *pPlayer = nullptr;
if (pVehicle)
pPlayer = pVehicle->pPlayer;
if (pPlayer)
SomethingIWant = pPlayer->Unknown9649;
Затем, вы можете просто заполнить классы, как вы идете и узнать больше информации.
(Отказ от ответственности: приведенный выше код предполагает, что pVehicle-> pPlayer имеет значение nullptr или допустимо. В противном случае потребуется больше кода для правильной проверки того, что pPlayer действителен.)