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

相关