NetAssist 网络调试助手 注册分析[1]
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]);//根据[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