usb network gate 11.0.2724 离线激活

usb network gate 11.0.2724 离线激活

离线激活流程

1、UsbConfig.exe

mfc 程序,注册触发点有多处,这里直接定位CActivatorCodeDialogE

CDialog::DoModal ==》sub_48E7C0

==》

u2ec.dll

LicenseActivate

unsigned int __stdcall LicenseActivate(VARIANTARG code, VARIANTARG OFFLINEANSWER, VARIANTARG *b64data)
{
  // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]

  var2wstr_10063140(&code_1, &code);
  var2wstr_10063140(&wstr_OFFLINEANSWER, &OFFLINEANSWER);
  v3 = x_CAtlStringMgr_10048430();
  if ( !v3 )
    sub_100482B0(0x80004005);

  Hi = ((*(*v3 + 0xC))(v3) + 0x10);
  code.cyVal.Hi = Hi;
  Hi_1 = sub_10070810(wstr_OFFLINEANSWER);
  OFFLINEANSWER.cyVal.Hi = Hi_1;
  if ( Hi_1 == 0xFFFFFFFF || (b64data_1 = b64data, Hi_1 == 1) && !b64data )
  {
    ret = 0;
  }
  else
  {
    // COMMAND ACTIVATE
    sub_100622F0(&map_, 0x18);                  // map insert
    if ( OFFLINEANSWER.cyVal.Hi == 2 )
    {
      sub_10062FB0(&map_, 3);
    }
    else
    {
      // ACT_KEY  88888-88888-88888-88888-88888
      sub_10063060(&map_, 0x2E, &code_1);       // map insert
      if ( OFFLINEANSWER.cyVal.Hi == 1 )
      {
        // ACT_ANSWER
        sub_10062FB0(&map_, 0x30);
        v7 = x_CAtlStringMgr_10048430();
        if ( !v7 )
          sub_100482B0(0x80004005);

        v8 = (*(*v7 + 0xC))(v7);
        b64data_2 = 0i64;
        pvarSrc_2 = (v8 + 0x10);
        pvarSrc_3 = (v8 + 0x10);
        VariantInit(&b64data_2);
        pExceptionObject = VariantChangeType(&b64data_2, b64data_1, 0, 8u);
        if ( pExceptionObject < 0 )
          sub_100482B0(pExceptionObject);

        w_b64data = b64data_2.bstrVal;
        if ( b64data_2.lVal
          && (v11 = WideCharToMultiByte(3u, 0, b64data_2.bstrVal, 0xFFFFFFFF, 0, 0, 0, 0),
              cbMultiByte = v11 - 1,
              v11 - 1 > 0) )
        {
          if ( ((ADJ(pvarSrc_2)->nDataLength - cbMultiByte) | (1 - ADJ(pvarSrc_2)->nAllocLength)) < 0 )
          {
            ATL::CSimpleStringT<char,0>::PrepareWrite2(&pvarSrc_3, v11 - 1);
            pvarSrc_2 = pvarSrc_3;
          }

          WideCharToMultiByte(3u, 0, w_b64data, 0xFFFFFFFF, pvarSrc_2, cbMultiByte, 0, 0);
          if ( cbMultiByte > ADJ(pvarSrc_2)->nDataLength )
            sub_100482B0(0x80070057);

          ADJ(pvarSrc_2)->nRefs = cbMultiByte;
          ADJ(pvarSrc_2)->data[cbMultiByte] = 0;
        }
        else
        {
          sub_6FC9D0(&pvarSrc_3);
          pvarSrc_2 = pvarSrc_3;
        }

        VariantClear(&b64data_2);
        sub_4A6A00(&cstr_data, &pvarSrc_3);
        v13 = ADJ(pvarSrc_2);
        if ( _InterlockedDecrement(&v13->nAllocLength) <= 0 )
          (*(*v13->pStringMgr + 4))(v13->pStringMgr, v13);

        // PARAM  b64_bindata
        sub_10063060(&map_, 2, &cstr_data);
        Hi = cstr_data;
      }
    }

    CByteArray_100487E0(&Info);
    if ( local_send_and_recv_1004C560(&map_, &Info, 0) )
    {
      std::map<int,int>::map<int,int>(&map_._Mysize);
      // ERR=+CORRUPTED
      str_100489E0 = get_str_100489E0(&Info);
      // cG9waw==
      // ERR=+CORRUPTED
      ERR__CORRUPTED = load_str_10047B30(&cstr_data, str_100489E0);// ERR=+CORRUPTED
      // '=' 分隔 作为key和value
      HIBYTE(pvarSrc_1) = !map_insert_1004A7F0(&map_._Mysize, ERR__CORRUPTED, 1);
      v17 = ADJ(cstr_data);
      if ( _InterlockedDecrement(&ADJ(cstr_data)->nAllocLength) <= 0 )
        (*(*v17->pStringMgr + 4))(v17->pStringMgr, v17);

      if ( HIBYTE(pvarSrc_1) )
      {
        ret = 0;
      }
      else
      {
        // this way
        value = get_value_10063DE0(&map_._Mysize, &pvarSrc_1);// [eax]:"+CORRUPTED"
        status = get_status_index_100707D0(*ADJ(value)->data);
        cstr_data = status;
        v20 = ADJ(pvarSrc_1);
        target__1 = _InterlockedDecrement(&ADJ(pvarSrc_1)->nAllocLength);
        if ( target__1 <= 0 )
        {
          (*(*v20->pStringMgr + 4))(v20->pStringMgr, v20);
          status = cstr_data;
        }

        if ( status )
        {
          if ( status == 1 )
          {
            ret = 0;
          }

          else if ( b64data_1 )
          {
            get_value_10063DE0(&map_._Mysize, &lpMultiByteStr);
            v33[0] = v23;
            load_str_10047B30(v33, off_10263180[0]);// "PARAM"
            if ( sub_10049C70(&map_._Mysize, ADJ(v33[0])->data) )
            {
              v33[0] = v24;
              load_str_10047B30(v33, id);
              target_ = target__2;
              load_str_10047B30(&target_, off_10263180[0]);// "PARAM"
              v33[0] = sub_1004A2C0(&map_._Mysize, &OFFLINEANSWER.pRecInfo, target_, ADJ(v33[0])->data);
              v26 = sub_10062C30(&cstr_data, &lpMultiByteStr, ",");
              v27 = sub_10062AC0(&pvarSrc_1, v26, ADJ(v33[0])->data);
              sub_4A6A00(&lpMultiByteStr, v27);
              sub_10047D90(&pvarSrc_1);
              sub_10047D90(&cstr_data);
              sub_10047D90(&OFFLINEANSWER.decVal.Lo64 + 4);
            }

            pvarg_.vt = 0;
            sub_10062760(&pvarg_, lpMultiByteStr);
            if ( VariantClear(b64data_1) >= 0 )
            {
              v33[0] = 0;
              *b64data_1 = pvarg_;
              ATL::AtlCrtErrorCheck(ADJ(v33[0])->data);
              pvarg_.vt = 0;
            }

            ret = 0;
            VariantClear(&pvarg_);
            sub_10047D90(&lpMultiByteStr);
          }
          else
          {
            ret = 0;
          }
        }
        else
        {
          if ( OFFLINEANSWER.cyVal.Hi == 2 && b64data_1 )
          {
            v33[0] = 0;
            target_ = target__1;
            load_str_10047B30(&target_, off_10263180[0]);// "PARAM"
            lVal = sub_10049F90(&map_._Mysize, target_, ADJ(v33[0])->data);
            pvarg__1.vt = 3;
            pvarg__1.lVal = lVal;
            if ( VariantClear(b64data_1) >= 0 )
            {
              v33[0] = 0;
              *b64data_1 = pvarg__1;
              ATL::AtlCrtErrorCheck(ADJ(v33[0])->data);
              pvarg__1.vt = 0;
            }

            VariantClear(&pvarg__1);
          }

          ret = 0xFFFFFFFF;
        }
      }

      sub_10048DA0(&map_._Mysize);
    }
    else
    {
      ret = 0;
    }

    sub_10048810(&Info);
    sub_10048DA0(&map_);
  }

  v28 = ADJ(Hi);
  if ( _InterlockedDecrement(v28 + 3) <= 0 )
    (*(**v28 + 4))(*v28, v28);

  v29 = wstr_OFFLINEANSWER + 0xFFFFFFF0;
  if ( _InterlockedDecrement(wstr_OFFLINEANSWER + 0xFFFFFFFF) <= 0 )
    (*(**v29 + 4))(*v29, v29);

  v30 = (code_1 - 0x10);
  if ( _InterlockedDecrement((code_1 - 4)) <= 0 )
    (*(**v30 + 4))(*v30, v30);

  return ret;
}

local_send_and_recv_1004C560

连接本地5475端口(UsbService64.exe 监听UDP 5475),进行发送和接受数据

char __cdecl local_send_and_recv_1004C560(_Tree_node_i_i *map, CByteArray *Info, char a3)
{
  LPSTR s; // edi
  int len; // kr00_4
  int v5; // eax
  char v6; // bl
  char *v7; // eax
  char *buf_1; // [esp+10h] [ebp-14h] BYREF
  char *buf; // [esp+14h] [ebp-10h] BYREF
  int v11; // [esp+20h] [ebp-4h]

  // ACT_ANSWER,ACT_KEY=88888-88888-88888-88888-88888,COMMAND=ACTIVATE,PARAM=xxxx
  map_dumps_10049930(map, &buf_1);              // ??map dumps
  v11 = 0;
  buf = buf_1;
  EnterCriticalSection(&CriticalSection);
  s = local_socks_10263054;
  LeaveCriticalSection(&CriticalSection);
  if ( s == LPSTR_TEXTCALLBACKW )
  {
    s = local_init_1004BCC0(localhost_10266120, 0x1563, 0x32);
    if ( s == LPSTR_TEXTCALLBACKW )
      goto LABEL_9;
  }

  EnterCriticalSection(&CriticalSection);
  len = strlen(buf);
  if ( send(s, buf, len, 0) != len || (v5 = recv(s, &buf, 1, 0), v5 == 0xFFFFFFFF) )
  {
LABEL_8:
    closesocket(s);
    local_socks_10263054 = 0xFFFFFFFF;
    LeaveCriticalSection(&CriticalSection);

LABEL_9:
    v6 = 0;
    goto LABEL_10;
  }

  while ( v5 && buf != 0xFF )
  {
    CByteArray_append_10048880(Info, buf);
    v5 = recv(s, &buf, 1, 0);
    if ( v5 == 0xFFFFFFFF )
      goto LABEL_8;
  }

  CByteArray_append_10048880(Info, 0);
  if ( a3 )
    v6 = sub_10059380(Info);
  else
    v6 = 1;

  local_socks_10263054 = s;
  LeaveCriticalSection(&CriticalSection);

LABEL_10:
  v11 = 0xFFFFFFFF;
  v7 = buf_1 + 0xFFFFFFF0;
  if ( _InterlockedDecrement(buf_1 + 0xFFFFFFFF) <= 0 )
    (*(**v7 + 4))(v7);

  return v6;
}

2、UsbService64.exe

CManager::ParseCommand

