[C++] Rozszerzanie definicji objektu

Witajcie, rozszerzam funkcję pewnej gry za pomocą Proxy DLL, czyli robie detour funkcji i ją przepisuje.

Chciałbym się dowiedzieć czy jest możliwość rozszerzenia właściwości klasy za pomocą.

Powiedzmy, że chcę dodać jakieś nowe ‘pole’, do którego mógłbym się odwołać za pomocą pointera gracza.

Jest to możliwe?

int __userpurge KlasaGracza:KlasaGracza(int *PointerGracza, int a5, int a6, int a7)

{


  *(_DWORD *)PointerGracza = &off_4BCE10;


  *(_DWORD *)(PointerGracza + 440) = 0;

  *(_DWORD *)(PointerGracza + 444) = 0;

  *(_DWORD *)(PointerGracza + 24) = 1;

  *(_DWORD *)(PointerGracza + 1676) = a5;

  *(_DWORD *)(PointerGracza + 448) = a6;

  *(_DWORD *)(PointerGracza + 452) = a7;

  *(_DWORD *)(PointerGracza + 456) = 0;

  *(_DWORD *)(PointerGracza + 460) = 0;

  *(_DWORD *)(PointerGracza + 464) = 0;

  *(_DWORD *)(PointerGracza + 468) = 0;

  *(_DWORD *)(PointerGracza + 472) = 0;

  *(_DWORD *)(PointerGracza + 476) = 0;

  *(_DWORD *)(PointerGracza + 480) = 0;

  *(_DWORD *)(PointerGracza + 484) = 0;

  *(_DWORD *)(PointerGracza + 488) = 0;

  memset((void *)(PointerGracza + 492), 0, 0x11u);

  *(_DWORD *)(PointerGracza + 512) = 0;

  *(_DWORD *)(PointerGracza + 516) = 0;

  memset((void *)(PointerGracza + 520), 0, 0xFu);

  *(_DWORD *)(PointerGracza + 536) = 0;

  *(_DWORD *)(PointerGracza + 540) = 0;

  *(_DWORD *)(PointerGracza + 544) = 0;

  *(_DWORD *)(PointerGracza + 548) = 0;

  *(_DWORD *)(PointerGracza + 552) = 0;

  *(_DWORD *)(PointerGracza + 556) = 0;

  *(_DWORD *)(PointerGracza + 560) = 0;

  *(_DWORD *)(PointerGracza + 564) = 0;

  *(_DWORD *)(PointerGracza + 568) = 0;

  *(_DWORD *)(PointerGracza + 572) = 0;

  *(_DWORD *)(PointerGracza + 576) = 0;

  *(_DWORD *)(PointerGracza + 580) = 0;

  *(_DWORD *)(PointerGracza + 584) = 0;

  *(_DWORD *)(PointerGracza + 588) = 0;

  *(_DWORD *)(PointerGracza + 592) = 0;

  *(_DWORD *)(PointerGracza + 596) = 0;

  *(_DWORD *)(PointerGracza + 600) = 0;

  *(_DWORD *)(PointerGracza + 604) = 0;

  *(_DWORD *)(PointerGracza + 608) = 0;

  *(_DWORD *)(PointerGracza + 612) = 0;

  *(_DWORD *)(PointerGracza + 616) = 0;

  *(_DWORD *)(PointerGracza + 620) = 0;

  *(_DWORD *)(PointerGracza + 1016) = 0;

  memset((void *)(PointerGracza + 1052), 0, 0xEu);

  *(_DWORD *)(PointerGracza + 1096) = 0;

  *(_DWORD *)(PointerGracza + 1100) = 0;

  *(_DWORD *)(PointerGracza + 1104) = 0;

  *(_DWORD *)(PointerGracza + 1108) = 0;

  *(_DWORD *)(PointerGracza + 1112) = 0;

  *(_DWORD *)(PointerGracza + 1116) = 0;

  *(_DWORD *)(PointerGracza + 1120) = -1;

  *(_DWORD *)(PointerGracza + 1124) = 0;

  memset((void *)(PointerGracza + 1152), 0, 0x41u);

  *(_DWORD *)(PointerGracza + 1220) = 0;

  *(_DWORD *)(PointerGracza + 1440) = 0;

  *(_DWORD *)(PointerGracza + 1476) = GetTickCount();

  *(_DWORD *)(PointerGracza + 1472) = *(_DWORD *)(PointerGracza + 1476);

  *(_DWORD *)(PointerGracza + 1448) = *(_DWORD *)(PointerGracza + 1472);

  *(_DWORD *)(PointerGracza + 1444) = *(_DWORD *)(PointerGracza + 1448);

  *(_DWORD *)(PointerGracza + 1456) = *(_DWORD *)(PointerGracza + 1444);

  *(_DWORD *)(PointerGracza + 1460) = *(_DWORD *)(PointerGracza + 1456);

  *(_DWORD *)(PointerGracza + 1480) = *(_DWORD *)(PointerGracza + 1460);

  *(_DWORD *)(PointerGracza + 1464) = 0;

  *(_DWORD *)(PointerGracza + 1468) = 0;

  *(_DWORD *)(PointerGracza + 1484) = GetTickCount() + 1800000;

  *(_DWORD *)(PointerGracza + 1488) = 0;

  *(_DWORD *)(PointerGracza + 1496) = -1;

  *(_DWORD *)(PointerGracza + 1492) = -1;

  *(_DWORD *)(PointerGracza + 1512) = 0;

  *(_DWORD *)(PointerGracza + 1516) = 0;

  *(_DWORD *)(PointerGracza + 1520) = 0;

  *(_DWORD *)(PointerGracza + 1268) = 0;

  *(_DWORD *)(PointerGracza + 1300) = 0;

  *(_DWORD *)(PointerGracza + 1304) = 0;

  *(_DWORD *)(PointerGracza + 1340) = 0;

  *(_DWORD *)(PointerGracza + 1344) = 0;

  *(_DWORD *)(PointerGracza + 1348) = 0;

  *(_DWORD *)(PointerGracza + 1636) = 0;

  *(_DWORD *)(PointerGracza + 1640) = 0;

  return PointerGracza;

}

Musisz zaalokować nowy obiekt(odpowiednio rozszerzony) i podmienić wszystkie wskaźniki na niego. Rozwiązanie dość trudne do zrealizowania przy pomocy DLL injection(chyba, że podmienisz new/malloc, wtedy wystarczy “tylko” wpaść, jak sprawdzić jaki typ obiektu jest alokowany).

Możesz też trzymać te “nowe pola” poza danym obiektem i przechowywać je “z boku”, np. wykorzystując słownik adres obiektu->dodatkowe pola albo trzymając wskaźnik w jednym z nieużywanych pól w danej klasie.