Вопрос Search decrypt for rust

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
19 Окт 2025
Сообщения
34
Реакции
1
Короче, решил делать софт на раст, если оффсеты нашел, то декрипт не нашел, я решил искать его по этому гайду -
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)
и получается, я ввел свой hex + get_imagebase(), получил адресс, перешел по сабу, нажал ф5 и меня перекинуло в псевдокод (пусть будет А)

вот если надо
__int64 sub_180BF4590()
{
__int64 v0; // rax
__int64 v1; // rax
int v2; // ebx
__int64 v3; // rdi
__int64 result; // rax
__int64 v5; // rcx
__int64 v6; // rdi
__int64 v7; // rbx
__int64 v8; // rcx
__int64 v9; // rax
__int64 v10; // rdx
__int64 v11; // rbx
unsigned __int8 v12; // al
bool v13; // al
signed __int32 v14[10]; // [rsp+0h] [rbp-58h] BYREF
__int128 v15; // [rsp+28h] [rbp-30h] BYREF
__int64 v16[4]; // [rsp+38h] [rbp-20h] BYREF

if ( !byte_18D32D893 )
{
sub_18060F100(&qword_18D0683C0);
_InterlockedOr(v14, 0);
sub_18060F100(&qword_18D04CA70);
_InterlockedOr(v14, 0);
sub_18060F100(&qword_18D04CA58);
_InterlockedOr(v14, 0);
sub_18060F100(&basenetwork);
_InterlockedOr(v14, 0);
sub_18060F100(&unk_18D04CAC8);
_InterlockedOr(v14, 0);
sub_18060F100(&qword_18D04CA38);
_InterlockedOr(v14, 0);
sub_18060F100(&qword_18D04CA48);
_InterlockedOr(v14, 0);
byte_18D32D893 = 1;
}
v15 = 0i64;
v0 = basenetwork;
if ( !*(_DWORD *)(basenetwork + 224) )
{
il2cpp_runtime_class_init_0(basenetwork);
v0 = basenetwork;
}
v1 = sub_180C106E0(*(_QWORD *)(*(_QWORD *)(v0 + 184) + 8i64), qword_18D04CA58);
if ( !v1 )
sub_1805A5350();
v15 = *(_OWORD *)sub_184462100(v16, v1, 0i64);
v16[0] = 0i64;
v16[1] = (__int64)&v15;
while ( 1 )
{
v2 = ++DWORD2(v15);
v3 = v15;
if ( !(_QWORD)v15 )
sub_1805A5350();
result = qword_18D04CA38;
v5 = *(_QWORD *)(qword_18D04CA38 + 32);
if ( (*(_BYTE *)(v5 + 309) & 1) == 0 )
result = sub_180647F30(v5);
if ( v2 >= *(_DWORD *)(v3 + 24) )
break;
v6 = v15;
v7 = SDWORD2(v15);
if ( !(_QWORD)v15 )
sub_1805A5350();
v8 = *(_QWORD *)(qword_18D04CA48 + 32);
if ( (*(_BYTE *)(v8 + 309) & 1) == 0 )
sub_180647F30(v8);
v9 = *(_QWORD *)(v6 + 16);
if ( !v9 )
sub_1805A5350();
if ( (unsigned int)v7 >= *(_DWORD *)(v9 + 24) )
sub_1805A5360();
v10 = *(_QWORD *)(v9 + 8 * v7 + 32);
if ( v10 )
{
v12 = *(_BYTE *)(qword_18D04CA70 + 304);
v13 = *(_BYTE *)(*(_QWORD *)v10 + 304i64) >= v12
&& *(_QWORD *)(*(_QWORD *)(*(_QWORD *)v10 + 200i64) + 8i64 * v12 - 8) == qword_18D04CA70;
v11 = 0i64;
if ( v13 )
v11 = v10;
}
else
{
v11 = 0i64;
}
if ( !*(_DWORD *)(qword_18D0683C0 + 224) )
il2cpp_runtime_class_init_0(qword_18D0683C0);
if ( !byte_18D36A248 )
{
sub_18060F100(&qword_18D0683C0);
_InterlockedOr(v14, 0);
byte_18D36A248 = 1;
}
if ( !*(_DWORD *)(qword_18D0683C0 + 224) )
il2cpp_runtime_class_init_0(qword_18D0683C0);
if ( !byte_18D36A1DA )
{
sub_18060F100(&qword_18D0683C0);
_InterlockedOr(v14, 0);
byte_18D36A1DA = 1;
}
if ( !v11 )
sub_1805A5350();
if ( !*(_DWORD *)(qword_18D0683C0 + 224) )
il2cpp_runtime_class_init_0(qword_18D0683C0);
if ( !*(_QWORD *)(v11 + 16) )
sub_180BF4F10(v11, 0i64);
}
return result;
}