char __fastcall CManager::ParseCommand_140114CB4(__int64 a1, const char *a2, SOCKET s)
{
  // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]

  v33 = a1 + 0x120;
  StaticInitializeInternal::ConstructType<std::map<ScriptingClassPtr,ScriptingClassPtr>,0>(&map);
  cmd_key = (char *)cstring_get_s_1400C2C10(&map.KeyValue.value, (__int64)a2);
  map_init_key_1400DB390(&map, cmd_key, 1);
  data = ADJ(map.KeyValue.value)[0xFFFFFFFF].data;
  if ( _InterlockedExchangeAdd(&ADJ(map.KeyValue.value)->nAllocLength, 0xFFFFFFFF) <= 1 )
    (*(void (__fastcall **)(_QWORD))(**(_QWORD **)data + 8i64))(*(_QWORD *)data);

  v8 = 0;
  StaticInitializeInternal::ConstructType<std::map<ScriptingClassPtr,ScriptingClassPtr>,0>(&map._Right);
  v34 = v28;
  s_1400C2C10_1 = cstring_get_s_1400C2C10(v28, (__int64)&pass);
  s_1400C2C10_2 = (const unsigned __int8 **)cstring_get_s_1400C2C10(v29, (__int64)off_1403EB000[0]);// "COMMAND"
  map_get_1400DAC40((__int64 **)&map, &Str1, s_1400C2C10_2, s_1400C2C10_1);
  n0x1C = COMMAND_id_14012227C(Str1);
  if ( n0x1C > 0x13 )
  {
    if ( n0x1C > 0x1C )
    {
      switch ( n0x1C )
      {
        case 0x1D:
          v8 = sub_140115D58(a1, &map);
          break;

        case 0x1E:
          v12 = sub_1401162C8(a1, &map, &map._Right);
          goto LABEL_74;

        case 0x1F:
          v12 = sub_14011654C(a1, &map, &map._Right);
          goto LABEL_74;

        case 0x20:
          v12 = sub_140115B10(a1, &map);
          goto LABEL_74;

        case 0x21:
          v12 = sub_140116728(a1, &map);
          goto LABEL_74;

        case 0x22:
          v12 = sub_1401161B0(a1, &map);
          goto LABEL_74;

        case 0x23:
          v12 = sub_140116424(a1, &map);
          goto LABEL_74;
      }
    }
    else
    {
      switch ( n0x1C )
      {
        case 0x1C:
          v12 = sub_140115EB4(a1, &map, &map._Right);
          goto LABEL_74;

        case 0x15:
          v12 = GETLICINFO_140112B90(a1, &map, &map._Right);
          goto LABEL_74;

        case 0x16:
          v35 = xmmword_1403FAC18;
          v17 = (volatile signed __int32 *)_mm_srli_si128((__m128i)xmmword_1403FAC18, 8).m128i_u64[0];
          if ( v17 )
            _InterlockedExchangeAdd(v17 + 2, 1u);

          v8 = sub_1401013F4(v35);
          if ( v17 )
          {
            if ( _InterlockedExchangeAdd(v17 + 2, 0xFFFFFFFF) == 1 )
            {
              (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v17 + 8i64))(v17);
              if ( _InterlockedExchangeAdd(v17 + 3, 0xFFFFFFFF) == 1 )
                (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v17 + 0x10i64))(v17);
            }
          }

          break;

        case 0x17:
          v12 = sub_1401176F8(a1, &map, &map._Right);
          goto LABEL_74;

        case 0x18:
          // ACT_ANSWER
          v8 = parse_ACT_ANSWER_14010BF6C(a1, &map, &map._Right);
          sub_1401175B8(a1);
          break;

        case 0x19:
          v12 = sub_14010E8BC(a1, &map, &map._Right);
          goto LABEL_74;

        case 0x1A:
          v12 = sub_140116078(a1, &map, &map._Right);
          goto LABEL_74;

        case 0x1B:
          v12 = sub_140116114(a1, &map, &map._Right);
          goto LABEL_74;
      }
    }
  }
  else
  {
    if ( n0x1C == 0x13 )
    {
      v12 = sub_140115F50(a1, &map);
      goto LABEL_74;
    }

    if ( n0x1C > 0xB )
    {
      if ( n0x1C == 0xC )
      {
        CManager::GetListOfClient_14011303C(a1, &map, s);
        v15 = Str1 + 0xFFFFFFE8;
        if ( _InterlockedExchangeAdd((volatile signed __int32 *)Str1 + 0xFFFFFFFE, 0xFFFFFFFF) <= 1 )
          (*(void (__fastcall **)(_QWORD))(**(_QWORD **)v15 + 8i64))(*(_QWORD *)v15);
      }
      else
      {
        if ( n0x1C == 0xD )
        {
          v12 = sub_140112038(a1, &map, &map._Right);
          goto LABEL_74;
        }

        if ( n0x1C == 0xE )
        {
          sub_140113C64(a1, s);
          v14 = Str1 + 0xFFFFFFE8;
          if ( _InterlockedExchangeAdd((volatile signed __int32 *)Str1 + 0xFFFFFFFE, 0xFFFFFFFF) <= 1 )
            (*(void (__fastcall **)(_QWORD))(**(_QWORD **)v14 + 8i64))(*(_QWORD *)v14);
        }
        else
        {
          if ( n0x1C == 0xF )
          {
            v12 = sub_140117AB8(a1, &map, &map._Right);
            goto LABEL_74;
          }

          if ( n0x1C != 0x10 )
          {
            if ( n0x1C == 0x11 )
              v12 = sub_14010D720(a1, &map);
            else
              v12 = sub_1401153BC(a1, &map);

            goto LABEL_74;
          }

          CManager::GetRdpSharesList_140113454(a1, &map, s);
          v13 = Str1 + 0xFFFFFFE8;
          if ( _InterlockedExchangeAdd((volatile signed __int32 *)Str1 + 0xFFFFFFFE, 0xFFFFFFFF) <= 1 )
            (*(void (__fastcall **)(_QWORD))(**(_QWORD **)v13 + 8i64))(*(_QWORD *)v13);
        }
      }

      testing::ExpectationSet::~ExpectationSet((testing::ExpectationSet *)&map._Right);
      testing::ExpectationSet::~ExpectationSet((testing::ExpectationSet *)&map);
      return 1;
    }

    switch ( n0x1C )
    {
      case 0xB:
        v12 = sub_140112774(a1, &map, &map._Right);
        goto LABEL_74;

      case 0:
        v12 = sub_14010CC50(a1, &map, &map._Right);
        goto LABEL_74;

      case 1:
        v12 = sub_14010EAF0(a1, &map, &map._Right);
        goto LABEL_74;

      case 2:
        v12 = sub_140116980(a1, &map, &map._Right);
        goto LABEL_74;

      case 3:
        v12 = sub_140116E98(a1, &map, &map._Right);
        goto LABEL_74;

      case 4:
        v12 = sub_14010F668(a1, &map, &map._Right);
        goto LABEL_74;

      case 5:
        v12 = sub_14010F088(a1, &map, &map._Right);
        goto LABEL_74;

      case 7:
        v12 = sub_140113D04(a1, &map, &map._Right);

LABEL_74:
        v8 = v12;
        break;
    }
  }

  v18 = Str1 + 0xFFFFFFE8;
  if ( _InterlockedExchangeAdd((volatile signed __int32 *)Str1 + 0xFFFFFFFE, 0xFFFFFFFF) <= 1 )
    (*(void (__fastcall **)(_QWORD))(**(_QWORD **)v18 + 8i64))(*(_QWORD *)v18);

  s_1400C2C10_3 = (const unsigned __int8 **)cstring_get_s_1400C2C10(v30, (__int64)off_1403EB008[0]);// "ERR"
  if ( !MAP_FIND_1400DB000((__int64 *)&map._Right, s_1400C2C10_3) )
  {
    _ERR_ = off_1403EB198[0];                   // "ERR"
    if ( v8 )
      _ERR_ = ERR_;                             // "OK"

    s_1400C2C10_4 = cstring_get_s_1400C2C10(v31, (__int64)_ERR_);
    s_1400C2C10_5 = cstring_get_s_1400C2C10(v32, (__int64)off_1403EB008[0]);// "ERR"
    map_insert_1400DA2A0((__int64)&map._Right, s_1400C2C10_5, s_1400C2C10_4);
  }

  if ( s != 0xFFFFFFFFFFFFFFFFui64 )
  {
    sub_1400DB1B0((_QWORD **)&map._Right, &map.KeyValue.key);
    LOBYTE(v23) = 0xFF;
    sub_1400DC660(&map.KeyValue.key, v23);
    data_1 = ADJ(map.KeyValue.key)->data;
    pStringMgr_high = HIDWORD(ADJ(map.KeyValue.key)->pStringMgr);
    if ( ADJ(map.KeyValue.key)->nAllocLength > 1 )
    {
      sub_1400BD840(&map.KeyValue.key, pStringMgr_high);
      data_1 = ADJ(map.KeyValue.key)->data;
    }

    send(s, data_1, pStringMgr_high, 0);
    WSAGetLastError();
    data_2 = ADJ(map.KeyValue.key)[0xFFFFFFFF].data;
    if ( _InterlockedExchangeAdd(&ADJ(map.KeyValue.key)->nAllocLength, 0xFFFFFFFF) <= 1 )
      (*(void (__fastcall **)(_QWORD))(**(_QWORD **)data_2 + 8i64))(*(_QWORD *)data_2);
  }

  testing::ExpectationSet::~ExpectationSet((testing::ExpectationSet *)&map._Right);
  testing::ExpectationSet::~ExpectationSet((testing::ExpectationSet *)&map);
  return v8;
}

parse_ACT_ANSWER_14010BF6C

char __fastcall parse_ACT_ANSWER_14010BF6C(__int64 a1, _Tree_node_k_v *map, _Tree_node_k_v **p__Right)
{
  // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]

  v50[1] = a1;
  v5 = 0;
  CMD = cstring_get_s_1400C2C10(v53, (__int64)off_1403EB180);// "ACT_ANSWER"
  v48 = (const unsigned __int8 *)(CSTRING_1400D79C0((volatile signed __int32 *)(*CMD - 0x18i64)) + 6);
  v6 = MAP_FIND_1400DB000((__int64 *)map, &v48);
  v7 = (_QWORD *)(*CMD - 0x18i64);
  if ( _InterlockedDecrement((volatile signed __int32 *)(*CMD - 8i64)) <= 0 )
    (*(void (__fastcall **)(_QWORD))(*(_QWORD *)*v7 + 8i64))(*v7);

  v8 = 1;
  if ( v6 )
  {
    v5 = 1;

LABEL_5:
    s_1400C2C10 = cstring_get_s_1400C2C10(v57, (__int64)&pass);
    k = (const unsigned __int8 **)cstring_get_s_1400C2C10(v58, (__int64)off_1403EB170);// "ACT_KEY"
    map_get_1400DAC40((__int64 **)map, &keycode, k, s_1400C2C10);
    if ( v5 )
    {
      s_1400C2C10_3 = cstring_get_s_1400C2C10(v64, (__int64)&pass);
      s_1400C2C10_4 = (const unsigned __int8 **)cstring_get_s_1400C2C10(v65, (__int64)off_1403EB010[0]);// "PARAM"
      map_get_1400DAC40((__int64 **)map, &Str1_2, s_1400C2C10_4, s_1400C2C10_3);
      memset(&vec, 0, sizeof(vec));
      str.u._Ptr = 0i64;
      str._Mysize = 0i64;
      str._Myres = 0xFi64;
      string_140093700(&str, Str1_2);
      v32 = string2vector_1400EFD24(&str, &vec) == 0;
      if ( str._Myres >= 0x10 )
      {
        Ptr = str.u._Ptr;
        if ( str._Myres + 1 >= 0x1000 )
        {
          Ptr = (char *)*((_QWORD *)str.u._Ptr + 0xFFFFFFFF);
          if ( (unsigned __int64)(str.u._Ptr - Ptr - 8) > 0x1F )
            invalid_parameter_noinfo_noreturn();
        }

        j_j_free(Ptr);
      }

      if ( v32 )
      {
        v8 = 0;
      }
      else
      {
        v34 = x_CAtlStringMgr_ins_1400B3330();
        if ( !v34 )
          ATL::AtlThrowImpl(0x80004005);

        out_result_ = (*(__int64 (__fastcall **)(__int64 *))(*v34 + 0x18))(v34) + 0x18;
        *(_OWORD *)v72 = xmmword_1403FAC18;
        v35 = (volatile signed __int32 *)_mm_srli_si128((__m128i)xmmword_1403FAC18, 8).m128i_u64[0];
        if ( v35 )
          _InterlockedExchangeAdd(v35 + 2, 1u);

        activated_ok = ActivateOffline_14010112C(v72[0], (__int64)&keycode, &vec, (void **)&out_result_);
        if ( v35 )
        {
          if ( _InterlockedExchangeAdd(v35 + 2, 0xFFFFFFFF) == 1 )
          {
            (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v35 + 8i64))(v35);
            if ( _InterlockedExchangeAdd(v35 + 3, 0xFFFFFFFF) == 1 )
              (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v35 + 0x10i64))(v35);
          }
        }

        if ( activated_ok )
        {
          x_log_14010D498((__int64)L"Activated successfully");
          sub_140115998();
        }
        else
        {
          v51 = CSTRING_1400D79C0((volatile signed __int32 *)(out_result_ - 0x18)) + 6;
          s_1400C2C10_5 = cstring_get_s_1400C2C10(v66, (__int64)off_1403EB008[0]);// "ERR"
          map_insert_1400DA2A0((__int64)p__Right, s_1400C2C10_5, (__int64 *)&v51);
          v8 = 0;
        }

        v38 = (_QWORD *)(out_result_ - 0x18);
        if ( _InterlockedDecrement((volatile signed __int32 *)(out_result_ - 8)) <= 0 )
          (*(void (__fastcall **)(_QWORD))(*(_QWORD *)*v38 + 8i64))(*v38);
      }

      _Myfirst = vec._Myfirst;
      if ( vec._Myfirst )
      {
        if ( (char *)(vec._Myend - vec._Myfirst) >= (char *)0x1000 )
        {
          _Myfirst = (char *)*((_QWORD *)vec._Myfirst + 0xFFFFFFFF);
          if ( (unsigned __int64)(vec._Myfirst - _Myfirst - 8) > 0x1F )
            invalid_parameter_noinfo_noreturn();
        }

        j_j_free(_Myfirst);
        memset(&vec, 0, sizeof(vec));
      }

      Str1_1 = (unsigned __int8 *)Str1_2;
    }
    else
    {
      v11 = x_CAtlStringMgr_ins_1400B3330();
      if ( !v11 )
        ATL::AtlThrowImpl(0x80004005);

      Str1 = (unsigned __int8 *)((*(__int64 (__fastcall **)(__int64 *))(*v11 + 0x18))(v11) + 0x18);
      *(_OWORD *)v70 = xmmword_1403FAC18;
      v12 = (volatile signed __int32 *)_mm_srli_si128((__m128i)xmmword_1403FAC18, 8).m128i_u64[0];
      if ( v12 )
        _InterlockedExchangeAdd(v12 + 2, 1u);

      v13 = ActivateOnline_140100EE4(v70[0], (const char **)&keycode, &Str1);
      if ( v12 )
      {
        if ( _InterlockedExchangeAdd(v12 + 2, 0xFFFFFFFF) == 1 )
        {
          (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v12 + 8i64))(v12);
          if ( _InterlockedExchangeAdd(v12 + 3, 0xFFFFFFFF) == 1 )
            (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v12 + 0x10i64))(v12);
        }
      }

      if ( v13 )
      {
        x_log_14010D498((__int64)L"Activated successfully");
        sub_140115998();
      }
      else
      {
        if ( !Str2_0 )                          // "OFFLINE"
          ATL::AtlThrowImpl(0x80004005);

        if ( mbscmp(Str1, Str2_0) )             // "OFFLINE"
        {
          v50[0] = (__int64)(CSTRING_1400D79C0((volatile signed __int32 *)Str1 + 0xFFFFFFFA) + 6);
          s_1400C2C10_6 = cstring_get_s_1400C2C10(v63, (__int64)off_1403EB008[0]);// "ERR"
          map_insert_1400DA2A0((__int64)p__Right, s_1400C2C10_6, v50);
        }
        else
        {
          s_1400C2C10_7 = cstring_get_s_1400C2C10(v59, (__int64)Str2_0);// "OFFLINE"
          s_1400C2C10_8 = cstring_get_s_1400C2C10(v60, (__int64)off_1403EB008[0]);// "ERR"
          map_insert_1400DA2A0((__int64)p__Right, s_1400C2C10_8, s_1400C2C10_7);
          v67 = 0i64;
          v68 = 0i64;
          v71 = xmmword_1403FAC18;
          v21 = (volatile signed __int32 *)_mm_srli_si128((__m128i)xmmword_1403FAC18, 8).m128i_u64[0];
          if ( v21 )
            _InterlockedExchangeAdd(v21 + 2, 1u);

          v22 = sub_140101A00(v71, &keycode, (__int64)&v67);
          if ( v21 )
          {
            if ( _InterlockedExchangeAdd(v21 + 2, 0xFFFFFFFF) == 1 )
            {
              (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v21 + 8i64))(v21);
              if ( _InterlockedExchangeAdd(v21 + 3, 0xFFFFFFFF) == 1 )
                (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v21 + 0x10i64))(v21);
            }
          }

          if ( v22 )
          {
            std_string_.u._Ptr = 0i64;
            std_string_._Mysize = 0i64;
            std_string_._Myres = 0xFi64;
            if ( b64dec_1400EFDA0(&v67, (void **)&std_string_) )
            {
              _Ptr = &std_string_;
              if ( std_string_._Myres >= 0x10 )
                _Ptr = (std_string *)std_string_.u._Ptr;

              s_1400C2C10_9 = cstring_get_s_1400C2C10(v61, (__int64)_Ptr);
              s_1400C2C10_10 = cstring_get_s_1400C2C10(v62, (__int64)off_1403EB010[0]);// "PARAM"
              map_insert_1400DA2A0((__int64)p__Right, s_1400C2C10_10, s_1400C2C10_9);
            }

            if ( std_string_._Myres >= 0x10 )
            {
              _Ptr_1 = std_string_.u._Ptr;
              if ( std_string_._Myres + 1 >= 0x1000 )
              {
                _Ptr_1 = (char *)*((_QWORD *)std_string_.u._Ptr + 0xFFFFFFFF);
                if ( (unsigned __int64)(std_string_.u._Ptr - _Ptr_1 - 8) > 0x1F )
                  invalid_parameter_noinfo_noreturn();
              }

              j_j_free(_Ptr_1);
            }
          }

          v27 = (void *)v67;
          if ( (_QWORD)v67 )
          {
            if ( (unsigned __int64)(v68 - v67) >= 0x1000 )
            {
              v27 = *(void **)(v67 - 8);
              if ( (unsigned __int64)(v67 - (_QWORD)v27 - 8) > 0x1F )
                invalid_parameter_noinfo_noreturn();
            }

            j_j_free(v27);
          }
        }

        v8 = 0;
      }

      Str1_1 = Str1;
    }

    v40 = (volatile signed __int32 *)(Str1_1 + 0xFFFFFFE8);
    if ( _InterlockedDecrement(v40 + 4) <= 0 )
      (*(void (__fastcall **)(_QWORD))(**(_QWORD **)v40 + 8i64))(*(_QWORD *)v40);

    v41 = (_QWORD *)(keycode - 0x18);
    if ( _InterlockedDecrement((volatile signed __int32 *)(keycode - 8)) <= 0 )
      (*(void (__fastcall **)(_QWORD))(*(_QWORD *)*v41 + 8i64))(*v41);

    return v8;
  }

  s_1400C2C10_11 = cstring_get_s_1400C2C10(v55, (__int64)off_1403EB018[0]);// "TYPE"
  v49 = (const unsigned __int8 *)(CSTRING_1400D79C0((volatile signed __int32 *)(*s_1400C2C10_11 - 0x18i64)) + 6);
  v14 = MAP_FIND_1400DB000((__int64 *)map, &v49);
  v15 = (_QWORD *)(*s_1400C2C10_11 - 0x18i64);
  if ( _InterlockedDecrement((volatile signed __int32 *)(*s_1400C2C10_11 - 8i64)) <= 0 )
    (*(void (__fastcall **)(_QWORD))(*(_QWORD *)*v15 + 8i64))(*v15);

  if ( !v14 )
    goto LABEL_5;

  v69 = xmmword_1403FAC18;
  v16 = (volatile signed __int32 *)_mm_srli_si128((__m128i)xmmword_1403FAC18, 8).m128i_u64[0];
  v8 = 1;
  if ( v16 )
    _InterlockedExchangeAdd(v16 + 2, 1u);

  s_1400C2C10_12 = cstring_get_s_1400C2C10(v56, (__int64)off_1403EB010[0]);// "PARAM"
  app_type = __scrt_winmain_policy::get_app_type();
  sub_1400DA450((__int64 **)p__Right, s_1400C2C10_12, app_type);
  if ( !v16 )
    return v8;

  if ( _InterlockedExchangeAdd(v16 + 2, 0xFFFFFFFF) != 1 )
    return v8;

  (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v16 + 8i64))(v16);
  if ( _InterlockedExchangeAdd(v16 + 3, 0xFFFFFFFF) == 1 )
    (*(void (__fastcall **)(volatile signed __int32 *))(*(_QWORD *)v16 + 0x10i64))(v16);

  return v8;
}

