upx加殼,可直接upx脫
調試定位注冊事件
sub_421180

本地校驗處:check_41F31C
網絡請求處:net_check_4217D0 (暫不分析,patch )
check_41F31C:
int __usercall check_41F31C@<eax>(int a1@<eax>, long double timestamp@<st0>) { _DWORD *mycode; // eax int codelen; // ecx const void *v5; // edx _BYTE *v6; // eax __int16 v7; // ax unsigned __int64 v8; // rax char decryptodata[65]; // [esp+0h] [ebp-50h] BYREF mycode = (_DWORD *)(a1 + 0x90); if ( *mycode ) codelen = *(_DWORD *)(*mycode - 4); else codelen = 0; if ( codelen != 64 ) return 2; v5 = *(_DWORD *)(a1 + 144) ? *(const void **)(a1 + 144) : &unk_56A306; memcpy(decryptodata, v5, sizeof(decryptodata)); aes_key_484B80(&gIdentification_code_590F54, 0x10u); v6 = aes_4829B4((unsigned __int8 *)decryptodata, decryptodata); if ( aes_484C3C((int)decryptodata, (int)v6, (int)decryptodata) != 44 )// aes-ecb-128 decrypto 解密后數據長度為44 return 2; v7 = CRC16_484058(decryptodata, 42); if ( v7 != *(_WORD *)&decryptodata[42] ) return 2; sub_4832B0(decryptodata, 40, *(__int16 *)&decryptodata[40]);//根據[40\41] WORD值對前40位進行變換 if ( memcmp(decryptodata, &gIdentification_code_590F54, 0x10u) || *(unsigned __int16 *)&decryptodata[32] != dword_577944// f || *(_DWORD *)&decryptodata[24] <= 0x484Au ) { return 2; // 無效的授權碼 } v8 = sub_484F80(timestamp) / 0x15180; // 0x15180 十進制表示為 86400 秒,剛好為 1 天 // 距離1970年1月1日 天數 if ( (unsigned int)v8 < *(_DWORD *)&decryptodata[24] )// 非法授權碼 return 3; if ( (unsigned int)v8 >= *(_DWORD *)&decryptodata[28] )// 授權已過期 return 5; if ( (unsigned int)v8 < dword_5C1368 ) // 授權需重新激活 return 4; qmemcpy(&unk_590F65, decryptodata, 40u); dword_5C1318 = *(_DWORD *)&decryptodata[20]; dword_5C1368 = v8; // day time byte_56A0A4 = sub_41F258(); return 0; }
流程:
授權碼為64位base64編碼字符串,
終端識別碼(去掉‘-’)作為 AES-ECB-128 密鑰,對輸入的授權碼進行解密,
解密得到原始數據44位,crc16校驗,根據[40\41]word 值進行變換前40位,進行關鍵字段檢驗
關鍵字段校驗:
[0-16] bytes 機器碼
[16-20] 未知
[20\21\22\23] 未知
[24\25\26\27] DWORD 第25-28位 激活日期 (距離1970年1月1日 天數) 要<=當前天數
[28\29\30\31] DWORD 第29-32位 失效日期 (距離1970年1月1日 天數) 要>當前天數
[32、33]WORD 固定值 0x0066 ‘f’
[34\35\36\3738\39]未知
[40\41]WORD 該值會將前40位進行變換,0時保持原值;
[42、43]WORD 最后2位為前42位數據的CRC16校驗碼


之后授權碼保存到
C:\Users\xxx\AppData\Roaming\Cmsoft\NetAssist.lic
