Optymalizacja kodu - wskaźniki

0

Cześć. Próbuję poprawić zapis kodu ale nic nie przychodzi mi do głowy. Pierwszy sposób działa ale wygląda strasznie, drugi nie działa. Program odczytuje wartość z końcowego adresu.

DWORD *FirtPointer = reinterpret_cast<DWORD*>(ProcessBaseAddress + 0x109B74);
DWORD *SecondPointer = reinterpret_cast<DWORD*>(*FirtPointer + 0x374);
DWORD *ThirdPointer = reinterpret_cast<DWORD*>(*SecondPointer + 0x14);
DWORD *FourthPointer = reinterpret_cast<DWORD*>(*ThirdPointer + 0x0);
std::cout << *FourthPointer << std::endl;

Ma ktoś jakiś pomysł jak to lepiej zapisać?

1
 
*(DWORD *)(*(DWORD *)(*(DWORD *)(*(DWORD *)(ProcessBaseAddress + 0x109B74) + 0x374) + 0x14) + 0x0)

Lub:

 
struct struct_4
{
};

struct struct_3
{
	struct_4 *struct4_ptr;
};

struct struct_2
{
	unsigned char pad[0x14];
	struct_3 *struct3_ptr;
};

struct struct_1
{
	unsigned char pad[0x374];
	struct_2 *struct2_ptr;
};

struct_1 *ptr = *(struct_1 **)(ProcessBaseAddress + 0x109B74);
struct_4 *a = ptr->struct2_ptr->struct3_ptr->struct4_ptr;

Możliwe, że się pomyliłem gdzieś, także sprawdzaj.

5

A dlaczego nie „normalnie”?

DWORD ****Pointer = (DWORD****)ProcessBaseAddress;

cout << Pointer[0x426DD][0x374][0x14][0];

Rzecz jasna nie sprawdzane.

0

Najlepsze z tego to rozwiązanie od @mwl4 nr 2, z tym że nie jestem pewien czy to uwzględnia pakowanie struktur.

http://www.foundbit.com/pl/zasoby/jezyki/cpp/zaawansowane/articles/cpp-wyrownanie-struktury.html

1

Alignment można wyłączyć: (VC++)

#pragma pack(push, 1)
// struct {};
#pragma pack(pop)
  • można zawsze sprawdzić czy rozmiar jest oczekiwany:
 
#define CONCAT2(prefix, suffix)    prefix##suffix
#define CONCAT(prefix, suffix)     CONCAT2(prefix, suffix)
#define STATIC_CHECK(expr)         typedef int CONCAT(some_requirement_failed_at_, __LINE__)[(expr) ? 1 : -1]

#define ENSURE_SIZE(structure, expected) STATIC_CHECK(sizeof(structure) == expected)

struct struktura { int a; };
ENSURE_SIZE(struktura, 4);

2
Wielki Terrorysta napisał(a):

Cześć. Próbuję poprawić zapis kodu ale nic nie przychodzi mi do głowy. Pierwszy sposób działa ale wygląda strasznie, drugi nie działa. Program odczytuje wartość z końcowego adresu.

DWORD *FirtPointer = reinterpret_cast<DWORD*>(ProcessBaseAddress + 0x109B74);
DWORD *SecondPointer = reinterpret_cast<DWORD*>(*FirtPointer + 0x374);
DWORD *ThirdPointer = reinterpret_cast<DWORD*>(*SecondPointer + 0x14);
DWORD *FourthPointer = reinterpret_cast<DWORD*>(*ThirdPointer + 0x0);
std::cout << *FourthPointer << std::endl;

Ma ktoś jakiś pomysł jak to lepiej zapisać?

Jak dla mnie za dużo liczb magicznych by podać rozsądne rozwiązanie (chciaż rozwiażanie od @Azarien wygląda najlepiej).
Takie rzeczy trzeba pisać w taki sposób, by wracając do tego po 3 miesiącach było wiadomo co się dzieje.

Moja rada opisz dokładnie jaką funkcjonalność próbujesz zrealizować, bo mam przeczucie, że coś przekombinowujesz albo zbyt upraszczasz.

1

swoją drogą zastanawiam się jakim cudem pamięć z innego procesu zmapowana do twojego procesu daje takie same adresy (wszystko zaczynając od SecondPointer)?
Ty bezwiednie sobie pobierasz wartość adresu z innego procesu i zakładasz że ta wartość reprezentująca adres w innym procesie daje taki sam adres w twoim procesie (lub przesunięcie jest stałe). To nie może być dobrze, to że działa jest wynikiem szczęścia, zmieni ci się kompilator, albo wersja systemu i to skończy się crashem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1