ActivateOffline_14010112C

char __fastcall ActivateOffline_14010112C(__int64 a1, __int64 keycode, std_vector_byte *bindata, void **out_result)
{
  // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]

  Myfirst = bindata->_Myfirst;
  str.u._Ptr = 0i64;
  str._Mysize = 0i64;
  str._Myres = 0xFi64;
  string_140100000(&str, Myfirst, bindata->_Mylast);
  electronic::activator::CActivator::ActivateOffline_1400A2D70(*(CActivator **)(a1 + 0x10), &result, &str);
  Size_1 = strlen(p_0_1403FB6F0.u._Ptr);
  Buf1_1 = &result;
  if ( result._Myres >= 0x10 )
    Buf1_1 = (std_string *)result.u._Ptr;

  if ( result._Mysize == Size_1 && !memcmp(Buf1_1, p_0_1403FB6F0.u._Ptr, result._Mysize) )
    goto LABEL_9;

  Size_2 = strlen(p_ALREADY_ACTIVATED_1403FB588);
  Buf1_2 = &result;
  if ( result._Myres >= 0x10 )
    Buf1_2 = (std_string *)result.u._Ptr;

  if ( result._Mysize == Size_2 && !memcmp(Buf1_2, p_ALREADY_ACTIVATED_1403FB588, result._Mysize) )
  {
LABEL_9:
    _ERR_ = ERR_;                               // "OK"
    if ( ERR_ )                                 // "OK"
      _OK_ = strlen(ERR_);                      // "OK"
    else
      _OK_ = 0;

    v13 = 1;

LABEL_20:
    cstring_1400C2DE0((char *__shifted(CStringData,0x18) *)out_result, _ERR_, _OK_);
    goto LABEL_27;
  }

  Size_3 = strlen(p_DEMO_IS_OVER_1403FB678);
  Buf1_3 = &result;
  Buf1_5 = result.u._Ptr;
  n0x10_1 = result._Myres;
  if ( result._Myres >= 0x10 )
    Buf1_3 = (std_string *)result.u._Ptr;

  if ( result._Mysize == Size_3 )
  {
    _OK_ = memcmp(Buf1_3, p_DEMO_IS_OVER_1403FB678, result._Mysize);
    if ( !_OK_ )
    {
      _ERR_ = ERR__0;                           // "DEMO_IS_OVER"
      if ( ERR__0 )                             // "DEMO_IS_OVER"
        _OK_ = strlen(ERR__0);                  // "DEMO_IS_OVER"

      v13 = 0;
      goto LABEL_20;
    }

    n0x10_1 = result._Myres;
    Buf1_5 = result.u._Ptr;
  }

  Buf1_4 = &result;
  if ( n0x10_1 < 0x10 || (Buf1_4 = (std_string *)Buf1_5) != 0i64 )
    Size_4 = strlen(Buf1_4->u._Buf);
  else
    Size_4 = 0;

  cstring_1400C2DE0((char *__shifted(CStringData,0x18) *)out_result, Buf1_4, Size_4);
  v13 = 0;

LABEL_27:
  if ( result._Myres >= 0x10 )
  {
    Ptr = result.u._Ptr;
    if ( result._Myres + 1 >= 0x1000 )
    {
      Ptr = (char *)*((_QWORD *)result.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(result.u._Ptr - Ptr - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(Ptr);
  }

  result._Mysize = 0i64;
  result._Myres = 0xFi64;
  result.u._Buf[0] = 0;
  if ( str._Myres < 0x10 )
    return v13;

  _Ptr = str.u._Ptr;
  if ( str._Myres + 1 >= 0x1000 )
  {
    _Ptr = (char *)*((_QWORD *)str.u._Ptr + 0xFFFFFFFF);
    if ( (unsigned __int64)(str.u._Ptr - _Ptr - 8) > 0x1F )
      invalid_parameter_noinfo_noreturn();
  }

  j_j_free(_Ptr);
  return v13;
}

3、electronic::activator::CActivator::ActivateOffline_1400A2D70

rsa_DEC_1400B8F70使用内置rsa公钥进行解密

    Ptr.u._Ptr = 0i64;
    Ptr._Mysize = 0i64;
    Ptr._Myres = 0xFi64;
    _Ptr_15 = (char *)operator new(0x30ui64);
    s__5.u._Ptr = _Ptr_15;
    *(_OWORD *)_Ptr_15 = 0i64;
    *((_DWORD *)_Ptr_15 + 2) = 1;
    *((_DWORD *)_Ptr_15 + 3) = 1;
    *(_QWORD *)_Ptr_15 = &std::_Ref_count_obj2<electronic::activator::innerparts::CActivatorDecoder>::`vftable';
    string_1400B21A0((std_string *)(_Ptr_15 + 0x10), (const char **)&p_pubkey_140401230);
    s__5.u._Ptr = _Ptr_15 + 0x10;
    *((_QWORD *)&s__5.u._Ptr + 1) = _Ptr_15;
    lpBuffer_2 = lpBuffer_1;
    if ( lpBuffer_1->_Myres >= 0x10 )
      lpBuffer_2 = (std_string *)lpBuffer_1->u._Ptr;   

// rsa dec
    rsa_DEC_1400B8F70((std_string *)(_Ptr_15 + 0x10), &out_, (__int64)lpBuffer_2, lpBuffer_1->_Mysize);
    if ( Ptr._Myres >= 0x10 )
    {
      _Ptr_12 = Ptr.u._Ptr;
      if ( Ptr._Myres + 1 >= 0x1000 )
      {
        _Ptr_12 = (char *)*((_QWORD *)Ptr.u._Ptr + 0xFFFFFFFF);
        if ( (unsigned __int64)(Ptr.u._Ptr - _Ptr_12 - 8) > 0x1F )
          invalid_parameter_noinfo_noreturn();
      }

      j_j_free(_Ptr_12);
    }


rsa2048公钥

首先使用内存解密出来的p_pubkey_140401230(指向std_string pub_key_140401210的c_str,)、

解密失败后使用硬编码的公钥

int sub_140071ED0()
{
  // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]

  if ( byte_1403F20B6 )
  {
    n0xE = 0;
    v1 = &unk_1403F20A8;
    do
      *v1++ ^= 0xE - (_BYTE)n0xE++;
    while ( n0xE < 0xE );

    byte_1403F20B6 = 0;
  }

  v18[0] = operator new(0xEui64);
  v19 = (__int64)v18[0] + 0xE;
  memmove(v18[0], &unk_1403F20A8, 0xEui64);
  v18[1] = (char *)v18[0] + 0xE;
  if ( byte_1403F21A1 )
  {
    n0xE1 = 0;
    v3 = &unk_1403F20C0;
    do
      *v3++ ^= 0xE2 - (_BYTE)n0xE1++;
    while ( n0xE1 < 0xE1 );

    byte_1403F21A1 = 0;
  }

  *(_QWORD *)&v16 = operator new(0xE1ui64);
  v17 = v16 + 0xE1;
  memmove((void *)v16, &unk_1403F20C0, 0xE1ui64);
  *((_QWORD *)&v16 + 1) = v16 + 0xE1;
  if ( byte_1403F2291 )
  {
    n0xE1_1 = 0;
    v5 = &byte_1403F21B0;
    do
      *v5++ ^= 0xC - n0xE1_1++;
    while ( n0xE1_1 < 0xE1 );

    byte_1403F2291 = 0;
  }

  *(_QWORD *)&v14 = operator new(0xE1ui64);
  v15 = v14 + 0xE1;
  memmove((void *)v14, &byte_1403F21B0, 0xE1ui64);
  *((_QWORD *)&v14 + 1) = v14 + 0xE1;
  v6 = sub_1400AFC30((std::vector<char> *)&v22, (__int64)&v14, &v16);
  v7 = sub_1400AFC30((std::vector<char> *)&v20, (__int64)v6, v18);
  // -----BEGIN PUBLIC KEY-----
  // MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwknN5/81qIoM+k1WEc/5
  // A+u3YzWeDNE5i5rpayiNWv4TvxX9udMz3uKF4tmDJfjuSCVUHQWAjJefwSv4ZBQ7
  // egXHtGzh/HVY/Geei7A1TwOroHxxgUKVkXRoPGYIVNBhrqX0CsCgYCZv7Ij6CSy4
  // Iamw0Gb/BnZ4Uw1AkOs6DfbGaVspeQGg7oTjSj+TKOWdK1dJ7ZoGyoVQLqxpaq41
  // r893XqSK5mXlbE3pFSjS6Rn8unyt57EuIcFy+x2VqjOf3KiwiGCeIaQtAtF5Pqii
  // KoEMoGgcDedO4C6h/LKy1oXJR7QeHQijUAn7JXE/i0I57BXyKylR6/YIV6hV+Ovm
  // bQIDAQAB
  // -----END PUBLIC KEY-----
  aes_cbc_dec_1400B4290((std::string *)&pub_key_140401210, (__int64)v7);
  v8 = v20;
  if ( v20 )
  {
    if ( *((_QWORD *)&v21 + 1) - (_QWORD)v20 >= 0x1000ui64 )
    {
      v8 = (_BYTE *)*((_QWORD *)v20 + 0xFFFFFFFF);
      if ( (unsigned __int64)(v20 - v8 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(v8);
    v20 = 0i64;
    v21 = 0i64;
  }

  v9 = v22;
  if ( v22 )
  {
    if ( *((_QWORD *)&v23 + 1) - (_QWORD)v22 >= 0x1000ui64 )
    {
      v9 = (_BYTE *)*((_QWORD *)v22 + 0xFFFFFFFF);
      if ( (unsigned __int64)(v22 - v9 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(v9);
    v22 = 0i64;
    v23 = 0i64;
  }

  v10 = (void *)v14;
  if ( (_QWORD)v14 )
  {
    if ( (unsigned __int64)(v15 - v14) >= 0x1000 )
    {
      v10 = *(void **)(v14 - 8);
      if ( (unsigned __int64)(v14 - (_QWORD)v10 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(v10);
    v14 = 0i64;
    v15 = 0i64;
  }

  v11 = (void *)v16;
  if ( (_QWORD)v16 )
  {
    if ( (unsigned __int64)(v17 - v16) >= 0x1000 )
    {
      v11 = *(void **)(v16 - 8);
      if ( (unsigned __int64)(v16 - (_QWORD)v11 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(v11);
    v16 = 0i64;
    v17 = 0i64;
  }

  v12 = v18[0];
  if ( !v18[0] )
    return atexit(sub_1402E8610);

  if ( v19 - (unsigned __int64)v18[0] >= 0x1000 )
  {
    v12 = (void *)*((_QWORD *)v18[0] + 0xFFFFFFFF);
    if ( (unsigned __int64)(v18[0] - v12 - 8) > 0x1F )
      invalid_parameter_noinfo_noreturn();
  }

  j_j_free(v12);
  return atexit(sub_1402E8610);
}

rsa_DEC_1400B8F70

std_string *__fastcall rsa_DEC_1400B8F70(std_string *pubkey, std_string *out, __int64 indata, unsigned __int64 _Count)
{
  unsigned __int64 index; // rbx
  std_string *buf; // rax
  bio_st *pub_key; // rax
  bio_st *pub_key_1; // r15
  char *Ptr; // r14
  int v12; // eax
  char pExceptionObject[48]; // [rsp+38h] [rbp-30h] BYREF
  __int64 rsa; // [rsp+70h] [rbp+8h] BYREF
  std_string *Ptr_2; // [rsp+78h] [rbp+10h]

  Ptr_2 = out;
  index = 0i64;
  rsa = 0i64;
  buf = pubkey;
  if ( pubkey->_Myres >= 0x10 )
    buf = (std_string *)pubkey->u._Ptr;

  pub_key = (bio_st *)BIO_new_mem_buf(buf, LODWORD(pubkey->_Mysize));
  pub_key_1 = pub_key;
  if ( !pub_key )
  {
    error_1400B5D80(pExceptionObject, p_DECODE_MEMORY_ERROR_140402278);
    CxxThrowException(pExceptionObject, (_ThrowInfo *)&_TI1_AVActivatorException_innerparts_activator_electronic__);
  }

  if ( !pem_read_bio_RSA_PUBKEY_1401A21E0(pub_key, (void **)&rsa, 0i64, 0i64) )
  {
    error_1400B5D80(pExceptionObject, p_DECODE_PUBKEY_ERROR_1404022A0);
    CxxThrowException(pExceptionObject, (_ThrowInfo *)&_TI1_AVActivatorException_innerparts_activator_electronic__);
  }

  out->u._Ptr = 0i64;
  out->_Mysize = 0i64;
  out->_Myres = 0xFi64;
  out->u._Buf[0] = 0;
  std::string::assign((std::string *)out, _Count, 0);
  Ptr = (char *)out;
  if ( out->_Myres >= 0x10 )
    Ptr = out->u._Ptr;

  if ( (_BYTE)_Count )
  {
    error_1400B5D80(pExceptionObject, P_DECODE_SIZE_ERROR_1404022C8);
    CxxThrowException(pExceptionObject, (_ThrowInfo *)&_TI1_AVActivatorException_innerparts_activator_electronic__);
  }

  for ( ; _Count; _Count -= 0x100i64 )
  {
    v12 = RSA_public_decrypt_1401A8810(0x100i64, indata, &Ptr[index], rsa);
    if ( (unsigned int)(v12 + 1) <= 1 )
    {//解密失败时触发异常
      error_1400B5D80(pExceptionObject, p_DECODE_DECRYPT_ERROR_140402250);
      CxxThrowException(pExceptionObject, (_ThrowInfo *)&_TI1_AVActivatorException_innerparts_activator_electronic__);
    }

    index += v12;
    indata += 0x100i64;
  }

  std::string::resize((std::string *)out, index, 0);
  RSA_free(rsa);
  BIO_free_0(pub_key_1);
  return out;
}

parse_and_validate_data_1400B5DA0验证解析数据

解析lic数据是否使用‘&’ 连接 ‘k=v’形式的字符串

    std::string::assign((std::string *)&s__4, ": parse & validate data from server", 0x23ui64);
    Activator_log_1400ACC30(Activator, "electronic::activator::CActivator::ActivateOffline", &s__4);
    if ( s__4._Myres >= 0x10 )
    {
      _Ptr_16 = s__4.u._Ptr;
      if ( s__4._Myres + 1 >= 0x1000 )
      {
        _Ptr_16 = (char *)*((_QWORD *)s__4.u._Ptr + 0xFFFFFFFF);
        if ( (unsigned __int64)(s__4.u._Ptr - _Ptr_16 - 8) > 0x1F )
          invalid_parameter_noinfo_noreturn();
      }

      j_j_free(_Ptr_16);
    }

    parse_and_validate_data_1400B5DA0((__int64)&share_ptr, &Ptr);
    if ( !(_QWORD)share_ptr )
    {
      s_.u._Ptr = 0i64;
      s_._Mysize = 0i64;
      s_._Myres = 0xFi64;
      std::string::assign((std::string *)&s_, ": can't parse data from server", 0x1Eui64);
      Activator_log_1400ACDE0((__int64)Activator, "electronic::activator::CActivator::ActivateOffline", &s_);
      if ( s_._Myres < 0x10 )
      {
__int128* parse_and_validate_data(__int64 map, std_string* input) {
    init_map(map);
    size_t offset = 0;
    string accum; // 累积非哈希键的值

    while (true) {
        // 提取下一个 '&' 分隔的子串
        substr = extract_substring(input, offset, '&');
        if (!substr) break;

        // 分割键值对
        key, value = split(substr, '=');

        if (key == GLOBAL_HASH) {
            // 保存哈希值到局部变量
            saved_hash = value;
        } else {
            // 更新累积值: value + accum
            accum = value + accum;
            // 插入键值对 (key, accum) 到 map
            map_insert(map, key, accum);
        }
    }

    set_completion_flag(map);
    free_resources();
    return map;
}

electronic::activator::CActivator::ValidateActData_1400A9480

校验相关字段

    electronic::activator::CActivator::ValidateActData_1400A9480(
      (__int64)Activator,
      &Buf1a,
      (std_map_s_s *)&Activator_1,
      2i64);
    s_.u._Ptr = 0i64;
    s_._Mysize = 0i64;
    s_._Myres = 0xFi64;
    std::string::assign((std::string *)&s_, ": ValidateActData result: ", 0x1Aui64);
    ss_1400ACF90((__int64)Activator, "electronic::activator::CActivator::ActivateOffline", &s_, &Buf1a);

errorCode

 find_errorCode_1400B6FF0(map_1->_Myhead, &Buf1);
if ( Buf1._Mysize != Size_12 || memcmp(Buf1_1, p_s_0_140401BB0, Buf1._Mysize) )
  {
    // 下面处理errorCode
    Size_11 = 0xFFFFFFFFFFFFFFFFui64;
    do
      ++Size_11;
    while ( *((_BYTE *)p_ALREADY_ACTIVATED_140401A68 + Size_11) );

    Buf1_2 = &Buf1;
    if ( n0xF_1 >= 0x10 )
      Buf1_2 = (std_string *)Buf1_3;

    if ( Size_1 != Size_11 || memcmp(Buf1_2, p_ALREADY_ACTIVATED_140401A68, Size_1) )
    {
      Size_10 = 0xFFFFFFFFFFFFFFFFui64;
      do
        ++Size_10;
      while ( *((_BYTE *)p_DEMO_IS_OVER_140401B38 + Size_10) );

      Buf1_4 = &Buf1;
      if ( n0xF_1 >= 0x10 )
        Buf1_4 = (std_string *)Buf1_3;

      if ( Size_1 != Size_10 || memcmp(Buf1_4, p_DEMO_IS_OVER_140401B38, Size_1) )
      {
        Size_9 = 0xFFFFFFFFFFFFFFFFui64;
        do
          ++Size_9;
        while ( *((_BYTE *)p_NO_AVAILABLE_ACTIVATIONS_140401B88 + Size_9) );

        Buf1_5 = &Buf1;
        if ( n0xF_1 >= 0x10 )
          Buf1_5 = (std_string *)Buf1_3;

        if ( Size_1 != Size_9 || memcmp(Buf1_5, p_NO_AVAILABLE_ACTIVATIONS_140401B88, Size_1) )
        {
          Size_8 = 0xFFFFFFFFFFFFFFFFui64;
          do
            ++Size_8;
          while ( *((_BYTE *)p_KEY_BANNED_140401B60 + Size_8) );

          Buf1_6 = &Buf1;
          if ( n0xF_1 >= 0x10 )
            Buf1_6 = (std_string *)Buf1_3;

          if ( Size_1 != Size_8 || memcmp(Buf1_6, p_KEY_BANNED_140401B60, Size_1) )
          {
            Size_7 = 0xFFFFFFFFFFFFFFFFui64;
            do
              ++Size_7;
            while ( *((_BYTE *)p_add_REACTIVATE_1404013E0 + Size_7) );

            Buf1_7 = &Buf1;
            if ( n0xF_1 >= 0x10 )
              Buf1_7 = (std_string *)Buf1_3;

            if ( Size_1 != Size_7 || memcmp(Buf1_7, p_add_REACTIVATE_1404013E0, Size_1) )
            {
              Size_6 = 0xFFFFFFFFFFFFFFFFui64;
              do
                ++Size_6;
              while ( *((_BYTE *)p_add_STARTING_140401408 + Size_6) );

              Buf1_8 = &Buf1;
              if ( n0xF_1 >= 0x10 )
                Buf1_8 = (std_string *)Buf1_3;

              if ( Size_1 != Size_6 || memcmp(Buf1_8, p_add_STARTING_140401408, Size_1) || n2_1 != 3 )
              {
                :_bad_errorCode:_ = (char *)operator new(0x20ui64);
                :_bad_errorCode:__1 = :_bad_errorCode:_;
                s._Mysize = 0x11i64;
                s._Myres = 0x1Fi64;
                strcpy(:_bad_errorCode:_, ": bad errorCode: ");
  // product_id
  Buf1_19 = find_product_id_1400B6BA0((__int64 **)map_1->_Myhead, &s_);

// product_version
  product_id = find_product_version_1400B6D10((__int64 **)map_1->_Myhead, &s);


 // licenseName
  if ( find_licenseName_1400B6E80((__int64 **)map->_Myhead, &s_)->_Mysize )
  {
    v55 |= 0x10u;
    // license_key_code
    if ( *(_QWORD *)(find_license_key_code_1400B7160((__int64 **)map->_Myhead, (__int64)&s) + 0x10) )
      v56 = 0;
  }


 map_1 = map;
    // key type
    key_type = find_keyname_defaultvalue_1400B7440(
                 (__int64 **)map->_Myhead,
                 (const char *)p_key_type_140402520,
                 0xFFFFFFFF);
    key_type_1 = key_type;
    if ( key_type > 3 )
    {
      s.u._Ptr = 0i64;
      s._Mysize = 0i64;
      s._Myres = 0xFi64;
      std::string::assign((std::string *)&s, ": wrong key type: ", 0x12ui64);
        
        
   // hid
    find_hid_1400B72D0((__int64 **)map->_Myhead, &Buf2a);
        
        
    // key_options
      key_options = find_keyname_defaultvalue_1400B7440(
                      (__int64 **)map->_Myhead,
                      (const char *)p_key_options_1404024F8,
                      0);
      // license_options
      license_options = find_keyname_defaultvalue_1400B7440(
                          (__int64 **)map->_Myhead,
                          (const char *)p_license_options_140402548,
                          0);
    map_1 = map;
      // serverDate   %4d-%2d-%2d
      if ( get_date_str_1400B7970((__int64 **)map->_Myhead, (const char *)p_serverDate_140401A18) > 0 )      
        
           // firstActivation
        firstActivation = get_date_str_1400B7970((__int64 **)map->_Myhead, (const char *)p_firstActivation_1404017B0);
        // nextActivation
        nextActivation = get_date_str_1400B7970((__int64 **)map->_Myhead, (const char *)p_nextActivation_140401958);
        // activationDate
        activationDate = get_date_str_1400B7970((__int64 **)map->_Myhead, (const char *)p_activationDate_1404017F8);
        if ( firstActivation > 0 && activationDate > 0 && nextActivation >= 0 )

serverTime验证本地时间

serverTime 时间戳要小于本地时间

electronic::activator::CActivator::ActivateOffline_1400A2D70

    // serverTime
    serverTime_1400B7620 = find_serverTime_1400B7620((__int64 **)share_ptr);
    if ( serverTime_1400B7620 >= serverTime_1400B7620_2 )
    {
      if ( serverTime_1400B7620 > serverTime_1400B7620_1 )
      {
        s__2.u._Ptr = 0i64;
        s__2._Mysize = 0i64;
        s__2._Myres = 0xFi64;
        std::string::assign((std::string *)&s__2, ": answer from future, probably local time is wrong?", 0x33ui64);
        Activator_log_1400ACDE0((__int64)Activator, "electronic::activator::CActivator::ActivateOffline", &s__2);
        if ( s__2._Myres >= 0x10 )
        {
          _Ptr_6 = s__2.u._Ptr;
          if ( s__2._Myres + 1 >= 0x1000 )
          {
            _Ptr_6 = (char *)*((_QWORD *)s__2.u._Ptr + 0xFFFFFFFF);
            if ( (unsigned __int64)(s__2.u._Ptr - _Ptr_6 - 8) > 0x1F )
              goto LABEL_137;
          }

          j_j_free(_Ptr_6);
        }

        HIDWORD(Activator->field_60) = 2;
      }

(其他)electronic::activator::CActivator::CreateInitialData_1400AAAE0

CActivator::ReadActFile 会调用

__int128 *__fastcall electronic::activator::CActivator::CreateInitialData_1400AAAE0(__int64 a1, __int128 *ptr)
{
  // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]

  k_ttemp._Myres = 0xFi64;
  k_ttemp._Mysize = 7i64;
  qmemcpy(&k_ttemp, ": begi", 6);
  HIWORD(k_ttemp.u._Ptr) = (unsigned __int8)aBegin_1[6];
  ss_1400ACC30(a1, "electronic::activator::CActivator::CreateInitialData", &k_ttemp);
  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_27 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_27 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_27 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_27);
  }

  CActivatorData_1400B9EF0((__int64)ptr);
  _Val = (*(__int64 (__fastcall **)(_QWORD))(**(_QWORD **)(*(_QWORD *)(a1 + 0x70) + 0xB8i64) + 8i64))(*(_QWORD *)(*(_QWORD *)(a1 + 0x70) + 0xB8i64));
  // 2001-04-01
  xx_date_1400BA4A0(&_Ptr__1);
  _Ptr_.u._Ptr = 0i64;
  _Ptr_._Mysize = 0i64;
  _Ptr_._Myres = 0xFi64;
  _Count_15 = 0xFFFFFFFFFFFFFFFFui64;
  _Count = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count;
  while ( *((_BYTE *)p_add_STARTING_140401408 + _Count) );

  std::string::assign((std::string *)&_Ptr_, (const char *const)p_add_STARTING_140401408, _Count);
  v_temp.u._Ptr = 0i64;
  v_temp._Mysize = 0i64;
  v_temp._Myres = 0xFi64;
  _Count_1 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_1;
  while ( *(_BYTE *)(p_errorCode_140401820 + _Count_1) );

  // errorCode
  std::string::assign((std::string *)&v_temp, (const char *const)p_errorCode_140401820, _Count_1);
  map_set_1400B6720(*(CActivatorData **)ptr, &v_temp, &_Ptr_);
  if ( v_temp._Myres >= 0x10 )
  {
    _Ptr = v_temp.u._Ptr;
    if ( v_temp._Myres + 1 >= 0x1000 )
    {
      _Ptr = (char *)*((_QWORD *)v_temp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(v_temp.u._Ptr - _Ptr - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr);
  }

  v_temp._Mysize = 0i64;
  v_temp._Myres = 0xFi64;
  v_temp.u._Buf[0] = 0;
  key_name.u._Ptr = 0i64;
  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  _Count_2 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_2;
  while ( *(_BYTE *)(p_key_type_1404018B8 + _Count_2) );

  // key_type
  std::string::assign((std::string *)&key_name, (const char *const)p_key_type_1404018B8, _Count_2);
  v11 = (std_string *)((char *)&v_temp._Mysize + 5);
  n2 = 2;
  do
  {
    v11 = (std_string *)((char *)v11 + 0xFFFFFFFF);
    v11->u._Buf[0] = n2 % 0xA + 0x30;
    n2 /= 0xAu;
  }
  while ( n2 );

  k_ttemp.u._Ptr = 0i64;
  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  if ( v11 != (std_string *)((char *)&v_temp._Mysize + 5) )
    std::string::assign((std::string *)&k_ttemp, v11->u._Buf, (char *)&v_temp._Mysize + 5 - (char *)v11);

  map_set_1400B6720(*(CActivatorData **)ptr, &key_name, &k_ttemp);
  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_1 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_1 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_1 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_1);
  }

  if ( key_name._Myres >= 0x10 )
  {
    _Ptr_2 = key_name.u._Ptr;
    if ( key_name._Myres + 1 >= 0x1000 )
    {
      _Ptr_2 = (char *)*((_QWORD *)key_name.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(key_name.u._Ptr - _Ptr_2 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_2);
  }

  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  key_name.u._Buf[0] = 0;
  k_ttemp.u._Ptr = 0i64;
  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  _Count_3 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_3;
  while ( p_key_options_140401890[_Count_3] );

  // key_options
  std::string::assign((std::string *)&k_ttemp, p_key_options_140401890, _Count_3);
  v16 = (std_string *)((char *)&v_temp._Mysize + 5);
  v17 = 0;
  do
  {
    v16 = (std_string *)((char *)v16 + 0xFFFFFFFF);
    v16->u._Buf[0] = v17 % 0xA + 0x30;
    v17 /= 0xAu;
  }
  while ( v17 );

  key_name.u._Ptr = 0i64;
  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  if ( v16 != (std_string *)((char *)&v_temp._Mysize + 5) )
    std::string::assign((std::string *)&key_name, v16->u._Buf, (char *)&v_temp._Mysize + 5 - (char *)v16);

  map_set_1400B6720(*(CActivatorData **)ptr, &k_ttemp, &key_name);
  if ( key_name._Myres >= 0x10 )
  {
    _Ptr_3 = key_name.u._Ptr;
    if ( key_name._Myres + 1 >= 0x1000 )
    {
      _Ptr_3 = (char *)*((_QWORD *)key_name.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(key_name.u._Ptr - _Ptr_3 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_3);
  }

  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_4 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_4 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_4 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_4);
  }

  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  k_ttemp.u._Buf[0] = 0;
  v_temp.u._Ptr = (char *)0x31;
  v_temp._Myres = 0xFi64;
  v_temp._Mysize = 1i64;
  key_name.u._Ptr = 0i64;
  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  _Count_4 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_4;
  while ( *(_BYTE *)(p_license_options_1404018E0 + _Count_4) );

  // license_options
  std::string::assign((std::string *)&key_name, (const char *const)p_license_options_1404018E0, _Count_4);
  map_set_1400B6720(*(CActivatorData **)ptr, &key_name, &v_temp);
  if ( key_name._Myres >= 0x10 )
  {
    _Ptr_5 = key_name.u._Ptr;
    if ( key_name._Myres + 1 >= 0x1000 )
    {
      _Ptr_5 = (char *)*((_QWORD *)key_name.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(key_name.u._Ptr - _Ptr_5 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_5);
  }

  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  key_name.u._Buf[0] = 0;
  if ( v_temp._Myres >= 0x10 )
  {
    _Ptr_6 = v_temp.u._Ptr;
    if ( v_temp._Myres + 1 >= 0x1000 )
    {
      _Ptr_6 = (char *)*((_QWORD *)v_temp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(v_temp.u._Ptr - _Ptr_6 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_6);
  }

  v_temp._Myres = 0xFi64;
  v_temp._Mysize = 4i64;
  v_temp.u._Ptr = (char *)'OMED';
  k_ttemp.u._Ptr = 0i64;
  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  _Count_5 = 0xFFFFFFFFFFFFFFFFui64;
  // registed_name
  do
    ++_Count_5;
  while ( *(_BYTE *)(p_registed_name_1404019F0 + _Count_5) );

  std::string::assign((std::string *)&k_ttemp, (const char *const)p_registed_name_1404019F0, _Count_5);
  map_set_1400B6720(*(CActivatorData **)ptr, &k_ttemp, &v_temp);
  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_7 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_7 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_7 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_7);
  }

  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  k_ttemp.u._Buf[0] = 0;
  if ( v_temp._Myres >= 0x10 )
  {
    _Ptr_8 = v_temp.u._Ptr;
    if ( v_temp._Myres + 1 >= 0x1000 )
    {
      _Ptr_8 = (char *)*((_QWORD *)v_temp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(v_temp.u._Ptr - _Ptr_8 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_8);
  }

  key_name.u._Ptr = 0i64;
  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  _Count_6 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_6;
  while ( *(_BYTE *)(p_firstActivation_1404017B0 + _Count_6) );

  // firstActivation
  std::string::assign((std::string *)&key_name, (const char *const)p_firstActivation_1404017B0, _Count_6);
  map_set_1400B6720(*(CActivatorData **)ptr, &key_name, &_Ptr__1);
  if ( key_name._Myres >= 0x10 )
  {
    _Ptr_9 = key_name.u._Ptr;
    if ( key_name._Myres + 1 >= 0x1000 )
    {
      _Ptr_9 = (char *)*((_QWORD *)key_name.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(key_name.u._Ptr - _Ptr_9 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_9);
  }

  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  key_name.u._Buf[0] = 0;
  k_ttemp.u._Ptr = 0i64;
  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  _Count_7 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_7;
  while ( *(_BYTE *)(p_activationDate_1404017F8 + _Count_7) );

  // activationDate
  std::string::assign((std::string *)&k_ttemp, (const char *const)p_activationDate_1404017F8, _Count_7);
  map_set_1400B6720(*(CActivatorData **)ptr, &k_ttemp, &_Ptr__1);
  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_10 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_10 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_10 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_10);
  }

  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  k_ttemp.u._Buf[0] = 0;
  key_name.u._Ptr = 0i64;
  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  _Count_8 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_8;
  while ( *(_BYTE *)(p_nextActivation_140401958 + _Count_8) );

  // nextActivation
  std::string::assign((std::string *)&key_name, (const char *const)p_nextActivation_140401958, _Count_8);
  map_set_1400B6720(*(CActivatorData **)ptr, &key_name, &_Ptr__1);
  if ( key_name._Myres >= 0x10 )
  {
    _Ptr_11 = key_name.u._Ptr;
    if ( key_name._Myres + 1 >= 0x1000 )
    {
      _Ptr_11 = (char *)*((_QWORD *)key_name.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(key_name.u._Ptr - _Ptr_11 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_11);
  }

  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  key_name.u._Buf[0] = 0;
  k_ttemp.u._Ptr = 0i64;
  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  _Count_9 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_9;
  while ( *(_BYTE *)(p_serverDate_140401A18 + _Count_9) );

  // serverDate
  std::string::assign((std::string *)&k_ttemp, (const char *const)p_serverDate_140401A18, _Count_9);
  map_set_1400B6720(*(CActivatorData **)ptr, &k_ttemp, &_Ptr__1);
  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_12 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_12 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_12 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_12);
  }

  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  k_ttemp.u._Buf[0] = 0;
  key_name.u._Ptr = 0i64;
  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  _Count_10 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_10;
  while ( *(_BYTE *)(p_serverTime_140401A40 + _Count_10) );

  // serverTime
  std::string::assign((std::string *)&key_name, (const char *const)p_serverTime_140401A40, _Count_10);
  _Ptr_13 = (std_string *)std::to_string((std::string *)&v_temp, _Val);
  map_set_1400B6720(*(CActivatorData **)ptr, &key_name, _Ptr_13);
  if ( v_temp._Myres >= 0x10 )
  {
    _Ptr_14 = v_temp.u._Ptr;
    if ( v_temp._Myres + 1 >= 0x1000 )
    {
      _Ptr_14 = (char *)*((_QWORD *)v_temp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(v_temp.u._Ptr - _Ptr_14 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_14);
  }

  v_temp._Mysize = 0i64;
  v_temp._Myres = 0xFi64;
  v_temp.u._Buf[0] = 0;
  if ( key_name._Myres >= 0x10 )
  {
    _Ptr_15 = key_name.u._Ptr;
    if ( key_name._Myres + 1 >= 0x1000 )
    {
      _Ptr_15 = (char *)*((_QWORD *)key_name.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(key_name.u._Ptr - _Ptr_15 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_15);
  }

  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  key_name.u._Buf[0] = 0;
  k_ttemp.u._Ptr = 0i64;
  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  _Count_11 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_11;
  while ( *(_BYTE *)(p_license_key_code_140401908 + _Count_11) );

  // license_key_code
  std::string::assign((std::string *)&k_ttemp, (const char *const)p_license_key_code_140401908, _Count_11);
  map_set_1400B6720(*(CActivatorData **)ptr, &k_ttemp, (std_string *)(*(_QWORD *)(a1 + 0x70) + 0x48i64));
  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_16 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_16 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_16 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_16);
  }

  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  k_ttemp.u._Buf[0] = 0;
  key_name.u._Ptr = 0i64;
  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  _Count_12 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_12;
  while ( *(_BYTE *)(p_hid_140401868 + _Count_12) );

  // hid
  std::string::assign((std::string *)&key_name, (const char *const)p_hid_140401868, _Count_12);
  v41 = *(_QWORD *)(a1 + 0x70);
  v42 = *(std::string **)(v41 + 0xA8);
  n0x10 = *((_QWORD *)v42 + 2);
  if ( !n0x10 )
  {
    hid_1400BBED0 = get_hid_1400BBED0(*(_QWORD *)(v41 + 0xA8), (std::string *)&k_ttemp);
    std::string::operator=(v42, hid_1400BBED0);
    if ( k_ttemp._Myres >= 0x10 )
    {
      _Ptr_17 = k_ttemp.u._Ptr;
      if ( k_ttemp._Myres + 1 >= 0x1000 )
      {
        _Ptr_17 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
        if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_17 - 8) > 0x1F )
          goto LABEL_183;
      }

      j_j_free(_Ptr_17);
    }

    k_ttemp._Mysize = 0i64;
    k_ttemp._Myres = 0xFi64;
    k_ttemp.u._Buf[0] = 0;
    n0x10 = *((_QWORD *)v42 + 2);
  }

  v_temp.u._Ptr = 0i64;
  v_temp._Mysize = 0i64;
  v_temp._Myres = 0i64;
  if ( *((_QWORD *)v42 + 3) >= 0x10ui64 )
    v42 = *(std::string **)v42;

  if ( n0x10 < 0x10 )
  {
    v_temp.u = *(union std_string_union *)v42;
    v_temp._Myres = 0xFi64;
    goto LABEL_123;
  }

  _Myres = n0x10 | 0xF;
  if ( (n0x10 | 0xF) > 0x7FFFFFFFFFFFFFFFi64 )
    _Myres = 0x7FFFFFFFFFFFFFFFi64;

  if ( (unsigned __int64)(_Myres + 1) < 0x1000 )
  {
    if ( _Myres == 0xFFFFFFFFFFFFFFFFui64 )
      _Ptr_18 = 0i64;
    else
      _Ptr_18 = (char *)operator new(_Myres + 1);

    goto LABEL_122;
  }

  if ( _Myres + 0x28 <= (unsigned __int64)(_Myres + 1) )
    error_140088E10();

  v47 = operator new(_Myres + 0x28);
  v48 = v47;
  if ( !v47 )
LABEL_183:
    invalid_parameter_noinfo_noreturn();

  _Ptr_18 = (char *)(((unsigned __int64)v47 + 0x27) & 0xFFFFFFFFFFFFFFE0ui64);
  *((_QWORD *)_Ptr_18 + 0xFFFFFFFF) = v48;

LABEL_122:
  v_temp.u._Ptr = _Ptr_18;
  memmove(_Ptr_18, v42, n0x10 + 1);
  v_temp._Myres = _Myres;

LABEL_123:
  v_temp._Mysize = n0x10;
  map_set_1400B6720(*(CActivatorData **)ptr, &key_name, &v_temp);
  if ( v_temp._Myres >= 0x10 )
  {
    _Ptr_19 = v_temp.u._Ptr;
    if ( v_temp._Myres + 1 >= 0x1000 )
    {
      _Ptr_19 = (char *)*((_QWORD *)v_temp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(v_temp.u._Ptr - _Ptr_19 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_19);
  }

  if ( key_name._Myres >= 0x10 )
  {
    _Ptr_20 = key_name.u._Ptr;
    if ( key_name._Myres + 1 >= 0x1000 )
    {
      _Ptr_20 = (char *)*((_QWORD *)key_name.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(key_name.u._Ptr - _Ptr_20 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_20);
  }

  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  key_name.u._Buf[0] = 0;
  v_temp._Myres = 0xFi64;
  v_temp._Mysize = 4i64;
  v_temp.u._Ptr = (char *)'OMED';
  k_ttemp.u._Ptr = 0i64;
  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  _Count_13 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_13;
  while ( *(_BYTE *)(p_licenseName_140401930 + _Count_13) );

  // licenseName
  std::string::assign((std::string *)&k_ttemp, (const char *const)p_licenseName_140401930, _Count_13);
  map_set_1400B6720(*(CActivatorData **)ptr, &k_ttemp, &v_temp);
  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_21 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_21 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_21 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_21);
  }

  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  k_ttemp.u._Buf[0] = 0;
  if ( v_temp._Myres >= 0x10 )
  {
    _Ptr_22 = v_temp.u._Ptr;
    if ( v_temp._Myres + 1 >= 0x1000 )
    {
      _Ptr_22 = (char *)*((_QWORD *)v_temp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(v_temp.u._Ptr - _Ptr_22 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_22);
  }

  key_name.u._Ptr = 0i64;
  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  _Count_14 = 0xFFFFFFFFFFFFFFFFui64;
  do
    ++_Count_14;
  while ( *(_BYTE *)(p_product_id_140401980 + _Count_14) );

  // product_id
  std::string::assign((std::string *)&key_name, (const char *const)p_product_id_140401980, _Count_14);
  map_set_1400B6720(*(CActivatorData **)ptr, &key_name, (std_string *)(*(_QWORD *)(a1 + 0x70) + 8i64));
  if ( key_name._Myres >= 0x10 )
  {
    _Ptr_23 = key_name.u._Ptr;
    if ( key_name._Myres + 1 >= 0x1000 )
    {
      _Ptr_23 = (char *)*((_QWORD *)key_name.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(key_name.u._Ptr - _Ptr_23 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_23);
  }

  key_name._Mysize = 0i64;
  key_name._Myres = 0xFi64;
  key_name.u._Buf[0] = 0;
  k_ttemp.u._Ptr = 0i64;
  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  do
    ++_Count_15;
  while ( *(_BYTE *)(p_product_version_1404019C8 + _Count_15) );

  // product_version
  std::string::assign((std::string *)&k_ttemp, (const char *const)p_product_version_1404019C8, _Count_15);
  map_set_1400B6720(*(CActivatorData **)ptr, &k_ttemp, (std_string *)(*(_QWORD *)(a1 + 0x70) + 0x28i64));
  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_24 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_24 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_24 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_24);
  }

  k_ttemp.u._Ptr = 0i64;
  k_ttemp._Mysize = 0i64;
  k_ttemp._Myres = 0xFi64;
  std::string::assign((std::string *)&k_ttemp, ": end", 5ui64);
  ss_1400ACC30(a1, "electronic::activator::CActivator::CreateInitialData", &k_ttemp);
  if ( k_ttemp._Myres >= 0x10 )
  {
    _Ptr_25 = k_ttemp.u._Ptr;
    if ( k_ttemp._Myres + 1 >= 0x1000 )
    {
      _Ptr_25 = (char *)*((_QWORD *)k_ttemp.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(k_ttemp.u._Ptr - _Ptr_25 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_25);
  }

  if ( _Ptr_._Myres >= 0x10 )
  {
    _Ptr_26 = _Ptr_.u._Ptr;
    if ( _Ptr_._Myres + 1 >= 0x1000 )
    {
      _Ptr_26 = (char *)*((_QWORD *)_Ptr_.u._Ptr + 0xFFFFFFFF);
      if ( (unsigned __int64)(_Ptr_.u._Ptr - _Ptr_26 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }

    j_j_free(_Ptr_26);
  }

  if ( _Ptr__1._Myres >= 0x10 )
    std::allocator<char>::deallocate(&_Ptr__1, _Ptr__1.u._Ptr, _Ptr__1._Myres + 1);

  return ptr;
}

ValidateActData 所需字段

'&' 进行连接,key=value 形式字符串

函数parse_and_validate_data_1400B5DA0 负责解析字符串

hash

未找到验证处

//加密字符串所在位置
.data:00000001403F3030 enc_hash_1403F3030 db 3Eh, 50h, 0F1h, 16h, 78h, 0CCh, 0C5h, 59h, 29h, 3Ah
.data:00000001403F3030                                         ; DATA XREF: sub_14007A810+1A↑o
.data:00000001403F3030                                         ; sub_14007A810+70↑o
.data:00000001403F3030                 db 0C1h, 86h, 65h, 0E4h, 2Dh, 0BBh

errorCode

0
ALREADY_ACTIVATED
DEMO_IS_OVER
NO_AVAILABLE_ACTIVATIONS
KEY_BANNED
+REACTIVATE
+STARTING

product_id

123

product_version

11

licenseName

//unknow

license_key_code

//格式:88888-88888-88888-88888-88888

key_type

0,1,2,3

0==>SingleAllDevice
1==>Single1Device
2==>TimeLimited
3==>oem

other==>Demo
__int64 __fastcall lic_type_str_1401018EC(__int64 a1, __int64 a2)
{
  int v3; // eax
  int v4; // eax
  int v5; // eax
  __int64 v6; // rcx
  wchar_t *_SingleAllDevice_; // rdx

  v3 = get_key_type_1400A5D10(*(_QWORD *)(a1 + 0x10));
  if ( !v3 )
  {
    _SingleAllDevice_ = off_1403EB258[0];       // "SingleAllDevice"
    goto LABEL_10;
  }

  v4 = v3 - 1;
  if ( !v4 )
  {
    _SingleAllDevice_ = off_1403EB240[0];       // "Single1Device"
    goto LABEL_10;
  }

  v5 = v4 - 1;
  if ( !v5 )
  {
    _SingleAllDevice_ = SingleAllDevice_;       // "TimeLimited"

LABEL_10:
    v6 = a2;
    goto LABEL_11;
  }

  v6 = a2;
  if ( v5 == 1 )
    _SingleAllDevice_ = off_1403EB278[0];       // "oem"
  else
    _SingleAllDevice_ = off_1403EB290[0];       // "Demo"

LABEL_11:
  sub_1400B9C40(v6, _SingleAllDevice_);
  return a2;
}
   // key type
    n3_1 = find_key_type_1400B7440(map->_Myhead, p_key_type_140402520, 0xFFFFFFFFi64);
    n2_2 = n3_1;
    if ( n3_1 > 3 )
    {
      s.u._Ptr = 0i64;
      s._Mysize = 0i64;
      s._Myres = 0xFi64;
      std::string::assign((std::string *)&s, ": wrong key type: ", 0x12ui64);
      sub_1400AD920(stringstream, v94, &s, n2_2);

key_type==3时 报错+STARTING

    if ( isType3 )
    {
      std::string::assign((std::string *)&s, ": OEM key - first time reactivation", 0x23ui64);
      ss_1400ACDE0(stringstream, "electronic::activator::CActivator::ValidateActData", &s);
      if ( s._Myres >= 0x10 )
      {
        _Ptr_19 = s.u._Ptr;
        if ( s._Myres + 1 >= 0x1000 )
        {
          _Ptr_19 = (char *)*((_QWORD *)s.u._Ptr + 0xFFFFFFFF);
          if ( (unsigned __int64)(s.u._Ptr - _Ptr_19 - 8) > 0x1F )
            goto LABEL_295;
        }

        j_j_free(_Ptr_19);
      }

      Buf2_5 = (const char *)p_add_STARTING_140401408;
      do
        ++_Count;
      while ( *((_BYTE *)p_add_STARTING_140401408 + _Count) );

      goto LABEL_222;
    }

hid校验失败时 +WRONG_HID

key_options

find_keyname_defaultvalue_1400B7440(map->_Myhead, p_key_options_1404024F8, 0i64);

license_options

find_keyname_defaultvalue_1400B7440(map->_Myhead, p_license_options_140402548, 0i64);

serverDate

%4d-%2d-%2d

firstActivation

%4d-%2d-%2d

nextActivation

%4d-%2d-%2d

activationDate

%4d-%2d-%2d

registed_name

(unknow)

其他

CActivator

根据字符串可定位关键函数

.rdata:00000001403ABE70	00000031	C	CActivatorFacade::SetLogger - new logger was set
.rdata:00000001403ABEB0	00000028	C	electronic::activator::CActivator::Init
.rdata:00000001403ABF58	00000039	C	electronic::activator::CActivator::DetermineUpdateAction
.rdata:00000001403AC250	00000030	C	electronic::activator::CActivator::UpdateStatus
.rdata:00000001403AC3C0	0000002D	C	electronic::activator::CActivator::RunAutoma
.rdata:00000001403AC418	0000002C	C	electronic::activator::CActivator::DoAutoma
.rdata:00000001403AC480	0000002E	C	electronic::activator::CActivator::StartGrace
.rdata:00000001403AC640	00000032	C	electronic::activator::CActivator::ActivateOnline
.rdata:00000001403ACAD8	00000032	C	electronic::activator::CActivator::OfflineRequest
.rdata:00000001403ACB70	00000033	C	electronic::activator::CActivator::ActivateOffline
.rdata:00000001403ACCE0	00000030	C	electronic::activator::CActivator::ActivateDemo
.rdata:00000001403ACF40	0000002E	C	electronic::activator::CActivator::Reactivate
.rdata:00000001403AD178	0000002B	C	electronic::activator::CActivator::Install
.rdata:00000001403AD208	0000002D	C	electronic::activator::CActivator::DaysLimit
.rdata:00000001403AD2E8	0000002D	C	electronic::activator::CActivator::IsExpired
.rdata:00000001403AD330	0000002F	C	electronic::activator::CActivator::ReadActFile
.rdata:00000001403AD580	00000033	C	electronic::activator::CActivator::ValidateActData
.rdata:00000001403AD840	00000035	C	electronic::activator::CActivator::CreateInitialData
.rdata:00000001403AD888	0000003E	C	electronic::activator::CActivator::CreateDemoTrialDefaultData

内置公钥

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwknN5/81qIoM+k1WEc/5
A+u3YzWeDNE5i5rpayiNWv4TvxX9udMz3uKF4tmDJfjuSCVUHQWAjJefwSv4ZBQ7
egXHtGzh/HVY/Geei7A1TwOroHxxgUKVkXRoPGYIVNBhrqX0CsCgYCZv7Ij6CSy4
Iamw0Gb/BnZ4Uw1AkOs6DfbGaVspeQGg7oTjSj+TKOWdK1dJ7ZoGyoVQLqxpaq41
r893XqSK5mXlbE3pFSjS6Rn8unyt57EuIcFy+x2VqjOf3KiwiGCeIaQtAtF5Pqii
KoEMoGgcDedO4C6h/LKy1oXJR7QeHQijUAn7JXE/i0I57BXyKylR6/YIV6hV+Ovm
bQIDAQAB
-----END PUBLIC KEY-----

日志记录

C:\Program Files\Electronic Team\USB Network Gate\act.log

字符串加密(AES_256_CBC)

全局字符串被加密,(可调试时直接dump相应数据)

例如:firstActivation

//UsbService64.exe
int sub_140074990()
{
  unsigned int n0x10; // edx
  char *v1; // rax
  void *v2; // rcx
  void *v4[2]; // [rsp+20h] [rbp-28h] BYREF
  __int64 v5; // [rsp+30h] [rbp-18h]

  if ( byte_1403F1A60 )
  {
    n0x10 = 0;
    v1 = byte_1403F1A50;
    do
      *v1++ ^= 0x33 - n0x10++;
    while ( n0x10 < 0x10 );

    byte_1403F1A60 = 0;
  }

  v4[0] = operator new(0x10ui64);
  v5 = (__int64)v4[0] + 0x10;
  memmove(v4[0], byte_1403F1A50, 0x10ui64);
  v4[1] = (char *)v4[0] + 0x10;
  aes_cbc_dec_1400B4290((std::string *)&firstActivation_1404017B0, (__int64)v4);
  v2 = v4[0];
  if ( !v4[0] )
    return atexit(sub_1402E9800);

  if ( v5 - (unsigned __int64)v4[0] >= 0x1000 )
  {
    v2 = (void *)*((_QWORD *)v4[0] + 0xFFFFFFFF);
    if ( (unsigned __int64)(v4[0] - v2 - 8) > 0x1F )
      invalid_parameter_noinfo_noreturn();
  }

  j_j_free(v2);
  return atexit(sub_1402E9800);
}

解密:

from Crypto.Cipher import AES
def xor_bs(data:bytes,k:int):
    out=[]
    for i,x in enumerate(data) :
        out.append(x^(k-i))
    return bytes(out)

iv=bytes.fromhex('DEEDFDFB0D0C97A3BD590C4E42E75570')
key=bytes.fromhex('37C1E8C647684E9A441D5547F0975F2F7CDC16732BD53BD545005D3995F6B034')

def test():
    cipher=AES.new(key=key,iv=iv,mode=AES.MODE_CBC)
    data=xor_bs(bytes.fromhex('94AFF81DC68E2D1B8D77D235B0120173'),0x33)
    x=cipher.decrypt(data)
    print(x)
    pass


if __name__=='__main__':
    test()
    pass

'''
b'firstActivation\x01'
'''

字符串资源

zh_CN.tkv

UsbConfig.exe .rdata:007C10B8 off_7C10B8

0,0==>IDSM_SHARE_DEV
1,1==>IDSM_SHARE_SHARE
2,2==>IDSM_CHANGE_SHARING
3,3==>IDSM_SHARE_DISC
4,4==>IDSM_UNSHARE
5,5==>IDSM_UNSHARE_ALL
6,6==>IDSM_EDIT_NICK
7,7==>IDS_ENCRYPTION
8,8==>IDS_COMPRESSION
9,9==>IDS_AUTHORIZATION
10,a==>IDSM_SHARE_EDIT
11,b==>IDS_COMPRESSION_TYPE_NONE
12,c==>IDS_COMPRESSION_TYPE_ZLIB
13,d==>IDS_COMPRESSION_TYPE_LZ4
14,e==>IDSM_CON_DEV
15,f==>IDSM_ADD_SERVER
16,10==>IDSM_ADD_DEVICE
17,11==>IDSM_REMOVE_DEVICE
18,12==>IDSM_CONNECT
19,13==>IDSM_CONNECT_ONCE
20,14==>IDSM_CONNECT_SESSION
21,15==>IDSM_CONNECT_USER
22,16==>IDSM_CONNECT_WITH_PASS
23,17==>IDSM_DISCONNECT
24,18==>IDSM_DISCON_ALL
25,19==>IDSM_RDISCONNECT
26,1a==>IDSM_RDP_AUTO
27,1b==>IDSM_VIEW
28,1c==>IDSM_REAL_DEVS
29,1d==>IDSM_ALL_PORTS
30,1e==>IDSM_ONLY_SHARED
31,1f==>IDSM_SHOW_HID
32,20==>IDSM_ONLY_CONN
33,21==>IDSM_SHOW_DISCONNECTED_HUBS
34,22==>IDSM_DONT_SHOW_EMPTY_SHARED_PORT
35,23==>IDSM_SHOW_USB_LOC
36,24==>IDSM_VIEW_LOG
37,25==>IDSM_VIEW_LIMIT_BANNER
38,26==>IDSM_VIEW_LANG
39,27==>IDSM_VIEW_TRAFFIC
40,28==>IDSM_VIEW_TRAF_NONE
41,29==>IDSM_VIEW_TRAF_SIZE_RAW
42,2a==>IDSM_VIEW_TRAF_SIZE_ZIP
43,2b==>IDSM_VIEW_TRAF_SPEED_RAW
44,2c==>IDSM_VIEW_TRAF_SPEED_ZIP
45,2d==>IDSM_VIEW_BITS_PER_SEC
46,2e==>IDSM_VIEW_BYTES_PER_SEC
47,2f==>IDSM_HELP
48,30==>IDSM_ONLINE_HELP
49,31==>IDSM_EXTEND_TRIAL
50,32==>IDSM_BUY_FULL
51,33==>IDSM_ENTER_REG_INFO
52,34==>IDSM_CHK_UPDATE
53,35==>IDSM_HELP_ABOUT
54,36==>IDSM_LOG_CLEAR
55,37==>IDSM_LOG_SAVE
56,38==>IDSM_LOG_COPY
57,39==>IDSM_LOG_SELECT_ALL
58,3a==>IDS_TAB_LOCAL
59,3b==>IDS_TAB_REMOTE
60,3c==>IDS_OPT_DEVICES
61,3d==>IDS_OPT_ALL_PORTS
62,3e==>IDS_OPT_VIEW_SHARED
63,3f==>IDS_OPT_ADD_SERVER
64,40==>IDS_OPT_ENABLE_RDP
65,41==>IDS_OPT_ADVANCED_OPT
66,42==>IDS_OPT_AO_HID
67,43==>IDS_OPT_AO_USB3HUB
68,44==>ID_OPT_AO_ONLY_USB3HUB
69,45==>IDS_BTN_SHARE
70,46==>IDS_ERR_BAD_PASSWORD
71,47==>IDS_ERR_EMPTY_PASS
72,48==>IDS_ERR_BAD_HOSTNAME
73,49==>IDS_ERR_HOSTNAME_EMPTY
74,4a==>IDS_ERR_INVALID_HOSTNAME
75,4b==>IDS_ERR_TCP_PORT_OUT_RANGE
76,4c==>IDS_ERR_THATS_MY_IP
77,4d==>IDS_ERR_CANT_OPEN_LOG
78,4e==>IDS_ERR_CANT_SHARE_PORT
79,4f==>IDS_ERR_CANT_SHARE_DEV
80,50==>IDS_TIP_AUTH_ENABLED
81,51==>IDS_TIP_CRYPT_ENABLED
82,52==>IDS_TIP_COMPR_ENABLED
83,53==>IDS_TIP_ISOLATE_NONE
84,54==>IDS_TIP_ISOLATE_SESSION
85,55==>IDS_TIP_ISOLATE_USER
86,56==>IDS_STATUS_TEMPLATE
87,57==>IDS_ST_SHARED_AT_PORT
88,58==>IDS_ST_SHARED_AS_CALLBACK
89,59==>IDS_ST_CONNECTED_TO_CLIENT
90,5a==>IDS_ST_CONNECTED_AS_CALLBACK
91,5b==>IDS_ACT_SHARING
92,5c==>IDS_ACT_UNSHARING
93,5d==>IDS_ACT_DISCONNECTING
94,5e==>IDS_ACT_CHANGING
95,5f==>IDS_ACT_CONNECTING
96,60==>IDS_ACT_REMOVING
97,61==>IDS_ST_DEVICE_OFF
98,62==>IDS_ST_DISCONNECTED
99,63==>IDS_ST_CONNECTED
100,64==>IDS_ST_CONNECTED_SESSION
101,65==>IDS_ST_CONNECTED_USER
102,66==>IDS_ST_CLIENT_WAITING
103,67==>IDS_ST_OCCUPIED
104,68==>IDS_ST_CALLBACK_PORT
105,69==>IDS_INF_UNKNOWN_DEV
106,6a==>IDS_INF_NOT_AVAILABLE
107,6b==>IDS_HINT_ENTER_NICK
108,6c==>IDS_MSG_NOTHING_SHOW
109,6d==>IDS_MSG_DEMO_BANNER
110,6e==>IDS_MSG_REGISTERED_VERSION
111,6f==>IDS_MSG_REGVER_WITH_LIMIT
112,70==>IDS_MSG_UNLIM_SHARE
113,71==>IDS_MSG_ONLY_1_SHARE
114,72==>IDS_MSG_ONLY_N_SHARE
115,73==>IDS_MSG_MAX_SHARED
116,74==>IDS_MSG_CAN_1_MORE
117,75==>IDS_MSG_CAN_N_MORE
118,76==>IDS_ERR_CANT_SHARE_LIMIT
119,77==>IDS_ERR_CANT_SHARE_TCP
120,78==>IDS_ERR_CANT_SHARE_OTHER
121,79==>IDS_ERR_SETTINGS_EQ
122,7a==>IDS_ERR_CANT_ADD_DEVICE
123,7b==>IDS_ERR_CANT_ADD_CALLBACK
124,7c==>IDS_NOT_ENABLE_RDISCON
125,7d==>IDS_USB_LOC_NICK_TEMPLATE
126,7e==>IDSD_demo_1dev
127,7f==>IDSD_demo_Ndev
128,80==>IDSD_demo_unlim
129,81==>IDSD_click_demo
130,82==>IDSD_trial_Ndays
131,83==>IDSD_trial_1day
132,84==>IDSD_exhausted
133,85==>IDSD_time_backward
134,86==>IDSD_trial_blocked
135,87==>IDSD_badlocaltime
136,88==>IDSD_setdatetime
137,89==>IDSD_wrong_hid
138,8a==>IDSD_failed_reactivate
139,8b==>IDSD_max_hids
140,8c==>IDSD_max_hids_todo
141,8d==>IDSD_key_banned
142,8e==>IDSD_other_error
143,8f==>IDSD_need_activate
144,90==>IDSD_error_details
145,91==>IDSD_btn_entercode
146,92==>IDS_btn_ordernow
147,93==>IDSD_btn_trial
148,94==>IDS_btn_activate
149,95==>IDS_btn_tryagain
150,96==>IDS_btn_act_offline
151,97==>IDSD_btn_remind
152,98==>IDS_btn_upd_info
153,99==>IDS_btn_enter_code
154,9a==>IDS_btn_cancel
155,9b==>IDSD_splash
156,9c==>IDSA_dialog_title
157,9d==>IDSA_please_enter_code
158,9e==>IDSA_enter_todo
159,9f==>IDSA_lost_code
160,a0==>IDSA_hint_enter_code
161,a1==>IDSA_msg_wrong_key
162,a2==>IDSA_title_success
163,a3==>IDSA_msg_success
164,a4==>IDSA_title_failed
165,a5==>IDSA_msg_nolink
166,a6==>IDSA_msg_nolink_offline
167,a7==>IDSA_btn_activate_later
168,a8==>IDSA_btn_manually
169,a9==>IDSA_msg_maxhids_1
170,aa==>IDSA_title_manually
171,ab==>IDSA_btn_load
172,ac==>IDSA_btn_save
173,ad==>IDSA_load_filter
174,ae==>IDSA_filt_all_files
175,af==>IDSA_save_filter
176,b0==>IDSA_save_success
177,b1==>IDSA_title_error
178,b2==>IDSA_cant_load
179,b3==>IDSA_cant_save
180,b4==>IDSA_title_activation
181,b5==>IDSA_err_badlocaltime
182,b6==>IDSA_err_banned
183,b7==>IDSA_err_wrong_code
184,b8==>IDSA_err_wrong_version
185,b9==>IDSA_err_file_expired
186,ba==>IDSA_err_file_mistarget
187,bb==>IDSA_err_file_corrupted
188,bc==>IDSA_cant_activate_ask_us
189,bd==>IDSA_generic_cant_activate
190,be==>IDSI_install_title
191,bf==>IDSI_session_install_msg
192,c0==>IDSI_user_install_msg
193,c1==>IDSI_need_restart_msg
194,c2==>IDSI_button_restart
195,c3==>IDSI_button_not_now
196,c4==>IDS_USBCLASS_0x01_AUDIO
197,c5==>IDS_USBCLASS_0x02_COMMUNICATIONS
198,c6==>IDS_USBCLASS_0x03_HID_KEYBOARD
199,c7==>IDS_USBCLASS_0x03_HID_MOUSE
200,c8==>IDS_USBCLASS_0x03_HID
201,c9==>IDS_USBCLASS_0x05_PHYSICAL
202,ca==>IDS_USBCLASS_0x06_IMAGING
203,cb==>IDS_USBCLASS_0x07_PRINTER
204,cc==>IDS_USBCLASS_0x08_MASSSTORAGE
205,cd==>IDS_USBCLASS_0x09_HUB
206,ce==>IDS_USBCLASS_0x0A_COMMUNICATIONS
207,cf==>IDS_USBCLASS_0x0B_SMARTCARD
208,d0==>IDS_USBCALSS_0x0D_SECURITY
209,d1==>IDS_USBCLASS_0x0E_VIDEO
210,d2==>IDS_USBCLASS_0x0F_HEALTHCARE
211,d3==>IDS_USBCLASS_0x10_AUDIOVIDEO
212,d4==>IDS_USBCLASS_0xDC_DIAGNOSTIC
213,d5==>IDS_USBCLASS_0xE0_WIRELESS
214,d6==>IDS_RESTART_CHANGE_LANG
215,d7==>IDS_ERROR_NOLANGUAGE
216,d8==>IDS_NO_SERVICE_TEXT
217,d9==>IDS_ALREADY_USE_TCPPORT
218,da==>IDS_UPDATE_CHECKERROR
219,db==>IDS_UPDATE_NOUPDATES
220,dc==>IDS_BTN_CANCEL
221,dd==>IDS_CONFIRM_ACTION
222,de==>IDS_ARE_YOU_SURE
223,df==>IDS_HID_WARNING
224,e0==>IDS_TCP_GROUP
225,e1==>IDS_LISTEN_ON_PORT
226,e2==>IDS_SHARE_AS_CALLBACK
227,e3==>IDS_HINT_HOSTNAME
228,e4==>IDS_CONN_GROUP
229,e5==>IDS_PASSWORD_
230,e6==>IDS_RETYPE_
231,e7==>IDS_ALLOW_RDISCON
232,e8==>IDS_DONT_RESET_DEV
233,e9==>IDS_NICK
234,ea==>IDS_CHANGE_NICK_TITLE
235,eb==>IDS_BTN_OK
236,ec==>IDS_LOG_TITLE
237,ed==>IDS_ADD_CLIENT_TITLE
238,ee==>IDS_RADIO_SHARED_DEVICE
239,ef==>IDS_RADIO_CALLBACK
240,f0==>IDS_VER_TEMPLATE
241,f1==>IDS_LOGFILE
242,f2==>IDS_TT_USB_PORT
243,f3==>IDS_TT_SHARED_USB
244,f4==>IDS_TT_DEV_NAME
245,f5==>IDS_TT_NICK
246,f6==>IDS_TT_REMOTE_DEV
247,f7==>IDS_TT_REMOTE_PORT
248,f8==>IDS_TT_SHARED_AT
249,f9==>IDS_TT_STATUS
250,fa==>IDS_TT_REMOTE_OFFLINE
251,fb==>IDS_RDP_HUB
252,fc==>IDS_CALLBACK_HUB
253,fd==>IDS_MY_COMPUTER
254,fe==>IDS_MY_COMPUTER_NAME
255,ff==>IDS_COMP_IP_TEMPLATE
256,100==>IDS_GUI_TITLE
257,101==>IDS_CLIENT_MODE_GUI_TITLE
258,102==>IDS_ALREADY_RUNNING
259,103==>IDS_DLG_CONNECT_TITLE
260,104==>IDS_DLG_CONNECT_REQUIRE_PASSWD
261,105==>IDS_DLG_CONNECT_MAYBE_PASSWD
262,106==>IDS_DLG_SET_PASSWD_TITLE
263,107==>IDS_DLG_SET_PASSWD_PROMPT
264,108==>IDS_BTN_SET
265,109==>IDS_CANT_SHARE_TITLE
266,10a==>IDS_CANT_SHARE_DEMO_N
267,10b==>IDS_CANT_SHARE_LIMIT_N
268,10c==>IDS_SET_NICK_PROMPT
269,10d==>IDS_ADD_SERVER_PROMPT
270,10e==>IDS_BTN_ADD
271,10f==>IDSA_manually_todo_e
272,110==>IDS_HOST_LABEL
273,111==>IDS_PORT_LABEL
274,112==>IDS_COMPRESSION_
275,113==>IDS_MISC_GROUP
276,114==>IDS_TIMEOUT_CHECKBOX
277,115==>IDS_TIMEOUT_CUSTOM
278,116==>IDS_TIMEOUT_30_SECONDS
279,117==>IDS_TIMEOUT_1_MINUTE
280,118==>IDS_TIMEOUT_5_MINUTES
281,119==>IDS_TIMEOUT_10_MINUTES
282,11a==>IDS_TIMEOUT_20_MINUTES
283,11b==>IDS_TIMEOUT_30_MINUTES
284,11c==>IDS_TIMEOUT_45_MINUTES
285,11d==>IDS_TIMEOUT_1_HOUR
286,11e==>IDS_TIMEOUT_2_HOURS
287,11f==>IDS_TIMEOUT_3_HOURS
288,120==>IDS_TIMEOUT_4_HOURS
289,121==>IDS_TIMEOUT_6_HOURS
290,122==>IDS_TIMEOUT_12_HOURS
291,123==>IDS_TIMEOUT_24_HOURS
292,124==>IDS_SUPPORT_EMAIL_TEMPLATE
293,125==>IDS_NOTE_FREE_CLIENT
294,126==>IDS_CANT_REACTIVATE_ANYMORE
295,127==>IDS_TEXT_LINK_MAX_HIDS
296,128==>IDS_REACTIVATION_REQUIRED
297,129==>IDS_GRACE_OVER_REV
298,12a==>IDS_GRACE_N_DAYS_MANY
299,12b==>IDS_GRACE_1_DAY_ONLY
300,12c==>IDS_GRACE_TODO_REV
301,12d==>IDS_FREE_TRIAL_TITLE
302,12e==>IDS_FREE_TRIAL_OVER_TITLE
303,12f==>IDS_FREE_TRIAL_OVER_TEXT
304,130==>IDS_FREE_TRIAL_EXTERNSION_LINK
305,131==>IDS_CRACKED_TITLE
306,132==>IDS_CRACKED_TEXT
307,133==>IDS_CRACKED_LINK_PURCHASE
308,134==>IDS_CRACKED_LINK_INFO
309,135==>IDS_TRIAL_DEMO_TITLE
310,136==>IDS_TRIAL_DEMO_TEXT
311,137==>IDS_TRIAL_OVER_TITLE
312,138==>IDS_TRIAL_OVER_TEXT
313,139==>IDS_TRIAL_LABEL_BENEFITS
314,13a==>IDS_TRIAL_LABEL_BENEFIT_1
315,13b==>IDS_TRIAL_LABEL_BENEFIT_2
316,13c==>IDS_TRIAL_LABEL_BENEFIT_3
317,13d==>IDS_TRIAL_LABEL_BENEFIT_4
318,13e==>IDS_TRIAL_LABEL_BENEFIT_5
319,13f==>IDS_REQUEST_TRIAL_URL_TEMPLATE
320,140==>IDS_REQUEST_TRIAL_LINK
321,141==>IDS_REQUEST_TRIAL_LINK_OEM
322,142==>IDS_TRIAL_ACTIVATE_TITLE
323,143==>IDS_TRIAL_ACTIVATE_TEXT
324,144==>IDS_TRIAL_LABEL_ENTER_CODE
325,145==>IDS_TRIAL_NOTE_CODE_IN_EMAIL
326,146==>IDS_RECOVER_CODE_URL_TEMPLATE
327,147==>IDS_RECOVER_CODE_LINK
328,148==>IDS_ABOUT_CAPTION
329,149==>IDS_ABOUT_REGISTERED_TO
330,14a==>IDS_ABOUT_LICENSE_TYPE
331,14b==>IDS_ABOUT_LICENSE_DEMO
332,14c==>IDS_ABOUT_REGCODE
333,14d==>IDS_ABOUT_SUPPORT_EMAIL
334,14e==>IDS_ABOUT_COPYRIGHT
335,14f==>IDS_DEV_STATUS_TRAFFIC
336,150==>IDS_SIZE_KBYTE
337,151==>IDS_SIZE_MBYTE
338,152==>IDS_SIZE_GBYTE
339,153==>IDS_SIZE_TBYTE
340,154==>IDS_SIZE_PBYTE
341,155==>IDS_SIZE_EBYTE
342,156==>IDS_SPEED_KBYTE
343,157==>IDS_SPEED_MBYTE
344,158==>IDS_SPEED_GBYTE
345,159==>IDS_SPEED_TBYTE
346,15a==>IDS_SPEED_PBYTE
347,15b==>IDS_SPEED_EBYTE
348,15c==>IDS_SPEED_KBIT
349,15d==>IDS_SPEED_MBIT
350,15e==>IDS_SPEED_GBIT
351,15f==>IDS_SPEED_TBIT
352,160==>IDS_SPEED_PBIT
353,161==>IDS_SPEED_EBIT
354,162==>IDS_OEM_AD_TEXT1
355,163==>IDS_OEM_AD_TEXT2
356,164==>IDS_OEM_AD_LINK_MORE
357,165==>IDS_OEM_AD_LINK_CLOSE
358,166==>IDSM_HELP_ABOUT_OEM_INTEGRATION
359,167==>IDSM_SDK
360,168==>IDSM_SDK_MANUAL
361,169==>IDSM_SDK_EXAMPLE
362,16a==>IDSM_SDK_ACT
363,16b==>IDS_MESSAGE_NEED_SDK_KEY
364,16c==>IDS_MESSAGE_NEED_SDK_KEY_T
365,16d==>IDSA_msg_success_act_OK
366,16e==>IDSA_msg_success_act_SDK

UsbConfig.exe off_7C1678 字符串数组

0==>&Share devices
1==>Share...
2==>Sharing options
3==>Disable current connection
4==>Unshare
5==>Unshare all
6==>Edit description...
7==>Encryption
8==>Compression
9==>Authorization
10==>Edit all sharing options
11==>No compression
12==>Best size compression
13==>Best speed compression
14==>&Connect devices
15==>Add server...
16==>Add device...
17==>Remove device
18==>Connect
19==>Connect once
20==>Connect for this session
21==>Connect for this user
22==>Connect with password
23==>Disconnect
24==>Disconnect all
25==>Disconnect remote user
26==>RDP auto-connect
27==>&View
28==>Real devices
29==>All ports
30==>Only shared devices
31==>Show HID devices
32==>Only connected devices
33==>Show disconnected hubs
34==>Don't show empty shared ports
35==>Show USB Port location
36==>Show activity log
37==>Show sharing limitations
38==>Select &language
39==>Traffic for connected device
40==>Don't show traffic
41==>Amount of raw IRP data
42==>Amount of compressed IRP data
43==>Speed of raw IRP data
44==>Speed of compressed IRP data
45==>Speed in bits per second
46==>Speed in bytes per second
47==>&Help
48==>Online User &Manual
49==>Extend &trial period
50==>&Buy full version now
51==>Enter &registration info
52==>&Check for updates
53==>&About USB Network Gate
54==>Clear log
55==>Save to file
56==>Copy selected
57==>Select All
58==>Local USB devices
59==>Remote USB devices
60==>Devices
61==>All ports
62==>Show only shared devices
63==>Add server
64==>Enable RDP autoconnect
65==>Advanced options
66==>Optimize HID device responsiveness
67==>Always connect USB 3.0 devices via advanced virtual hub
68==>Connect all USB devices via advanced virtual hub
69==>Share
70==>Password and Retype values mismatch.
Type your password again
71==>Password can not be empty
72==>Bad host name
73==>Hostname or IP address box is empty
74==>Invalid IP address or hostname
75==>TCP port value should be in range of 1000...65535
76==>You're trying to add IP address of your computer.
It's already on the list
77==>Could not open log window
78==>Unable to share port:
{usbport}
79==>Unable to share device:
{usbdev}
80==>Authorization enabled
81==>Encryption enabled
82==>Compression enabled
83==>No isolation
84==>Per-session isolation
85==>Per-user isolation
86==>{status} - {action}
87==>Shared on port {tcpport}
88==>Shared as callback to {host_port}
89==>Connected to {client}
90==>Connected as callback to {host_port}
91==>sharing...
92==>unsharing...
93==>disconnecting...
94==>changing settings...
95==>connecting...
96==>removing...
97==>Device is not shared or computer is off
98==>disconnected
99==>connected
100==>Connected for session #{session}
101==>Connected for user '{username}'
102==>waiting for connection
103==>{status} (is in use by {client})
104==>{status} (callback to TCP port {tcpport})
105==>Unknown disconnected device
106==>Information about disconnected device is not available
107==>Enter device description here

RSA 单字节patch

修改N为素数,当N为素数时,RSA采用下面的公式计算私钥:
φ(N)=N-1
D = 1/E mod (φ(N))

py

kg && RSA N单字节修改

from Crypto.PublicKey import RSA
from Crypto.Util.number import bytes_to_long, long_to_bytes
import gmpy2
import time

newN=24526625430652694554465972267551985130408265967319107171651145135511099057267553595142281896649135923023812735290525437975465714169523377290244220610022049948152544912343554533062843572819891979867546605975009896768613639596087208832563850510220997929006473937095691499426300832024654937960436218188283088867037825521351386870990994481271084577127427841532860633751199989440503234081659099395847141259157142089683600932114665561302754963471426628318867366583194208509238891592532462741038899475803859836664375486238912901880499328294838182383249510547246714419595600730104418379895702915827840799833311217418928645741
d=1336788471219180385866799715270697329536266933720857695914336793323552280888043417334455817856031150602576545927609699321732205182012260306098117948929593396322701533895222191923653466623627174757570173742202654245044599548914712451743565833384338688106125164461385324869169271892092519315725134982811956504464029674264417869343726937258347408479167069746179687562129581187443391551942968140774920862683816951406836176961313233516539370577230204561621591367245521046050342871485206172253703235234621470872410229898307778590981332692512046439003421756790290429937218453818956962524794403395594051253560395938483804913

pubkey = '''-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwknN5/81qIoM+k1WEc/5
A+u3YzWeDNE5i5rpayiNWv4TvxX9udMz3uKF4tmDJfjuSCVUHQWAjJefwSv4ZBQ7
egXHtGzh/HVY/Geei7A1TwOroHxxgUKVkXRoPGYIVNBhrqX0CsCgYCZv7Ij6CSy4
Iamw0Gb/BnZ4Uw1AkOs6DfbGaVspeQGg7oTjSj+TKOWdK1dJ7ZoGyoVQLqxpaq41
r893XqSK5mXlbE3pFSjS6Rn8unyt57EuIcFy+x2VqjOf3KiwiGCeIaQtAtF5Pqii
KoEMoGgcDedO4C6h/LKy1oXJR7QeHQijUAn7JXE/i0I57BXyKylR6/YIV6hV+Ovm
bQIDAQAB
-----END PUBLIC KEY-----'''

new_pubkey='''-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwknN5/81qIoM+k1WEc/5
A+u3YzWeDNE5i5rpayiNWv4TvxX9udMz3uKF4tmDJfjuSCVUHQWAjJefwSv4ZBQ7
egXHtGzh/HVY/Geei7A1TwOroHxxgUKVkXRoPGYIVNBhrqX0CsCgYCZv7Ij6CSy4
Iamw0Gb/BnZ4Uw1AkOs6DfbGaVspeQGg7oTjSj+TKOWdK1dJ7ZoGyoVQLqxpaq41
r893XqSK5mXlbE3pFSjS6Rn8unyt57EuIcFy+x2VqjOf3KiwiGCeIaQtAtF5Pqii
KoEMoGgcDedO4C6h/LKy1oXJR7QeHQijUAn7JXE/40I57BXyKylR6/YIV6hV+Ovm
bQIDAQAB
-----END PUBLIC KEY-----'''


def load_pubkey(pub_key=pubkey):
    k = RSA.import_key(pub_key)
    print('n:', k.n)
    print('e:', k.e)
    return k


def modify_byte(data, position, new_byte):
    """修改字节序列中指定位置的字节"""
    data_list = bytearray(data)
    if position < len(data_list):
        data_list[position] = new_byte
    return bytes(data_list)


def find_prime_N(N_bytes, E, StartPos=-1, OnlyOne=True):
    """
    高效查找素数N'(使用gmpy2优化)

    参数:
        N_bytes: 原始模数的字节表示
        E: 公钥指数
        StartPos(option): 小端序字节起始位置
        OnlyOne(option): 是否单个

    返回:
        (N_prime, D, pos, byte_val) 或 None
    """

    if isinstance(N_bytes, int):
        N_bytes = long_to_bytes(N_bytes)
    n_len = len(N_bytes)

    total_positions = n_len
    byte_range = range(256)

    # 预计算一些值以优化性能
    E_mpz = gmpy2.mpz(E)
    start=total_positions
    if StartPos < 0:
        assert StartPos >= -total_positions, '- StartPos error!'
        start+=StartPos
        # rg = range(total_positions+StartPos, -1, -1)
    else:
        assert StartPos < total_positions, '- StartPos error!'
        start+=-1-StartPos
        # rg = range(total_positions-1-StartPos, -1, -1)
    for pos in range(start, -1, -1):
        original_byte = N_bytes[pos]

        # 尝试修改该位置的所有可能字节值
        for byte_val in byte_range:
            if byte_val == original_byte:
                continue

            # 修改字节并创建mpz对象
            modified_bytes = bytearray(N_bytes)
            modified_bytes[pos] = byte_val
            N_prime = gmpy2.mpz(bytes_to_long(modified_bytes))

            # 跳过小数字和偶数
            if N_prime < 100 or N_prime % 2 == 0:
                continue

            # 快速素性测试
            if gmpy2.is_prime(N_prime, 16):  # 使用15轮Miller-Rabin测试
                phi = N_prime - 1

                # 检查gcd(E, phi) == 1
                if gmpy2.gcd(E_mpz, phi) != 1:
                    continue

                try:
                    # 计算模逆
                    D = gmpy2.invert(E_mpz, phi)
                    # print('[-]modify N at pos:', pos)
                    if OnlyOne:
                        yield int(N_prime), int(D), pos, byte_val
                        return
                    else:
                        yield int(N_prime), int(D), pos, byte_val
                        continue
                except ZeroDivisionError:
                    continue
    return 


def pkcs1_v1_5_pad(data, key_length):
    # 计算最大数据长度(字节)
    max_data_len = key_length - 11  # 填充头占11字节
    
    # 检查数据长度
    if len(data) > max_data_len:
        raise ValueError("Data too long for RSA key size")
    
    # 构建填充结构:0x00 + 0x02 + 随机非零字节 + 0x00 + 原始数据
    padding_length = key_length - len(data) - 3
    # padding = b'\x00\x02' + os.urandom(padding_length).replace(b'\x00', b'\xff') + b'\x00'
    padding = b'\x00\x01' + b'\xff'*padding_length + b'\x00'
    return padding + data
def pkcs1_v1_5_unpad(data:bytes, key_length):

    out=b''
    # 检查数据长度
    if len(data) < 11:
        raise ValueError("Data too small")
    if data[0]!=1:
        raise ValueError("not pkcs1_v1_5 sig")
    pos=data.find(b'\x00',9)
    out=data[pos+1:key_length]
    return out

def rsa_enc_PKCS1_v1_5(msg:bytes,D:int,N:int,thunk_sz=0x80):
    if isinstance(msg,str):
        msg=msg.encode()
    out=b''
    K_SZ=len(long_to_bytes(N))
    for i in range(0,len(msg),thunk_sz):
        x=msg[i:i+thunk_sz]
        x=pkcs1_v1_5_pad(x,K_SZ)
        # imsg=int.from_bytes(x,'big')
        imsg=bytes_to_long(x)
        enc=pow(imsg, D, N)
        out+=long_to_bytes(enc)
    return out
def rsa_dec_PKCS1_v1_5(msg:bytes,E:int,N:int):
    rsa_sz=len(long_to_bytes(N))
    out=b''
    for i in range(0,len(msg),rsa_sz):
        x=msg[i:i+rsa_sz]
        x_numb=bytes_to_long(x)
        i_dec=pow(x_numb, E, N)
        dec=long_to_bytes(i_dec)
        out+=pkcs1_v1_5_unpad(dec,rsa_sz)
    return out




def count_byte_differences(bytes1, bytes2):
    return sum(b1 != b2 for b1, b2 in zip(bytes1, bytes2))


def str_to_timeStamp(s:str= "2025-08-15"):
    # 先转换为时间数组
    timeArray = time.strptime(s, "%Y-%m-%d")
    # 转换为时间戳
    timeStamp = int(time.mktime(timeArray))
    print(timeStamp)
    return timeStamp

def mk_lic_info(hid:str,license_key_code='88888-88888-88888-88888-88888',product_id='123',product_version='11',licenseName='Single License [Unlimited USB devices]',s_date="2025-08-15",nextActivation='2066-01-01',registed_name='ikun'):
    s_time=str_to_timeStamp(s_date)
    lic={
        'errorCode':'0',
        'product_id':product_id,
        'product_version':product_version,
        'licenseName':licenseName,#unknow
        'license_key_code':license_key_code,
        'key_type':'0',
        'hid':hid,
        # 'key_options':'0',
        # 'license_options':'0',
        'serverDate':s_date,
        'activationDate':s_date,
        'nextActivation':nextActivation,
        'firstActivation':s_date,
        'registed_name ':registed_name,
        'serverTime':s_time,#unknow
    }
    items=[]
    for k,v in lic.items():
        items.append(f'{k}={v}')
    ret='&'.join(items)
    return ret


def test_gen_new_n():
    # 使用gmpy2优化性能
    gmpy2.set_context(gmpy2.context())
    bs_pubkey=pubkey.encode()
    pubk = load_pubkey()
    print('n_bytes:', long_to_bytes(pubk.n).hex())

    # x = find_prime_N(pubk.n, pubk.e, False)
    # for i, t in enumerate(find_prime_N(pubk.n, pubk.e, False)):
    #     n, d, pos, bval = t
    #     print(f'{i} [{pos}] {hex(bval)}==>n:{n}')
    gen=find_prime_N(pubk.n,pubk.e)
    for i,ret in enumerate(gen):
        # ret=next(gen)
        if ret:
            newN,d,pos,_val=ret
            # print('newN:',newN)
            # print('d:',d)
            # print('newN_bytes:',long_to_bytes(newN).hex())

            rk=RSA.construct((newN,pubk.e))
            x=rk.export_key()
            # base64 bytes
            c=count_byte_differences(bs_pubkey,x)
            if c==1:
                print('newN:',newN)
                print('d:',d)
                print(f'patch n_pos:{pos},orinal_n_val:{hex(bs_pubkey[pos])},new_n_val:{hex(_val)}')
                print('[#]new PUBKEY==>')
                print(x.decode())
                print()
                break
            else:
                print('[%d]b64 not 1 bytes diff,%d'%(i,c))

        else:
            print("未找到合适的素数N',请增加尝试次数或尝试其他方法")
            break


def test_kg():
    lic_path='out_lic.bin'
    print('please input you hid,like:xxxxxxxx_xxxxxxxx_xxxxxxxx_x_xxxxxxxx')
    print('you can get it from "UNG-activation-info.activate"')
    hid=input()
    msg=mk_lic_info(hid,s_date='2025-08-15')
    # print(len(msg))
    # print(msg)
    enc=rsa_enc_PKCS1_v1_5(msg,d,newN)
    with open(lic_path,'wb') as f:
        f.write(enc)
    # print('enc:',enc.hex())
    # dec=rsa_dec_PKCS1_v1_5(enc,0x10001,newN)
    # print(dec)
    print('ok,save to==>',lic_path)
    pass

def test_dec_act(fname='ung.act'):
    enc=b''
    # fname='my_usb_lic.bin'
    with open(fname,'rb') as f:
        enc=f.read()
    dec=rsa_dec_PKCS1_v1_5(enc,0x10001,newN)
    print(dec)
    
if __name__ == '__main__':
    test_kg()
    # test_dec_act()
    pass

ps

image-20250815230314859

看日志应该是有问题,不继续分析了

Status_1400AE1E0

x_External_Status_1400A7800

image-20250815232713601

参考链接

Eltima 端口虚拟化软件授权分析-CSDN博客

PKCS1_v1_5

非对称密钥沉思系列(1):RSA专题之PKCSv1.5填充模式下的选择性密文攻击概述-腾讯云开发者社区-腾讯云

posted @ 2025-08-16 11:51  DirWangK  阅读(1222)  评论(0)    收藏  举报