刚逆向了一个软件,里面有个解密算法是 读文件的0x18个字节BUF经过解密函数后得到 一个URL,想知道是什么解密算法,感觉这个算法应该是市面上通用的算法(看见实现体里面很多左移右移与啊或啊的很庞大,估摸着应该是市面上通用的算法)
算法如下
int __fastcall sub_10B845F(int a1, unsigned int a2, int a3, signed int a4)
{
signed int v4; // edi@1
unsigned int v5; // eax@1
int v6; // edx@6
int v7; // ebx@6
int v8; // esi@6
unsigned int v9; // edi@7
int v10; // eax@8
int v11; // ecx@8
int v12; // eax@8
int v13; // ecx@11
int v14; // eax@11
int v15; // esi@11
int v16; // edx@11
int v17; // edi@21
signed int v18; // ecx@21
int v19; // esi@21
int v20; // eax@23
int v21; // ecx@23
int result; // eax@25
int v23; // eax@26
int v24; // [sp+Ch] [bp-11Ch]@1
int v25; // [sp+18h] [bp-110h]@6
int v26; // [sp+18h] [bp-110h]@25
int v27; // [sp+1Ch] [bp-10Ch]@6
int v28; // [sp+1Ch] [bp-10Ch]@25
unsigned int v29; // [sp+20h] [bp-108h]@1
int v30; // [sp+20h] [bp-108h]@23
int v31; // [sp+24h] [bp-104h]@8
int v32[63]; // [sp+28h] [bp-100h]@8
unsigned int v33; // [sp+124h] [bp-4h]@1
int v34; // [sp+128h] [bp+0h]@1
v33 = (unsigned int)&v34 ^ __security_cookie;
v4 = a4;
v5 = a2;
v29 = a2;
v24 = a1;
if ( a4 != 16 && a4 != 12 )
{
if ( a4 != 8 )
v4 = 16;
a4 = v4;
}
v6 = a3;
v7 = 0;
*(_DWORD *)a1 = v4;
v8 = 0;
v25 = 0;
v27 = 0;
if ( ((v5 - 8) & 0x80000000u) == 0 )
{
v9 = v5 >> 3;
v27 = 8 * (v5 >> 3);
do
{
v10 = *(_BYTE *)(v6 + 5);
*(&v31 + v8) = (*(_BYTE *)(v6 + 3) << 24) | (*(_BYTE *)(v6 + 2) << 16) | (*(_BYTE *)(v6 + 1) << 8) | *(_BYTE *)v6;
v11 = (*(_BYTE *)(v6 + 6) << 16) | (v10 << 8) | *(_BYTE *)(v6 + 4);
v12 = *(_BYTE *)(v6 + 7) << 24;
v6 += 8;
v32[v8] = v12 | v11;
v8 += 2;
--v9;
}
while ( v9 );
v4 = a4;
v5 = v29;
v25 = v8;
}
if ( v5 != v27 )
{
v13 = 0;
v14 = v29 & 7;
v15 = 0;
v16 = v14 + v6;
switch ( v14 )
{
case 8:
--v16;
v13 = *(_BYTE *)v16 << 24;
goto LABEL_13;
case 7:
LABEL_13:
--v16;
v13 |= *(_BYTE *)v16 << 16;
goto LABEL_14;
case 6:
LABEL_14:
--v16;
v13 |= *(_BYTE *)v16 << 8;
goto LABEL_15;
case 5:
LABEL_15:
--v16;
v13 |= *(_BYTE *)v16;
goto LABEL_16;
case 4:
LABEL_16:
--v16;
v15 = *(_BYTE *)v16 << 24;
goto LABEL_17;
case 3:
LABEL_17:
--v16;
v15 |= *(_BYTE *)v16 << 16;
goto LABEL_18;
case 2:
LABEL_18:
--v16;
v15 |= *(_BYTE *)v16 << 8;
goto LABEL_19;
case 1:
LABEL_19:
v15 |= *(_BYTE *)(v16 - 1);
break;
default:
break;
}
*(&v31 + v25) = v15;
v32[v25] = v13;
}
v17 = 2 * v4 + 2;
v18 = 1;
v19 = (signed int)(v29 + 3) / 4;
for ( *(_DWORD *)(v24 + 4) = 0xB7E15163u; v18 < v17; ++v18 )
*(_DWORD *)(v24 + 4 * v18 + 4) = *(_DWORD *)(v24 + 4 * v18) - 0x61C88647;
v30 = 0;
v20 = v19;
v21 = 0;
if ( v17 > v19 )
v20 = v17;
v28 = 3 * v20;
result = 0;
v26 = 0;
if ( v28 > 0 )
{
do
{
v21 = __ROL__(*(_DWORD *)(v24 + 4 * result + 4) + v30 + v21, 3);
*(_DWORD *)(v24 + 4 * result + 4) = v21;
v23 = __ROL__(v21 + v30 + *(&v31 + v7), (v30 + (_BYTE)v21) & 0x1F);
*(&v31 + v7) = v23;
v30 = v23;
result = v26 + 1;
if ( v26 + 1 >= v17 )
result = 0;
++v7;
v26 = result;
if ( v7 >= v19 )
v7 = 0;
--v28;
}
while ( v28 );
}
return result;
}
unsigned int __fastcall sub_10B7C16(int a1, int a2, unsigned int a3, int a4, int a5, int a6)
{
int v6; // edi@1
int v7; // edx@1
int v8; // esi@2
int v9; // ebx@2
int v10; // ecx@2
unsigned int v11; // eax@2
int v12; // esi@3
int v13; // ecx@4
int v14; // ecx@4
int v15; // eax@4
unsigned int v16; // eax@4
bool v17; // zf@4
int v18; // ecx@7
int v19; // edx@7
int v20; // eax@7
unsigned int v21; // eax@16
unsigned int result; // eax@17
int v23; // ebx@18
int v24; // ecx@18
int v25; // esi@18
bool v26; // sf@18
unsigned int v27; // eax@18
int v28; // ebx@19
int v29; // edi@20
int v30; // esi@20
int v31; // ecx@20
int v32; // edx@20
int v33; // eax@23
int v34; // ecx@23
int v35; // eax@23
int v36; // eax@23
int v37; // edx@23
int v38; // ecx@23
unsigned int v39; // edx@32
unsigned int v40; // [sp+Ch] [bp-1Ch]@4
int v41; // [sp+10h] [bp-18h]@4
int v42; // [sp+14h] [bp-14h]@18
unsigned int v43; // [sp+18h] [bp-10h]@7
int v44; // [sp+1Ch] [bp-Ch]@2
int v45; // [sp+20h] [bp-8h]@2
int v46; // [sp+24h] [bp-4h]@5
unsigned int v47; // [sp+30h] [bp+8h]@3
int v48; // [sp+30h] [bp+8h]@7
unsigned int v49; // [sp+30h] [bp+8h]@18
int v50; // [sp+3Ch] [bp+14h]@18
int v51; // [sp+3Ch] [bp+14h]@23
v6 = a2;
v7 = a1;
if ( a6 )
{
v8 = a5;
v9 = (*(_BYTE *)(a5 + 3) << 24) | (*(_BYTE *)(a5 + 2) << 16) | (*(_BYTE *)(a5 + 1) << 8) | *(_BYTE *)a5;
v10 = (*(_BYTE *)(a5 + 7) << 24) | (*(_BYTE *)(a5 + 6) << 16) | (*(_BYTE *)(a5 + 5) << 8) | *(_BYTE *)(a5 + 4);
v11 = a3 - 8;
v44 = (*(_BYTE *)(a5 + 7) << 24) | (*(_BYTE *)(a5 + 6) << 16) | (*(_BYTE *)(a5 + 5) << 8) | *(_BYTE *)(a5 + 4);
v45 = a3 - 8;
if ( ((a3 - 8) & 0x80000000u) == 0 )
{
v12 = v7;
v47 = a3 >> 3;
v45 += -8 * v47;
do
{
v13 = (*(_BYTE *)(v12 + 5) << 8) | *(_BYTE *)(v12 + 4);
v40 = v9 ^ ((*(_BYTE *)(v12 + 3) << 24) | (*(_BYTE *)(v12 + 2) << 16) | (*(_BYTE *)(v12 + 1) << 8) | *(_BYTE *)v12);
v14 = (*(_BYTE *)(v12 + 6) << 16) | v13;
v15 = *(_BYTE *)(v12 + 7) << 24;
v12 += 8;
v41 = v44 ^ (v15 | v14);
sub_10B809E(&v40, a4);
v9 = v40;
v10 = v41;
v16 = v40 >> 8;
*(_BYTE *)v6 = v40;
*(_BYTE *)(v6 + 1) = v16;
*(_BYTE *)(v6 + 2) = (unsigned int)v9 >> 16;
*(_BYTE *)(v6 + 3) = BYTE3(v9);
*(_BYTE *)(v6 + 4) = v10;
*(_BYTE *)(v6 + 5) = BYTE1(v10);
*(_BYTE *)(v6 + 6) = (unsigned int)v10 >> 16;
*(_BYTE *)(v6 + 7) = BYTE3(v10);
v6 += 8;
v17 = v47-- == 1;
v44 = v10;
}
while ( !v17 );
v11 = v45;
v46 = v12;
v8 = a5;
v7 = v46;
}
if ( v11 != -8 )
{
v18 = v7 + v11 + 8;
v19 = 0;
v43 = v45 + 7;
v20 = 0;
v48 = 0;
switch ( v45 + 7 )
{
case 7:
--v18;
v19 = *(_BYTE *)v18 << 24;
goto LABEL_9;
case 6:
LABEL_9:
--v18;
v19 |= *(_BYTE *)v18 << 16;
goto LABEL_10;
case 5:
LABEL_10:
--v18;
v19 |= *(_BYTE *)v18 << 8;
goto LABEL_11;
case 4:
LABEL_11:
--v18;
v19 |= *(_BYTE *)v18;
goto LABEL_12;
case 3:
LABEL_12:
--v18;
v48 = *(_BYTE *)v18 << 24;
goto LABEL_13;
case 2:
LABEL_13:
--v18;
v48 |= *(_BYTE *)v18 << 16;
goto LABEL_14;
case 1:
LABEL_14:
--v18;
v48 |= *(_BYTE *)v18 << 8;
goto LABEL_15;
case 0:
LABEL_15:
v20 = *(_BYTE *)(v18 - 1) | v48;
break;
default:
break;
}
v41 = v44 ^ v19;
v40 = v9 ^ v20;
sub_10B809E(&v40, a4);
v9 = v40;
v10 = v41;
v21 = v40 >> 8;
*(_BYTE *)v6 = v40;
*(_BYTE *)(v6 + 1) = v21;
v8 = a5;
*(_BYTE *)(v6 + 2) = (unsigned int)v9 >> 16;
*(_BYTE *)(v6 + 3) = BYTE3(v9);
*(_BYTE *)(v6 + 4) = v10;
*(_BYTE *)(v6 + 5) = BYTE1(v10);
*(_BYTE *)(v6 + 6) = (unsigned int)v10 >> 16;
*(_BYTE *)(v6 + 7) = BYTE3(v10);
}
*(_BYTE *)v8 = v9;
*(_BYTE *)(v8 + 1) = BYTE1(v9);
*(_BYTE *)(v8 + 2) = (unsigned int)v9 >> 16;
*(_BYTE *)(v8 + 3) = BYTE3(v9);
*(_BYTE *)(v8 + 4) = v10;
*(_BYTE *)(v8 + 5) = BYTE1(v10);
result = (unsigned int)v10 >> 16;
*(_BYTE *)(v8 + 6) = (unsigned int)v10 >> 16;
*(_BYTE *)(v8 + 7) = BYTE3(v10);
}
else
{
v23 = a5;
v42 = a5;
v24 = (*(_BYTE *)(a5 + 3) << 24) | (*(_BYTE *)(a5 + 2) << 16) | (*(_BYTE *)(a5 + 1) << 8) | *(_BYTE *)a5;
v50 = (*(_BYTE *)(a5 + 3) << 24) | (*(_BYTE *)(a5 + 2) << 16) | (*(_BYTE *)(a5 + 1) << 8) | *(_BYTE *)a5;
v25 = (*(_BYTE *)(a5 + 7) << 24) | (*(_BYTE *)(a5 + 6) << 16) | (*(_BYTE *)(a5 + 5) << 8) | *(_BYTE *)(a5 + 4);
v26 = ((a3 - 8) & 0x80000000u) != 0;
v27 = a3 - 8;
v45 = (*(_BYTE *)(a5 + 7) << 24) | (*(_BYTE *)(a5 + 6) << 16) | (*(_BYTE *)(a5 + 5) << 8) | *(_BYTE *)(a5 + 4);
v49 = a3 - 8;
if ( !v26 )
{
v28 = v6;
v43 = (v27 + 8) >> 3;
v49 += -8 * v43;
do
{
v30 = (*(_BYTE *)(v7 + 5) << 8) | *(_BYTE *)(v7 + 4);
v40 = (*(_BYTE *)(v7 + 3) << 24) | (*(_BYTE *)(v7 + 2) << 16) | (*(_BYTE *)(v7 + 1) << 8) | *(_BYTE *)v7;
v29 = v40;
v25 = (*(_BYTE *)(v7 + 7) << 24) | (*(_BYTE *)(v7 + 6) << 16) | v30;
v46 = v7 + 8;
v41 = v25;
sub_10B82CE(&v40, a4);
v31 = v50 ^ v40;
v32 = v45 ^ v41;
*(_BYTE *)v28 = v50 ^ v40;
*(_BYTE *)(v28 + 1) = BYTE1(v31);
*(_BYTE *)(v28 + 2) = (unsigned int)v31 >> 16;
*(_BYTE *)(v28 + 3) = BYTE3(v31);
v24 = v29;
*(_BYTE *)(v28 + 4) = v32;
*(_BYTE *)(v28 + 5) = BYTE1(v32);
*(_BYTE *)(v28 + 6) = (unsigned int)v32 >> 16;
*(_BYTE *)(v28 + 7) = BYTE3(v32);
v28 += 8;
v17 = v43-- == 1;
v7 = v46;
v50 = v29;
v45 = v25;
}
while ( !v17 );
v27 = v49;
v44 = v28;
v23 = v42;
v6 = v44;
}
if ( v27 == -8 )
{
v39 = v45;
}
else
{
v33 = *(_BYTE *)(v7 + 5);
v42 = (*(_BYTE *)(v7 + 3) << 24) | (*(_BYTE *)(v7 + 2) << 16) | (*(_BYTE *)(v7 + 1) << 8) | *(_BYTE *)v7;
v40 = v42;
v34 = (v33 << 8) | *(_BYTE *)(v7 + 4);
v35 = *(_BYTE *)(v7 + 6);
v44 = v34;
v44 = ((v35 | (*(_BYTE *)(v7 + 7) << 8)) << 16) | v34;
v41 = v44;
sub_10B82CE(&v40, a4);
v36 = v25 ^ v41;
v37 = v50 ^ v40;
v51 = v25 ^ v41;
v38 = v6 + v49 + 8;
switch ( v49 + 7 )
{
case 7u:
--v38;
*(_BYTE *)v38 = BYTE3(v36);
v36 = v51;
goto LABEL_25;
case 6u:
LABEL_25:
--v38;
*(_BYTE *)v38 = (unsigned int)v36 >> 16;
BYTE1(v36) = BYTE1(v51);
goto LABEL_26;
case 5u:
LABEL_26:
--v38;
*(_BYTE *)v38 = BYTE1(v36);
LOBYTE(v36) = v51;
goto LABEL_27;
case 4u:
LABEL_27:
--v38;
*(_BYTE *)v38 = v36;
goto LABEL_28;
case 3u:
LABEL_28:
--v38;
*(_BYTE *)v38 = BYTE3(v37);
goto LABEL_29;
case 2u:
LABEL_29:
--v38;
*(_BYTE *)v38 = (unsigned int)v37 >> 16;
goto LABEL_30;
case 1u:
LABEL_30:
--v38;
*(_BYTE *)v38 = BYTE1(v37);
goto LABEL_31;
case 0u:
LABEL_31:
*(_BYTE *)(v38 - 1) = v37;
break;
default:
break;
}
v24 = v42;
v39 = v44;
}
*(_BYTE *)v23 = v24;
*(_BYTE *)(v23 + 1) = BYTE1(v24);
*(_BYTE *)(v23 + 2) = (unsigned int)v24 >> 16;
*(_BYTE *)(v23 + 3) = BYTE3(v24);
*(_BYTE *)(v23 + 4) = v39;
*(_BYTE *)(v23 + 5) = BYTE1(v39);
result = v39 >> 16;
*(_BYTE *)(v23 + 6) = v39 >> 16;
*(_BYTE *)(v23 + 7) = BYTE3(v39);
}
return result;
}
int __fastcall sub_10B82CE(int a1, int a2)
{
int v2; // eax@1
int v3; // esi@1
int v4; // esi@2
int v5; // esi@2
int v6; // eax@2
int v7; // eax@2
int v8; // esi@2
int v9; // esi@2
int v10; // eax@2
int v11; // eax@2
int v12; // esi@2
int v13; // esi@2
int v14; // eax@2
int v15; // eax@2
int v16; // esi@2
int v17; // eax@2
int v18; // esi@4
int v19; // esi@4
int v20; // eax@4
int v21; // eax@4
int v22; // esi@4
int v23; // esi@4
int v24; // eax@4
int v25; // eax@4
int v26; // esi@4
int v27; // esi@4
int v28; // eax@4
int v29; // eax@4
int v30; // esi@4
int v31; // eax@4
int v32; // esi@5
int v33; // esi@5
int v34; // eax@5
int v35; // eax@5
int v36; // esi@5
int v37; // esi@5
int v38; // eax@5
int v39; // eax@5
int v40; // esi@5
int v41; // esi@5
int v42; // eax@5
int v43; // eax@5
int v44; // esi@5
int v45; // esi@5
int v46; // eax@5
int v47; // eax@5
int v48; // esi@5
int v49; // esi@5
int v50; // eax@5
int v51; // eax@5
int v52; // esi@5
int v53; // esi@5
int v54; // eax@5
int v55; // eax@5
int v56; // esi@5
int v57; // esi@5
int v58; // eax@5
int v59; // eax@5
int v60; // esi@5
int v61; // esi@5
int v62; // eax@5
int result; // eax@5
v2 = *(_DWORD *)a1;
v3 = *(_DWORD *)(a1 + 4);
if ( *(_DWORD *)a2 == 16 )
{
v4 = __ROR__(v3 - *(_DWORD *)(a2 + 136), v2 & 0x1F);
v5 = v2 ^ v4;
v6 = __ROR__(v2 - *(_DWORD *)(a2 + 132), v5 & 0x1F);
v7 = v5 ^ v6;
v8 = __ROR__(v5 - *(_DWORD *)(a2 + 128), v7 & 0x1F);
v9 = v7 ^ v8;
v10 = __ROR__(v7 - *(_DWORD *)(a2 + 124), v9 & 0x1F);
v11 = v9 ^ v10;
v12 = __ROR__(v9 - *(_DWORD *)(a2 + 120), v11 & 0x1F);
v13 = v11 ^ v12;
v14 = __ROR__(v11 - *(_DWORD *)(a2 + 116), v13 & 0x1F);
v15 = v13 ^ v14;
v16 = __ROR__(v13 - *(_DWORD *)(a2 + 112), v15 & 0x1F);
v3 = v15 ^ v16;
v17 = __ROR__(v15 - *(_DWORD *)(a2 + 108), v3 & 0x1F);
v2 = v3 ^ v17;
LABEL_4:
v18 = __ROR__(v3 - *(_DWORD *)(a2 + 104), v2 & 0x1F);
v19 = v2 ^ v18;
v20 = __ROR__(v2 - *(_DWORD *)(a2 + 100), v19 & 0x1F);
v21 = v19 ^ v20;
v22 = __ROR__(v19 - *(_DWORD *)(a2 + 96), v21 & 0x1F);
v23 = v21 ^ v22;
v24 = __ROR__(v21 - *(_DWORD *)(a2 + 92), v23 & 0x1F);
v25 = v23 ^ v24;
v26 = __ROR__(v23 - *(_DWORD *)(a2 + 88), v25 & 0x1F);
v27 = v25 ^ v26;
v28 = __ROR__(v25 - *(_DWORD *)(a2 + 84), v27 & 0x1F);
v29 = v27 ^ v28;
v30 = __ROR__(v27 - *(_DWORD *)(a2 + 80), v29 & 0x1F);
v3 = v29 ^ v30;
v31 = __ROR__(v29 - *(_DWORD *)(a2 + 76), v3 & 0x1F);
v2 = v3 ^ v31;
goto LABEL_5;
}
if ( *(_DWORD *)a2 == 12 )
goto LABEL_4;
LABEL_5:
v32 = __ROR__(v3 - *(_DWORD *)(a2 + 72), v2 & 0x1F);
v33 = v2 ^ v32;
v34 = __ROR__(v2 - *(_DWORD *)(a2 + 68), v33 & 0x1F);
v35 = v33 ^ v34;
v36 = __ROR__(v33 - *(_DWORD *)(a2 + 64), v35 & 0x1F);
v37 = v35 ^ v36;
v38 = __ROR__(v35 - *(_DWORD *)(a2 + 60), v37 & 0x1F);
v39 = v37 ^ v38;
v40 = __ROR__(v37 - *(_DWORD *)(a2 + 56), v39 & 0x1F);
v41 = v39 ^ v40;
v42 = __ROR__(v39 - *(_DWORD *)(a2 + 52), v41 & 0x1F);
v43 = v41 ^ v42;
v44 = __ROR__(v41 - *(_DWORD *)(a2 + 48), v43 & 0x1F);
v45 = v43 ^ v44;
v46 = __ROR__(v43 - *(_DWORD *)(a2 + 44), v45 & 0x1F);
v47 = v45 ^ v46;
v48 = __ROR__(v45 - *(_DWORD *)(a2 + 40), v47 & 0x1F);
v49 = v47 ^ v48;
v50 = __ROR__(v47 - *(_DWORD *)(a2 + 36), v49 & 0x1F);
v51 = v49 ^ v50;
v52 = __ROR__(v49 - *(_DWORD *)(a2 + 32), v51 & 0x1F);
v53 = v51 ^ v52;
v54 = __ROR__(v51 - *(_DWORD *)(a2 + 28), v53 & 0x1F);
v55 = v53 ^ v54;
v56 = __ROR__(v53 - *(_DWORD *)(a2 + 24), v55 & 0x1F);
v57 = v55 ^ v56;
v58 = __ROR__(v55 - *(_DWORD *)(a2 + 20), v57 & 0x1F);
v59 = v57 ^ v58;
v60 = __ROR__(v57 - *(_DWORD *)(a2 + 16), v59 & 0x1F);
v61 = v59 ^ v60;
v62 = __ROR__(v59 - *(_DWORD *)(a2 + 12), v61 & 0x1F);
result = (v61 ^ v62) - *(_DWORD *)(a2 + 4);
*(_DWORD *)(a1 + 4) = v61 - *(_DWORD *)(a2 + 8);
*(_DWORD *)a1 = result;
return result;
}
密文BUF:2D 0F 0D 8F4F2D23F7679814B073346D36AD89C38F5185F1CE 0x18个字节
解密出来得到:http://www.hao123.com/
最后,我想说的是我只想逆向还原,考虑到copy IDA f5的东西不现实,希望会的说下是什么算法,这样我好网上找其实现的源码来还原.希望懂的说下,谢谢了~!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!