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
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
Buraya key ve state'i veriyoruz bize xor_key çıkartıyor (offsetleri bilmiyom ucde koklaya koklaya bulursunuz)
ever xor keyimizi bulduk...
bu struct bizim işimize yarıcak...
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
İ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
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);
}
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);
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; }
};
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: