加密数据包加解密部分逆向跟踪

 逆向跟踪了下某雷P2SP Content Distribution的协议中解密函数

char __stdcall sub_21343310(int a1, int a2)
{
unsigned int v2; // ebx@1
char result; // al@2
int v4; // edi@5
signed int v5; // esi@5
int v6; // ecx@7
int v7; // edx@7
int v8; // eax@7
int v9; // ecx@7
char v10; // al@8
char v11; // bl@10
int v12; // [sp+0h] [bp-1D8h]@1
char v13; // [sp+Ch] [bp-1CCh]@5
char v14; // [sp+13Ch] [bp-9Ch]@5
char v15; // [sp+194h] [bp-44h]@5
int v16; // [sp+1A4h] [bp-34h]@5
int v17; // [sp+1A8h] [bp-30h]@5
int v18; // [sp+1ACh] [bp-2Ch]@5
int v19; // [sp+1B0h] [bp-28h]@5
int v20; // [sp+1B4h] [bp-24h]@5
int v21; // [sp+1B8h] [bp-20h]@5
int v22; // [sp+1BCh] [bp-1Ch]@5
int v23; // [sp+1C0h] [bp-18h]@5
void *Memory; // [sp+1C4h] [bp-14h]@5
int *v25; // [sp+1C8h] [bp-10h]@1
int v26; // [sp+1D4h] [bp-4h]@5

v2 = 0;
v25 = &v12;
if ( a1 )
{
if ( (*(_BYTE *)a2 + 4) & 0xF )
{
result = 0;
}
else
{
v4 = operator new();
Memory = (void *)v4;
v26 = 0;
md5_init(&v14);
md5_update(&v14, (const void *)a1, 8u);
md5_finish(&v14, (int)&v15);
aes_init(&v13, 0x10u, &v15);
v16 = 0;
v20 = 0;
v17 = 0;
v21 = 0;
v18 = 0;
v22 = 0;
LOBYTE(v26) = 1;
v5 = 12;
v19 = 0;
v23 = 0;
while ( *(_DWORD *)a2 != v5 )
{
v16 = *(_DWORD *)(v5 + a1);
v17 = *(_DWORD *)(v5 + a1 + 4);
v18 = *(_DWORD *)(v5 + a1 + 8);
v19 = *(_DWORD *)(v5 + a1 + 12);
aes_decrypt(&v13, (int)&v16, (int)&v20);
v6 = v21;
v7 = v2 + v4;
v5 += 16;
v2 += 16;
*(_DWORD *)v7 = v20;
v8 = v22;
*(_DWORD *)(v7 + 4) = v6;
v9 = v23;
*(_DWORD *)(v7 + 8) = v8;
*(_DWORD *)(v7 + 12) = v9;
}
memcpy((void *)(a1 + 12), (const void *)v4, v2);
v10 = *((_BYTE *)Memory + v2 - 1);
if ( v10 <= 0 || v10 > 16 )
{
v11 = 0;
LOBYTE(v26) = 0;
sub_214B2210(&v13);
}
else
{
LOBYTE(v26) = 0;
*(_DWORD *)a2 = v2 - v10 + 12;
v11 = 1;
sub_214B2210(&v13);
}
sub_21572560(Memory);
result = v11;
}
}
else
{
result = 0;
}
return result;
}

参考:

http://hi.baidu.com/vessial/item/75b3f03a18b5a1fe97f88d7c

原文地址:https://www.cnblogs.com/moonflow/p/2708627.html