я перешел по сабу который был в переменной v1 ( v1 = sub_180C106E0(*(_QWORD *)(*(_QWORD *)(v0 + 184) + 8i64), qword_18D04CA58); ) и перешел в другой псевдокод (будем называть псевдокод-б) и что-же нам теперь делать? в этом гайде написано что это и есть ваш декрипт, но я чет нихуя не понял, кто из них мой декрипт и как его сделать, кстати для чего этот декрипт ваще нужен, для чего его юзают и самое главное - как?

вот если надо псевдокод-б
__int64 __fastcall sub_180C106E0(__int64 a1, __int64 a2)
{
__int64 *v4; // rdx
int v5; // r8d
int v6; // eax
__int64 v7; // rcx
__int64 target_0; // rax
__int64 v9; // rcx
__int64 v10; // rbp
__int64 v11; // rbx
__int64 v12; // rsi
int v13; // eax
__int64 v14; // rax
signed __int64 v15; // rcx
__int64 v16; // rbx
__int64 v18; // rax
__int64 v19; // rbx
__int64 v20; // rax
__int64 v21; // rax
__int64 v22; // [rsp+20h] [rbp-28h] BYREF
signed __int64 v23; // [rsp+50h] [rbp+8h] BYREF

if ( !*(_QWORD *)(a2 + 56) )
sub_180647FB0(a2);
if ( !a1 )
sub_1805A5350();
if ( *(_BYTE *)(a1 + 16) )
{
v4 = &v22;
v22 = *(_QWORD *)(a1 + 24);
v5 = 2;
do
{
v6 = *(_DWORD *)v4;
v4 = (__int64 *)((char *)v4 + 4);
*((_DWORD *)v4 - 1) = (((v6 + 783275142) << 23) | ((unsigned int)(v6 + 783275142) >> 9)) + 300813965;
--v5;
}
while ( v5 );
v7 = v22;
}
else
{
v7 = 0i64;
}
v23 = v7;
if ( !v7 )
return 0i64;
target_0 = il2cpp_gchandle_get_target_0();
v9 = *(_QWORD *)(a2 + 56);
v10 = target_0;
v11 = *(_QWORD *)(v9 + 8);
if ( (*(_BYTE *)(v11 + 309) & 1) == 0 )
v11 = sub_180647F30(*(_QWORD *)(v9 + 8));
if ( v10 )
{
v12 = sub_180595E10(v10, v11);
if ( !v12 )
sub_1805A5AC0(v10, v11);
}
else
{
v12 = 0i64;
}
v13 = *(_DWORD *)(a1 + 32) + 1;
*(_DWORD *)(a1 + 32) = v13;
if ( v13 >= 1000 )
{
*(_DWORD *)(a1 + 32) = 0;
v14 = sub_1884DAE90(v12, 2i64, 0i64);
v15 = v23;
v16 = v14;
if ( !v23 || _InterlockedCompareExchange64(&v23, 0i64, v23) != v15 )
{
v18 = sub_1805A4F30(&qword_18D04C048);
v19 = sub_1805A5300(v18);
v20 = sub_1805A4F30(&qword_18D0141C0);
sub_188620870(v19, v20, 0i64);
v21 = sub_1805A4F30(aJ);
sub_1805A5310(v19, v21);
}
il2cpp_gchandle_free_0();
HIDWORD(v22) = HIDWORD(v16);
LODWORD(v22) = ((((_DWORD)v16 - 300813965) << 9) | ((unsigned int)(v16 - 300813965) >> 23)) - 783275142;
HIDWORD(v22) = (((HIDWORD(v22) - 300813965) << 9) | ((unsigned int)(HIDWORD(v22) - 300813965) >> 23)) - 783275142;
*(_QWORD *)(a1 + 24) = v22;
}
return v12;
}
 
