Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TuT] Łatwe i przyjemne czytanie wartosci wielopoziomowego wskaznika


Rekomendowane odpowiedzi

Opublikowano

wielu ludzi czesto zadaje pytania typu:

jak moge odczytac wartosc z czegos takiego?
client.dll + 0x1337 ] 0x7331 ] 0x9983] 0x3

jest wiele sposobow na czytanie multipoziomowych wskaznikow - przedstawie dwa

 

1. standardowe podejscie: 

DWORD value = *(DWORD*)(dwClient+0x1337);
value = *(DWORD*)(value+0x7331);
value = *(DWORD*)(value+0x9983);
value = *(DWORD*)(value+0x3);  //nasza finalna wartosc

2. wiele osob nie rozumie czemu tam jest tyle '*', czy moze ja cos tam mnoze? dla was tez jest nadzieja  - wystarczy uzyc ponizszej funkcji:

DWORD dwReadPointer(DWORD dwBaseAddr, int iPointerLevel, ...)
{
    DWORD dwCurrentOffset;
    va_list pointers;
    va_start(pointers, iPointerLevel);
    for (int i = 0; i < iPointerLevel; i++)
    {
        dwCurrentOffset = va_arg(pointers, DWORD);
        dwBaseAddr = *(DWORD*)(dwBaseAddr + dwCurrentOffset);
    }
    va_end(pointers);
    return dwBaseAddr;
}  

przyklad uzycia:

 

 

adres: client.dll + 0x1337 ] 0x7331 ] 0x9983] 0x3

 

wywolanie funkcji: 

DWORD value = dwReadPointer(dwClient,4,0x1337,0x7331,0x9983,0x3)  

dowod, ze to dziala:

 

oto kod, ktory dodalem do glownej petli w swoim hacku

            DWORD firstValue, secondValue;
            firstValue = SDK.GetLocalPlayerVar(SDK.netvars.m_iHealth);
            secondValue = SDK.testGetLocalPlayerVar(SDK.netvars.m_iHealth);
            if (firstValue == secondValue)
                cout << "BOTH VALUES ARE EQUAL!\n";
            else cout << "THEY ARE NOT EQUAL!\n";  

SDK.getlocalPlayerVar wyglada nastepujaco, jest to standardowy sposob na uzyskiwanie wartosci pointera: 

DWORD GetLocalPlayerVar(DWORD _netvar) 
    {
        DWORD LocalPlayer = *(DWORD*)(modules.dwClient + offset.entities.dwLocalPlayer);
        return *(DWORD*)(LocalPlayer + _netvar);
    }  

natomiast SDK.testGetLocalPlayerVar to funkcja dwReadPointer.

 

OW28XTD.jpgdziala? dziala. dziekuje za uwage.

Opublikowano

C++11:

template<typename T>
T* readPointers(uint32_t pointer, uint32_t offset)
{
    return reinterpret_cast<T*>(*reinterpret_cast<uint32_t*>(pointer + offset));
}

template<typename T, typename... Args>
T* readPointers(uint32_t pointer, uint32_t offset, Args... args)
{
    return reinterpret_cast<T*>(readPointers<uint32_t>(*reinterpret_cast<uint32_t*>(pointer + offset), std::forward<Args>(args)...));
}
Example:

http://ideone.com/ceLRe9

 

@Sopelek997 miszczu C++11, ten std::forward w tym przypadku potrzebny?

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Opublikowano

Jak powinienem zapisać zmienną dwClient?

DWORD dwClient = "game.exe" nie działa, powinienem wpisać PID procesu?

Nie, adres bazowy.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...