FName for External

Lalaker1

Silver Üye
Katılım
26 Eki 2022
Mesajlar
60
Beğeniler
32
//bu konu tutorial cheating kısmına açılabilir ben orda konu açamadım.
İlk öncelikle selamlar forumda FNamepool Enumeration diye bir konu gördüm @Hamsilendin diye bir arkadaş ucden kopyalamış sonra forumda ki başka insalara paster diyor
işe yaramaz konu sadece decryption rutini paylaşılmış
sonra writeline adı altında hile Crâck hileler satan kendini dev olarak gösteren @Joi bilgisi olmadığı açıkça ortada
unknown.png
Neyse idleri görünce biraz kör oldum onun dışında problem yoktu bende güzel bir konu hazırladım nasıl yapılcağına dair.
Aslında fnamepoolda herhangi bir engelleme yok sadece çıkan stringler şifrelenmiş bunuda names key ve state ile çıkardığımız key ile çözücez
C++:
__forceinline __int64
decrypt_xor_keys(const uint32_t key, const uintptr_t* state)
{ 
    __int64 v2;
    unsigned __int64 v3;
    unsigned __int64 v4;
    unsigned __int64 v5;
    unsigned int v6;
    __int64 v7;
    unsigned int v8;
    int v9;
    unsigned int v10;
    unsigned __int64 v11;
 
    v2 = (unsigned int)(key << 25);
    v3 = 2685821657736338717i64 * ((unsigned int)key ^ v2 ^ (((unsigned int)key ^ ((unsigned __int64)(unsigned int)key >> 15)) >> 12)) % 7;
    v4 = state[v3];
    v5 = (2685821657736338717i64 * ((unsigned int)key ^ v2 ^ (((unsigned int)key ^ ((unsigned __int64)(unsigned int)key >> 15)) >> 12))) >> 32;
    v6 = (unsigned int)v3 % 7;
    if (!((unsigned int)v3 % 7))
    {
        v7 = 2 * ((2 * v4) ^ ((2 * v4) ^ (v4 >> 1)) & 0x5555555555555555i64);
        v4 = v7 ^ (v7 ^ (((2 * v4) ^ ((2 * v4) ^ (v4 >> 1)) & 0x5555555555555555i64) >> 1)) & 0x5555555555555555i64;
        goto LABEL_5;
    }
    if (v6 == 1)
    {
        v9 = 2 * v3;
        v8 = v5 + v3;
        v4 = ~(unsigned __int64)(unsigned int)(v5 + v3) ^ (v4 - (unsigned int)(v5 + 2 * v3));
    }
    else
    {
    LABEL_5:
        v8 = v5 + v3;
        v9 = 2 * v3;
    }
    if (v6 == 2)
    {
        v4 = __ROL8__((2 * v4) ^ ((2 * v4) ^ (v4 >> 1)) & 0x5555555555555555i64, (unsigned __int8)(v8 % 0x3F) + 1);
        goto LABEL_8;
    }
    if (v6 == 3)
    {
        v10 = v5 + v9;
        v4 = __ROL8__((unsigned int)(v5 + v9) + v4, (unsigned __int8)(v8 % 0x3F) + 1);
    }
    else
    {
    LABEL_8:
        v10 = v9 + v5;
    }
    if (v6 == 4)
    {
        v4 ^= v8;
    LABEL_11:
        if (v6 == 6)
        {
            v11 = __ROL8__(v4, (unsigned __int8)(v10 % 0x3F) + 1);
            v4 = (2 * v11) ^ ((2 * v11) ^ (v11 >> 1)) & 0x5555555555555555i64;
        }
 
    }
    else
    {
        if (v6 != 5)
            goto LABEL_11;
        v4 += v8 - (unsigned __int64)v10;
 
    }
    return (v4 ^ key);
 
}
Buraya key ve state'i veriyoruz bize xor_key çıkartıyor (offsetleri bilmiyom ucde koklaya koklaya bulursunuz)
Kod:
std::uintptr_t key = read<std::uintptr_t>(gamebase + key_offset);

State state = read<State>(gamebase + state_offset);

(State structunu vexternalda bulabilirsiniz)

auto out = decrypt_xor_keys(key, (std::uintptr_t*)&state);

std::uintptr_t xor_key = read<std::uintptr_t>(out);
ever xor keyimizi bulduk...
C++:
struct FNameEntryHandle {
    uint16_t bIsWide : 1;
    uint16_t Len : 15;
};

struct FNameEntry {

    int32_t ComparisonId;
    FNameEntryHandle Header;
    union
    {
        char    AnsiName[1024]; // ANSICHAR
        wchar_t    WideName[1024]; // WIDECHAR
    };


    wchar_t const* GetWideName() const { return WideName; }
    char const* GetAnsiName() const { return AnsiName; }
    bool IsWide() const { return Header.bIsWide; }
};
bu struct bizim işimize yarıcak...

Kod:
std::string GetFName(int key)
{
        uint chunkOffset = (uint)((int)(key) >> 16);
        ushort nameOffset = (ushort)key;
        uint64_t namePoolChunk = read<uint64_t>((uintptr_t)(gamebase + fnamentry&pool offseti + ((chunkOffset + 2) * 8)));
        uint64_t entryOffset = namePoolChunk + (ulong)(4 * nameOffset);
        FNameEntry nameEntry = read<FNameEntry>(entryOffset);
        auto name = nameEntry.AnsiName;
        for (std::uint16_t i = 0; i < nameEntry.GetLength(); i++)
        {
            BYTE b = i & 3;
            name[i] ^= nameEntry.GetLength() ^ *((LPBYTE)&xor_key + b);
        }
        return name;
}

ve bu kodla fname id ile outputumuzu alıcaz kod herhangibi bir ortamda yazmadım ve test etmedim direk konuda yazdım onun icin yanlislarım olabilir siz düzeltebilirsiniz
writeline bu poc icin şimdiden teşekkürlerini kabul ediyorum iyi günler
 
Son düzenleme:

  Şuanda konuyu görüntüleyen kullanıcılar


Üst Alt