Короче, решил делать софт на раст, если оффсеты нашел, то декрипт не нашел, я решил искать его по этому гайду -
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)
и получается, я ввел свой hex + get_imagebase(), получил адресс, перешел по сабу, нажал ф5 и меня перекинуло в псевдокод (пусть будет А)

вот если надо
__int64 sub_180BF4590()
{
__int64 v0; // rax
__int64 v1; // rax
int v2; // ebx
__int64 v3; // rdi
__int64 result; // rax
__int64 v5; // rcx
__int64 v6; // rdi
__int64 v7; // rbx
__int64 v8; // rcx
__int64 v9; // rax
__int64 v10; // rdx
__int64 v11; // rbx
unsigned __int8 v12; // al
bool v13; // al
signed __int32 v14[10]; // [rsp+0h] [rbp-58h] BYREF
__int128 v15; // [rsp+28h] [rbp-30h] BYREF
__int64 v16[4]; // [rsp+38h] [rbp-20h] BYREF

if ( !byte_18D32D893 )
{
sub_18060F100(&qword_18D0683C0);
_InterlockedOr(v14, 0);
sub_18060F100(&qword_18D04CA70);
_InterlockedOr(v14, 0);
sub_18060F100(&qword_18D04CA58);
_InterlockedOr(v14, 0);
sub_18060F100(&basenetwork);
_InterlockedOr(v14, 0);
sub_18060F100(&unk_18D04CAC8);
_InterlockedOr(v14, 0);
sub_18060F100(&qword_18D04CA38);
_InterlockedOr(v14, 0);
sub_18060F100(&qword_18D04CA48);
_InterlockedOr(v14, 0);
byte_18D32D893 = 1;
}
v15 = 0i64;
v0 = basenetwork;
if ( !*(_DWORD *)(basenetwork + 224) )
{
il2cpp_runtime_class_init_0(basenetwork);
v0 = basenetwork;
}
v1 = sub_180C106E0(*(_QWORD *)(*(_QWORD *)(v0 + 184) + 8i64), qword_18D04CA58);
if ( !v1 )
sub_1805A5350();
v15 = *(_OWORD *)sub_184462100(v16, v1, 0i64);
v16[0] = 0i64;
v16[1] = (__int64)&v15;
while ( 1 )
{
v2 = ++DWORD2(v15);
v3 = v15;
if ( !(_QWORD)v15 )
sub_1805A5350();
result = qword_18D04CA38;
v5 = *(_QWORD *)(qword_18D04CA38 + 32);
if ( (*(_BYTE *)(v5 + 309) & 1) == 0 )
result = sub_180647F30(v5);
if ( v2 >= *(_DWORD *)(v3 + 24) )
break;
v6 = v15;
v7 = SDWORD2(v15);
if ( !(_QWORD)v15 )
sub_1805A5350();
v8 = *(_QWORD *)(qword_18D04CA48 + 32);
if ( (*(_BYTE *)(v8 + 309) & 1) == 0 )
sub_180647F30(v8);
v9 = *(_QWORD *)(v6 + 16);
if ( !v9 )
sub_1805A5350();
if ( (unsigned int)v7 >= *(_DWORD *)(v9 + 24) )
sub_1805A5360();
v10 = *(_QWORD *)(v9 + 8 * v7 + 32);
if ( v10 )
{
v12 = *(_BYTE *)(qword_18D04CA70 + 304);
v13 = *(_BYTE *)(*(_QWORD *)v10 + 304i64) >= v12
&& *(_QWORD *)(*(_QWORD *)(*(_QWORD *)v10 + 200i64) + 8i64 * v12 - 8) == qword_18D04CA70;
v11 = 0i64;
if ( v13 )
v11 = v10;
}
else
{
v11 = 0i64;
}
if ( !*(_DWORD *)(qword_18D0683C0 + 224) )
il2cpp_runtime_class_init_0(qword_18D0683C0);
if ( !byte_18D36A248 )
{
sub_18060F100(&qword_18D0683C0);
_InterlockedOr(v14, 0);
byte_18D36A248 = 1;
}
if ( !*(_DWORD *)(qword_18D0683C0 + 224) )
il2cpp_runtime_class_init_0(qword_18D0683C0);
if ( !byte_18D36A1DA )
{
sub_18060F100(&qword_18D0683C0);
_InterlockedOr(v14, 0);
byte_18D36A1DA = 1;
}
if ( !v11 )
sub_1805A5350();
if ( !*(_DWORD *)(qword_18D0683C0 + 224) )
il2cpp_runtime_class_init_0(qword_18D0683C0);
if ( !*(_QWORD *)(v11 + 16) )
sub_180BF4F10(v11, 0i64);
}
return result;
}

