kimlik kullanmadan ajan ve silah adlarını almak için basit bir yazı.
ön uyarı: bu, kopyala ve yapıştır yoluyla çalışmaz. ayrıca, temizlemeye başlamadığım için kod korkunç görünüyor.
Daha önce yayınladığım şifre çözme rutini:
Kod:
__forceinline __int64
game::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;
}
this->xor_key = v4 ^ key;
return (v4 ^ key);
}
az önce yayınladığım şifre çözme rutinini kullanarak xor_key elde etme işlevi - neredeyse uworld ile aynı:
Kod:
bool
game::decrypt_name_key(uintptr_t valorant_base, uintptr_t* returned_xor)
{
uintptr_t namepoolkey;
engine->rvpm(engine->val_base + names_key, sizeof(uintptr_t), (unsigned char*)&namepoolkey);
if (!namepoolkey)
{
printf("[-] offset name_pool_key invalid!\n");
return false;
}
#pragma pack(push, 1)
struct state
{
uintptr_t keys[7];
};
#pragma pack(pop)
state xor_state;
engine->rvpm(engine->val_base + names_state, sizeof(state), (unsigned char*)&xor_state);
const auto address = decrypt_xor_keys(namepoolkey, (uintptr_t*)&xor_state);
uintptr_t xors;
engine->rvpm(address, sizeof(uintptr_t), (unsigned char*)&xors);
if (xors)
{
printf("[+] returned xor_address!\n");
*returned_xor = xors;
return true;
}
else
{
printf("[-] failed to return xor_address!\n");
return false;
}
}
giriş için okuma zinciri (silah(lar) için):
Kod:
uintptr_t inv;
engine->rvpm(entities[i].entity + inventory, sizeof(uintptr_t), (unsigned char*)&inv);
uintptr_t eq;
engine->rvpm(inv + equippable, sizeof(uintptr_t), (unsigned char*)&eq);
int gun_id;
engine->rvpm(eq + objectid, sizeof(int), (unsigned char*)&gun_id);
-
Kod:
const uintptr_t names_state = 0x8CDEF40;
const uintptr_t names_key = names_state + 0x38;
const uintptr_t fnameentry = 0x8CABF80;
-Konu tamamen bana aittir. Herhangi bir forumda paylaşılmasını istemiyorum. Tek tek kendim yazdım(!)