В общем, прогресс идет. Изучил ассемблер и windbg и по константам, которые использовались в коде удалось найти кодировщики - оказалось шифровали блочными алгоритмами blowfish и cast5
из спротивного интереса полез дальше ковырять, там еще одним блочным алгоритмом дешифруется, но выглядит он с одной стороны просто, с другой неочевидно.. констант для зацепки не вижу. Может кто то подскажет, поймет по коду о чем речь?'
функция sub_75DDE0 декодирует блоки по 8 байт, судя по всему блоки независимы друг от друга, первый параметр - какая то информация для декодировани, вторые 2 - указатели In и Out, на практике указывают в одно место
Code: Select all
WORD *__usercall sub_75DB2C@<eax>(_WORD *result@<eax>, unsigned __int16 a2@<dx>)
{
int v2; // ecx
v2 = a2 * (unsigned __int16)*result;
if ( v2 )
{
*result = HIWORD(v2);
*result = v2 - *result;
if ( (unsigned __int16)v2 < *result )
++*result;
}
else
{
*result = 1 - *result - a2;
}
return result;
}
int __usercall sub_75DDE0@<eax>(_WORD *a1@<eax>, unsigned int a2@<edx>, _DWORD *a3@<ecx>)
{
signed int v3; // edi
unsigned __int16 *v4; // eax
unsigned int v5; // ecx
signed int v6; // edi
_WORD *v7; // ebx
int v8; // edx
int v9; // ecx
int v10; // edx
int v11; // ecx
unsigned __int16 v12; // bp
int v13; // edx
int v14; // ecx
int v15; // edx
int v16; // edx
int v17; // ecx
unsigned __int16 v18; // bp
int result; // eax
_WORD *v20; // [esp+0h] [ebp-24h]
_DWORD *v21; // [esp+4h] [ebp-20h]
unsigned __int16 v22; // [esp+8h] [ebp-1Ch]
unsigned __int16 v23; // [esp+Ah] [ebp-1Ah]
unsigned __int16 v24; // [esp+Ch] [ebp-18h]
unsigned __int16 v25; // [esp+Eh] [ebp-16h]
unsigned __int16 v26; // [esp+10h] [ebp-14h]
v21 = a3;
v20 = a1;
v22 = *(_WORD *)a2;
v23 = *(_DWORD *)a2 >> 16;
v24 = *(_WORD *)(a2 + 4);
v25 = *(_DWORD *)(a2 + 4) >> 16;
v3 = 4;
v4 = &v22;
do
{
LOWORD(a2) = *v4;
v5 = a2 << 8;
a2 = (unsigned int)*v4 >> 8;
LOWORD(v5) = a2 | v5;
*v4 = v5;
++v4;
--v3;
}
while ( v3 );
v6 = 8;
v7 = v20 + 60;
do
{
LOWORD(a2) = *v7;
((void (__fastcall *)(unsigned int, unsigned int))unk_75DB2C)(v5, a2);
v23 += v7[1];
v24 += v7[2];
LOWORD(v8) = v7[3];
((void (__fastcall *)(int, int))unk_75DB2C)(v9, v8);
v26 = v24;
v24 ^= v22;
LOWORD(v10) = v7[4];
((void (__fastcall *)(int, int))unk_75DB2C)(v11, v10);
v12 = v23;
v23 ^= v25;
v23 += v24;
LOWORD(v13) = v7[5];
((void (__fastcall *)(int, int))unk_75DB2C)(v14, v13);
v24 += v23;
v22 ^= v23;
v25 ^= v24;
v23 ^= v26;
v24 ^= v12;
v7 += 6;
--v6;
}
while ( v6 );
HIWORD(v15) = HIWORD(v20);
LOWORD(v15) = v20[108];
((void (__fastcall *)(unsigned int, int))unk_75DB2C)(v5, v15);
v24 += v20[109];
v23 += v20[110];
HIWORD(v16) = HIWORD(v20);
LOWORD(v16) = v20[111];
((void (__fastcall *)(int, int))unk_75DB2C)(v17, v16);
v22 = (v22 >> 8) | (v22 << 8);
v18 = (v24 >> 8) | (v24 << 8);
v24 = (v23 >> 8) | (v23 << 8);
v25 = (v25 >> 8) | (v25 << 8);
v23 = v18;
*v21 = v18;
*v21 <<= 16;
*v21 |= v22;
v21[1] = v25;
v21[1] <<= 16;
result = v24;
v21[1] |= v24;
return result;
}