я перешел по сабу который был в переменной v1 ( v1 = sub_180C106E0(*(_QWORD *)(*(_QWORD *)(v0 + 184) + 8i64), qword_18D04CA58); ) и перешел в другой псевдокод (будем называть псевдокод-б) и что-же нам теперь делать? в этом гайде написано что это и есть ваш декрипт, но я чет нихуя не понял, кто из них мой декрипт и как его сделать, кстати для чего этот декрипт ваще нужен, для чего его юзают и самое главное - как?

вот если надо псевдокод-б
__int64 __fastcall sub_180C106E0(__int64 a1, __int64 a2)
{
__int64 *v4; // rdx
int v5; // r8d
int v6; // eax
__int64 v7; // rcx
__int64 target_0; // rax
__int64 v9; // rcx
__int64 v10; // rbp
__int64 v11; // rbx
__int64 v12; // rsi
int v13; // eax
__int64 v14; // rax
signed __int64 v15; // rcx
__int64 v16; // rbx
__int64 v18; // rax
__int64 v19; // rbx
__int64 v20; // rax
__int64 v21; // rax
__int64 v22; // [rsp+20h] [rbp-28h] BYREF
signed __int64 v23; // [rsp+50h] [rbp+8h] BYREF

if ( !*(_QWORD *)(a2 + 56) )
sub_180647FB0(a2);
if ( !a1 )
sub_1805A5350();
if ( *(_BYTE *)(a1 + 16) )
{
v4 = &v22;
v22 = *(_QWORD *)(a1 + 24);
v5 = 2;
do
{
v6 = *(_DWORD *)v4;
v4 = (__int64 *)((char *)v4 + 4);
*((_DWORD *)v4 - 1) = (((v6 + 783275142) << 23) | ((unsigned int)(v6 + 783275142) >> 9)) + 300813965;
--v5;
}
while ( v5 );
v7 = v22;
}
else
{
v7 = 0i64;
}
v23 = v7;
if ( !v7 )
return 0i64;
target_0 = il2cpp_gchandle_get_target_0();
v9 = *(_QWORD *)(a2 + 56);
v10 = target_0;
v11 = *(_QWORD *)(v9 + 8);
if ( (*(_BYTE *)(v11 + 309) & 1) == 0 )
v11 = sub_180647F30(*(_QWORD *)(v9 + 8));
if ( v10 )
{
v12 = sub_180595E10(v10, v11);
if ( !v12 )
sub_1805A5AC0(v10, v11);
}
else
{
v12 = 0i64;
}
v13 = *(_DWORD *)(a1 + 32) + 1;
*(_DWORD *)(a1 + 32) = v13;
if ( v13 >= 1000 )
{
*(_DWORD *)(a1 + 32) = 0;
v14 = sub_1884DAE90(v12, 2i64, 0i64);
v15 = v23;
v16 = v14;
if ( !v23 || _InterlockedCompareExchange64(&v23, 0i64, v23) != v15 )
{
v18 = sub_1805A4F30(&qword_18D04C048);
v19 = sub_1805A5300(v18);
v20 = sub_1805A4F30(&qword_18D0141C0);
sub_188620870(v19, v20, 0i64);
v21 = sub_1805A4F30(aJ);
sub_1805A5310(v19, v21);
}
il2cpp_gchandle_free_0();
HIDWORD(v22) = HIDWORD(v16);
LODWORD(v22) = ((((_DWORD)v16 - 300813965) << 9) | ((unsigned int)(v16 - 300813965) >> 23)) - 783275142;
HIDWORD(v22) = (((HIDWORD(v22) - 300813965) << 9) | ((unsigned int)(HIDWORD(v22) - 300813965) >> 23)) - 783275142;
*(_QWORD *)(a1 + 24) = v22;
}
return v12;
}

