宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取
upx加壳,可直接upx脱
调试定位注册事件
sub_421180
本地校验处:check_41F31C
网络请求处:net_check_4217D0 (暂不分析,patch )
check_41F31C:
int __usercall check_41F31C@(int a1@, long double timestamp@){ _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]);//根据[4041] WORD值对前40位进行变换 if ( memcmp(decryptodata, &gIdentification_code_590F54, 0x10u) || *(unsigned __int16 *)&decryptodata[32] != dword_577944// f || *(_DWORD *)&decryptodata[24] = *(_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校验,根据[4041]word 值进行变换前40位,进行关键字段检验
关键字段校验:
[0-16] bytes 机器码
[16-20] 未知
[20212223] 未知
[24252627] DWORD 第25-28位 激活日期 (距离1970年1月1日 天数) 要当前天数
[32、33]WORD 固定值 0x0066 ‘f’
[343536373839]未知
[4041]WORD 该值会将前40位进行变换,0时保持原值;
[42、43]WORD 最后2位为前42位数据的CRC16校验码
之后授权码保存到
C:UsersxxxAppDataRoamingCmsoftNetAssist.lic