zoukankan      html  css  js  c++  java
  • NetAssist 网络调试助手 注册分析[1]

    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

  • 相关阅读:
    php防止用户输入进行跨站攻击的方式
    php中相关函数
    php运算符
    php中error_reporting
    php环境的安装
    LAMP环境介绍
    js的StringBuffer类
    一个带关闭按钮的Div窗口,很漂亮
    js  计算是今天多少周
    java 递归
  • 原文地址:https://www.cnblogs.com/DirWang/p/15706225.html
Copyright © 2011-2022 走看看