вот у тебя декрипт в твоём псевдокоде:
v4 = &v22;
v22 = *(_QWORD *)(a1 + 24);
v5 = 2;
do
{
v6 = *(_DWORD *)v4;
v4 = (__int64 *)((char *)v4 + 4);
*((_DWORD *)v4 - 1) = (((v6 + 783275142) << 23) | ((unsigned int)(v6 + 783275142) >> 9)) + 300813965;
--v5;
}
while ( v5 );
v7 = v22;

вот пример готового:

std::uintptr_t rax = driver.read<uintptr_t>(address + 0x18); //address (адрес того что функция декриптит) (у тебя в псевдокоде decimal значения, 24 в hex = 0x18)
std::uintptr_t* rdx = &rax;
std::uint32_t r8d = 0x2;
std::uint32_t eax, ecx;

do {
eax = *(std::uint32_t*)(rdx);
rdx = (std::uintptr_t*)((std::uint8_t*)rdx + 0x4);
eax = eax ^ 0xFFFFFFFFB4598A61;
eax = eax + 0xFFFFFFFFA053F1AB;
ecx = eax;
eax = eax << 0x19;
ecx = ecx >> 0x7;
ecx = ecx | eax;
*((std::uint32_t*)rdx - 1) = ecx;
--r8d;
} while (r8d);
return Il2cppGetHandle(rax);
 
u
вот у тебя декрипт в твоём псевдокоде:
v4 = &v22;
v22 = *(_QWORD *)(a1 + 24);
v5 = 2;
do
{
v6 = *(_DWORD *)v4;
v4 = (__int64 *)((char *)v4 + 4);
*((_DWORD *)v4 - 1) = (((v6 + 783275142) << 23) | ((unsigned int)(v6 + 783275142) >> 9)) + 300813965;
--v5;
}
while ( v5 );
v7 = v22;

вот пример готового:

std::uintptr_t rax = driver.read<uintptr_t>(address + 0x18); //address (адрес того что функция декриптит) (у тебя в псевдокоде decimal значения, 24 в hex = 0x18)
std::uintptr_t* rdx = &rax;
std::uint32_t r8d = 0x2;
std::uint32_t eax, ecx;

do {
eax = *(std::uint32_t*)(rdx);
rdx = (std::uintptr_t*)((std::uint8_t*)rdx + 0x4);
eax = eax ^ 0xFFFFFFFFB4598A61;
eax = eax + 0xFFFFFFFFA053F1AB;
ecx = eax;
eax = eax << 0x19;
ecx = ecx >> 0x7;
ecx = ecx | eax;
*((std::uint32_t*)rdx - 1) = ecx;
--r8d;
} while (r8d);
return Il2cppGetHandle(rax);
спасибо родной, но сможешь помочь? типо я хочу понять, для чего нужны эти декрипты, типо обращаться к методам из оффсета?
 
случайно тыкнул ответить ;D
u

спасибо родной, но сможешь помочь? типо я хочу понять, для чего нужны эти декрипты, типо обращаться к методам из оффсета?
поизучай тему по реверсу rust на unknowncheats, поймёшь для чего
 
Назад
Сверху Снизу