ttEncrypt 虚拟机加密逆向分析(超详细附带算法源码)

EncryptorUtil 类的 ttEncrypt 函数用于对一段二进制数据加密(用于http请求body加密),函数定义如下:

public static native byte[] ttEncrypt(byte[] bArr, int i);

函数传入 byte[] 和 长度,返回一个  byte[],其 native 层代码位于 libEncryptor.so 中

IDA 反编译 so 发现并没有直接jni 绑定,因此 hook RegisterNatives 函数寻找绑定的 native 层函数地址:

Interceptor.attach(addrRegisterNatives, {
                onEnter: function (args) {
                console.log("[RegisterNatives] method_count:", args[3], DebugSymbol.fromAddress(this.returnAddress));
                var env = args[0];
                var java_class = args[1];
                var class_name = Java.vm.tryGetEnv().getClassName(java_class);
 
                var methods_ptr = ptr(args[2]);
 
                var method_count = parseInt(args[3]);
                for (var i = 0; i < method_count; i++) {
                    var name_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3));
                    var sig_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize));
                    var fnPtr_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize * 2));
 
                    var name = Memory.readCString(name_ptr);
                    var sig = Memory.readCString(sig_ptr);
                    var find_module = Process.findModuleByAddress(fnPtr_ptr);
                    console.log("[RegisterNatives] java_class:", class_name, "name:", name, "sig:", sig, "fnPtr:", fnPtr_ptr, "module_name:", find_module.name, "module_base:", find_module.base, "offset:", ptr(fnPtr_ptr).sub(find_module.base));
 
                }
            },
            onLeave: function (retval) { }
});

打印输出:
[RegisterNatives] method_count: 0x1 0x76d0acbd6c libEncryptor.so!0xd6c
[RegisterNatives] java_class: com.bytedance.frameworks.encryptor.EncryptorUtil name: ttEncrypt sig: ([BI)[B fnPtr: 0x76d0ad2d88 module_name: libEncryptor.so module_base: 0x76d0acb000 offset: 0x7d88

native 层函数位于文件偏移 0x7d88 处。

反编译代码如下:

jbyteArray __fastcall sub_7D88(JNIEnv *env, jclass thiz, jbyteArray jarray, jint size)
{
  unsigned __int64 v4; // x25
  int v5; // w24
  jbyteArray v6; // x19
  JNIEnv *v7; // x20
  JNIEnv *v8; // x23
  jbyte *v9; // x21
  __int64 v10; // x22
  __int64 v11; // [xsp+0h] [xbp-50h]
  __int64 v12; // [xsp+8h] [xbp-48h]
 
  v4 = _ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2));
  v5 = size;
  v6 = jarray;
  v7 = env;
  v8 = 0LL;
  v12 = *(_QWORD *)(v4 + 40);
  if ( jarray && (signed int)size >= 1 )
  {
    env = (JNIEnv *)(*env)->GetByteArrayElements(env, jarray, 0LL);
    v9 = (jbyte *)env;
    if ( env )
    {
      v11 = v5 + 118;
      v10 = malloc(v5 + 118);
      if ( v10 )
      {
        sub_2BD4((__int64)v9, v5, v10, (__int64)&v11);
        if ( v11 )
        {
          v8 = (JNIEnv *)((__int64 (__fastcall *)(JNIEnv *))(*v7)->NewByteArray)(v7);
          ((void (__fastcall *)(JNIEnv *, JNIEnv *, _QWORD, _QWORD, __int64))(*v7)->SetByteArrayRegion)(
            v7,
            v8,
            0LL,
            (unsigned int)v11,
            v10);
        }
        else
        {
          v8 = 0LL;
        }
        ((void (__fastcall *)(JNIEnv *, jbyteArray, jbyte *, _QWORD))(*v7)->ReleaseByteArrayElements)(v7, v6, v9, 0LL);
        env = (JNIEnv *)free(v10);
      }
      else
      {
        env = (JNIEnv *)((__int64 (__fastcall *)(JNIEnv *, jbyteArray, jbyte *, _QWORD))(*v7)->ReleaseByteArrayElements)(
                          v7,
                          v6,
                          v9,
                          0LL);
        v8 = 0LL;
      }
    }
    else
    {
      v8 = 0LL;
    }
  }
  if ( *(_QWORD *)(v4 + 40) == v12 )
    env = v8;
  return (jbyteArray)env;
}

这是补全变量类型后的反编译代码,获取传入的 jbytearray 后,转成 jbyte*,重新申请 size+118大小的内存,然后调用 sub_2BD4函数处理,如果处理的长度大于 0,则调用NewByteArray、SetByteArrayRegion 拷贝处理的结果并返回,否则返回 NULL。因此函数sub_2BD4 内部会处理加密逻辑,并且加密后的大小是 size + 118.

汇编代码对应如下:

反编译 sub_2BD4:

void __fastcall sub_2BD4(jbyte *a1, jsize a2, char *a3, int *a4)
{
  unsigned __int64 v4; // x19
  jbyte *v5; // [xsp+8h] [xbp-528h]
  jsize v6; // [xsp+10h] [xbp-520h]
  char *v7; // [xsp+18h] [xbp-518h]
  int *v8; // [xsp+20h] [xbp-510h]
  __int64 (__fastcall *v9)(__int64 (__fastcall *)(__int64), __int64); // [xsp+28h] [xbp-508h]
  __int64 *v10; // [xsp+30h] [xbp-500h]
  __int64 v11; // [xsp+510h] [xbp-20h]
  __int64 v12; // [xsp+518h] [xbp-18h]
 
  v4 = _ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2));
  v12 = *(_QWORD *)(v4 + 40);
  v5 = a1;
  v6 = a2;
  v7 = a3;
  v8 = a4;
  v9 = sub_2D1C;
  v10 = &v11;
  sub_2D28((unsigned int *)&unk_B2C0, (__int64)&v5, 0LL, (__int64)&off_21CE0, (__int64)&v9);
  *(_QWORD *)(v4 + 40);
}

实际是调用 sub_2D28,并传入了一些参数,我们看汇编代码看参数是怎么传递的:

这个函数有 5 个参数,
参数 1:地址 0xB2C0,是一个数据段的地址,看起来像是一个字节码序列
参数 2:是一个参数指针,里面保存了调用者传入的 4 个参数,即 jbyte*和 jsize char* 和 int*
参数 3:0
参数 4:地址 0x21CE0,像是一个地址数组
参数 5:是一个地址,里面保存了函数 sub_2D1C 和 sp +0x510

函数 sub_2D28 反编译代码:

unsigned int *__fastcall sub_2D28(unsigned int *result, __int64 a2, __int64 a3, __int64 a4, __int64 a5)
{
  __int64 v5; // x19
  unsigned int *v6; // x20
  unsigned int **v7; // x21
  _QWORD *v8; // x4
  _QWORD *v9; // x5
  signed __int64 v10; // x1
  unsigned __int64 *v11; // x6
  unsigned __int64 *v12; // x7
  unsigned int v13; // w12
  unsigned int v14; // w16
  unsigned int v15; // w15
  unsigned int v16; // w14
  unsigned int v17; // w10
  unsigned int v18; // w11
  unsigned __int64 v19; // x9
  __int64 v20; // x8
  unsigned int v21; // w13
  unsigned int v22; // w18
  unsigned int v23; // w17
  __int64 v24; // x11
  bool v25; // zf
  int v26; // w11
  signed __int64 v27; // x8
  signed int v28; // w10
  unsigned int *v29; // x11
  unsigned int v30; // w13
  unsigned int *v31; // x9
  signed __int64 v32; // x8
  signed int v33; // w11
  signed int v34; // w9
  unsigned __int64 v35; // x9
  _QWORD *v36; // x10
  __int64 v37; // x11
  char v38; // w9
  unsigned __int64 v39; // x8
  unsigned __int64 v40; // x9
  int v41; // w11
  int v42; // w10
  int v43; // w11
  int v44; // w10
  int v45; // w8
  int v46; // w12
  signed __int64 v47; // x9
  unsigned int *v48; // x10
  signed __int64 v49; // x12
  signed __int64 v50; // x10
  _BOOL4 v51; // w11
  bool v52; // nf
  signed int v53; // w8
  _BOOL4 v54; // w9
  signed int v55; // w10
  int v56; // w13
  unsigned int v57; // w10
  unsigned __int64 v58; // t2
  int v59; // w10
  int v60; // w11
  unsigned int *v61; // x13
  signed __int64 v62; // x11
  signed int v63; // w9
  signed __int64 v64; // x8
  signed int v65; // w11
  signed int v66; // w9
  unsigned int v67; // w11
  unsigned __int64 v68; // t2
  int v69; // w10
  unsigned int v70; // w11
  unsigned int v71; // w12
  __int64 v72; // x9
  __int64 v73; // x8
  int v74; // w13
  unsigned __int64 v75; // t2
  int v76; // w11
  __int64 v77; // x11
  char v78; // w9
  _DWORD *v79; // x10
  int v80; // w11
  char v81; // w9
  int v82; // w8
  unsigned int v83; // w9
  int v84; // w11
  char v85; // w9
  signed int v86; // w12
  unsigned __int8 v87; // vf
  _BOOL4 v88; // w13
  int v89; // w11
  signed __int64 v90; // x8
  _BOOL4 v91; // w13
  int v92; // w11
  signed __int64 v93; // x9
  __int64 v94; // x9
  unsigned __int64 v95; // x8
  unsigned __int64 v96; // x10
  int v97; // w9
  signed __int64 v98; // x9
  signed int v99; // w8
  unsigned __int64 v100; // x9
  unsigned __int64 v101; // x8
  unsigned __int64 v102; // x10
  int v103; // w9
  unsigned int v104; // w8
  int v105; // w10
  int v106; // w9
  signed __int64 v107; // x9
  __int64 v108; // x8
  signed __int64 v109; // x9
  unsigned __int64 v110; // x8
  int v111; // w11
  __int64 v112; // x8
  int v113; // w11
  signed __int64 v114; // x11
  int v115; // w8
  signed __int64 v116; // x9
  __int64 v117; // x8
  unsigned int v118; // w11
  unsigned int v119; // w12
  __int64 v120; // x9
  __int64 v121; // x8
  unsigned __int64 v122; // x8
  unsigned __int64 v123; // x9
  unsigned __int64 v124; // x8
  _QWORD *v125; // x24
  _QWORD *v126; // x26
  unsigned __int64 *v127; // ST08_8
  unsigned __int64 *v128; // x23
  signed int v129; // w12
  _BOOL4 v130; // w13
  int v131; // w11
  signed __int64 v132; // x8
  unsigned __int64 v133; // x8
  unsigned __int64 v134; // x8
  bool v135; // cf
  _QWORD *v136; // x8
  unsigned int *v137; // x8
  __int64 v138; // x9
  __int64 v139; // x8
  unsigned int *v140; // x13
  signed __int64 v141; // x8
  signed __int64 v142; // x9
  signed int v143; // w12
  signed int v144; // w10
  __int64 v145; // x9
  __int64 v146; // x8
  signed __int64 v147; // x9
  __int64 v148; // x8
  __int64 v149; // x8
  signed int v150; // w11
  unsigned int *v151; // x8
  _BOOL4 v152; // w13
  int v153; // w12
  signed __int64 v154; // x9
 
  v6 = *(unsigned int **)a5;
  v5 = *(_QWORD *)(a5 + 8);
  *(_QWORD *)(v5 - 56) = 0LL;
  *(_QWORD *)(v5 - 304) = 0LL;
  v7 = (unsigned int **)(v5 - 312);
  v8 = (_QWORD *)(v5 - 272);
  v9 = (_QWORD *)(v5 - 264);
  *(_QWORD *)(v5 - 72) = (v5 - 328) & 0xFFFFFFFFFFFFFFF0LL;
  *(_QWORD *)(v5 - 32) = 0LL;
  *(_QWORD *)(v5 - 272) = a2;
  *(_QWORD *)(v5 - 264) = a3;
  *(_QWORD *)(v5 - 256) = a4;
  *(_QWORD *)(v5 - 248) = v6;
  *(_QWORD *)(v5 - 312) = result;
  *(_QWORD *)(v5 - 8) = result;
  if ( result )
  {
    v10 = 0LL;
    v11 = (unsigned __int64 *)(v5 - 40);
    v12 = (unsigned __int64 *)(v5 - 48);
    while ( 1 )
    {
      v13 = *result;
      if ( v10 == 2 )
      {
        v10 = 3LL;
        *(_QWORD *)(v5 - 32) = 3LL;
      }
      v14 = v13 & 0x10000000;
      v15 = v13 & 0x20000000;
      v16 = v13 & 0x40000000;
      v17 = (v13 >> 11) & 2 | (v13 >> 31) | (v13 >> 11) & 4 | (v13 >> 11) & 8 | (v13 >> 11) & 0x10;
      v18 = ((v13 & 0x10000000) >> 26) & 0xFFFFFFFC | (v13 >> 26) & 3 | ((v13 & 0x20000000) >> 26);
      v19 = (v13 >> 21) & 0x1F;
      v20 = (v13 >> 16) & 0x1F;
LABEL_7:
      v21 = v13 & 0x80000000;
      v22 = v13 & 0x4000000;
      while ( 2 )
      {
        v23 = v13 & 0x8000000;
        v24 = v18 | (v16 >> 26);
        switch ( v17 )
        {
          case 0u:
          case 2u:
          case 8u:
          case 0x12u:
          case 0x1Fu:
          case 0x21u:
          case 0x22u:
          case 0x27u:
          case 0x2Bu:
          case 0x30u:
          case 0x31u:
          case 0x33u:
          case 0x37u:
            v25 = v17 == 55;
            if ( v17 <= 0x37 )
            {
              v26 = (v13 >> 6) & 0x3F;
              v13 = (unsigned __int16)(v13 & 0xF000) | (v22 >> 20);
              v18 = v13 | v26 | (v23 >> 20) | (v14 >> 20) | (v15 >> 20) | (v16 >> 20) | (v21 >> 20);
              v19 = (unsigned __int64)v7[(unsigned int)v19 + 1] + (signed __int16)v18;
              switch ( v13 )
              {
                case 0u:
                  v19 = *(signed __int16 *)v19;
                  goto LABEL_236;
                case 2u:
                  v19 = *(_QWORD *)v19;
                  goto LABEL_236;
                case 8u:
                  v19 = *(char *)v19;
                  goto LABEL_236;
                case 0x12u:
                  v27 = (signed __int64)&v7[(unsigned int)v20];
                  v19 = *(_DWORD *)(v27 + 8) & (unsigned int)(-1 << (32 - 8 * (v19 & 3))) | (*(_DWORD *)(v19 & 0xFFFFFFFFFFFFFFFCLL) >> 8 * (v19 & 3));
                  goto LABEL_237;
                case 0x21u:
                  v19 = *(unsigned __int8 *)v19;
                  goto LABEL_236;
                case 0x22u:
                  v27 = (signed __int64)&v7[(unsigned int)v20];
                  v19 = *(_QWORD *)(v27 + 8) & (-1LL << (64 - 8 * ((unsigned __int8)v19 & 7u))) | (*(_QWORD *)(v19 & 0xFFFFFFFFFFFFFFF8LL) >> 8 * ((unsigned __int8)v19 & 7u));
                  goto LABEL_237;
                case 0x27u:
                case 0x31u:
                  v27 = (signed __int64)&v7[(unsigned int)v20];
                  v19 = *(_QWORD *)(v27 + 8) & (0xFFFFFFFFFFFFFFuLL >> 8 * ((unsigned __int8)v19 & 7u)) | (*(_QWORD *)(v19 & 0xFFFFFFFFFFFFFFF8LL) << (56 - 8 * ((unsigned __int8)v19 & 7u)));
                  goto LABEL_237;
                case 0x2Bu:
                  v19 = *(signed int *)v19;
                  goto LABEL_236;
                case 0x30u:
                  v19 = *(unsigned __int16 *)v19;
                  goto LABEL_236;
                case 0x33u:
                  v19 = *(unsigned int *)v19;
                  goto LABEL_236;
                case 0x37u:
                  v27 = (signed __int64)&v7[(unsigned int)v20];
                  v19 = *(_DWORD *)(v27 + 8) & (0xFFFFFFu >> 8 * (v19 & 3)) | (*(_DWORD *)(v19 & 0xFFFFFFFFFFFFFFFCLL) << (24 - 8 * (v19 & 3)));
                  goto LABEL_237;
                case 0x38u:
                  continue;
                case 0x39u:
                case 0x3Bu:
                case 0x3Cu:
                case 0x3Du:
                case 0x3Eu:
                case 0x3Fu:
                  goto LABEL_218;
                case 0x3Au:
                  goto LABEL_7;
                default:
                  goto def_4104;
              }
            }
            goto def_4104;
          case 3u:
          case 5u:
          case 0xFu:
          case 0x1Au:
          case 0x2Cu:
          case 0x2Du:
          case 0x3Au:
          case 0x3Fu:
            if ( !v10 )
            {
              v28 = 0;
              v29 = 0LL;
              v30 = (signed int)((v13 & 0xF000 | (v22 >> 20) | (v13 >> 6) & 0x3F | (v23 >> 20) | (v14 >> 20) | (v15 >> 20) | (v16 >> 20) | (v21 >> 20)) << 16) >> 14;
              switch ( v13 & 0x3F )
              {
                case 3u:
                case 0x1Au:
                case 0x2Du:
                case 0x3Fu:
                  goto LABEL_15;
                case 5u:
                case 0xFu:
                case 0x2Cu:
                case 0x3Au:
                  v29 = v7[(unsigned int)v20 + 1];
LABEL_15:
                  v31 = v7[(unsigned int)v19 + 1];
                  v32 = (signed __int64)result + (signed int)(v30 + 4);
                  switch ( (_DWORD)v32 )
                  {
                    case 0:
                      if ( (signed __int64)v31 <= 0 )
                        goto LABEL_112;
                      goto LABEL_17;
                    case 2:
                      if ( v31 == v29 )
                        goto LABEL_112;
                      goto LABEL_17;
                    case 0xC:
                      if ( v31 == v29 )
                        goto LABEL_17;
                      goto LABEL_112;
                    case 0x17:
                      v25 = v31 == 0LL;
                      v52 = (signed __int64)v31 < 0;
                      v34 = 1;
                      if ( !v52 && !v25 )
                        goto LABEL_109;
                      goto LABEL_113;
                    case 0x29:
                      v25 = v31 == v29;
                      v34 = 1;
                      if ( !v25 )
                        goto LABEL_113;
                      goto LABEL_109;
                    case 0x2A:
                      v87 = __OFSUB__(v31, 1LL);
                      v52 = (signed __int64)v31 - 1 < 0;
                      v34 = 1;
                      if ( !(v52 ^ v87) )
                        goto LABEL_113;
                      goto LABEL_109;
                    case 0x37:
                      v25 = v31 == v29;
                      v34 = 1;
                      if ( v25 )
                        goto LABEL_113;
LABEL_109:
                      v33 = 0;
                      goto LABEL_110;
                    case 0x3C:
                      if ( (signed __int64)v31 < 1 )
                      {
LABEL_17:
                        v33 = 0;
                        v34 = 0;
LABEL_110:
                        v28 = 0;
                        v86 = 1;
                      }
                      else
                      {
LABEL_112:
                        v34 = 0;
LABEL_113:
                        v86 = 0;
                        v28 = 0;
                        v32 = (signed __int64)(result + 2);
                        v33 = 1;
                      }
                      goto LABEL_114;
                    default:
                      goto def_4104;
                  }
                  goto def_4104;
                case 0x11u:
                  v28 = 31;
                  goto LABEL_95;
                case 0x2Au:
LABEL_95:
                  v33 = 0;
                  v34 = 0;
                  v86 = 1;
                  v32 = *(_QWORD *)(v5 - 8) + v30;
LABEL_114:
                  v88 = v34 != 0;
                  v89 = v33 & v88;
                  *(_QWORD *)(v5 - 24) = v32;
                  if ( v89 & 1 || !v34 || v86 & v88 )
                  {
                    v90 = 1LL;
                    if ( !v89 )
                      v90 = 2LL;
                    *(_QWORD *)(v5 - 32) = v90;
                  }
                  goto LABEL_120;
                default:
                  goto def_4104;
              }
            }
            goto def_4104;
          case 4u:
          case 0x20u:
          case 0x38u:
          case 0x3Eu:
            v41 = v13 & 0x3F;
            v42 = v13 & 0xF000 | (v22 >> 20) | (v13 >> 6) & 0x3F | (v23 >> 20) | (v14 >> 20) | (v15 >> 20) | (v16 >> 20) | (v21 >> 20);
            if ( v41 > 55 )
            {
              if ( v41 == 56 )
              {
                *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19) ^ (unsigned __int16)v42;
              }
              else if ( v41 == 62 )
              {
                *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19) | (unsigned __int16)v42;
              }
            }
            else
            {
              if ( v41 == 4 )
              {
                LODWORD(v19) = (v13 & 0xF000 | (v22 >> 20) | (v13 >> 6) & 0x3F | (v23 >> 20) | (v14 >> 20) | (v15 >> 20) | (v16 >> 20) | (v21 >> 20)) << 16;
                goto LABEL_92;
              }
              if ( v41 == 32 )
                *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19) & (unsigned __int16)v42;
            }
            goto def_4104;
          case 0xAu:
          case 0xBu:
          case 0xEu:
          case 0x14u:
          case 0x16u:
          case 0x24u:
          case 0x36u:
          case 0x3Bu:
            v35 = (unsigned __int64)v7[(unsigned int)v19 + 1]
                + (v13 & 0xF000 | (v22 >> 20) | (v13 >> 6) & 0x3F | (v23 >> 20) | (v14 >> 20) | (v15 >> 20) | (v16 >> 20) | (v21 >> 20));
            switch ( v13 & 0x3F )
            {
              case 0xAu:
                v36 = (_QWORD *)(v35 & 0xFFFFFFFFFFFFFFF8LL);
                v37 = *(_QWORD *)(v35 & 0xFFFFFFFFFFFFFFF8LL);
                v38 = 8 * (v35 & 7);
                v39 = (unsigned __int64)v7[(unsigned int)v20 + 1] >> (56 - v38);
                v40 = v37 & (-256LL << v38);
                goto LABEL_83;
              case 0xBu:
                v36 = (_QWORD *)(v35 & 0xFFFFFFFFFFFFFFF8LL);
                v77 = *(_QWORD *)(v35 & 0xFFFFFFFFFFFFFFF8LL);
                v78 = 8 * (v35 & 7);
                v39 = (_QWORD)v7[(unsigned int)v20 + 1] << v78;
                v40 = v77 & (0xFFFFFFFFFFFFFFFFLL >> (64 - v78));
LABEL_83:
                *v36 = v40 | v39;
                goto def_4104;
              case 0xEu:
                *(_BYTE *)v35 = v7[(unsigned int)v20 + 1];
                goto def_4104;
              case 0x14u:
                *(_WORD *)v35 = v7[(unsigned int)v20 + 1];
                goto def_4104;
              case 0x16u:
                v79 = (_DWORD *)(v35 & 0xFFFFFFFFFFFFFFFCLL);
                v80 = *(_DWORD *)(v35 & 0xFFFFFFFFFFFFFFFCLL);
                v81 = 8 * (v35 & 3);
                v82 = LODWORD(v7[(unsigned int)v20 + 1]) >> (24 - v81);
                v83 = v80 & (-256 << v81);
                goto LABEL_88;
              case 0x24u:
                v79 = (_DWORD *)(v35 & 0xFFFFFFFFFFFFFFFCLL);
                v84 = *(_DWORD *)(v35 & 0xFFFFFFFFFFFFFFFCLL);
                v85 = 8 * (v35 & 3);
                v82 = LODWORD(v7[(unsigned int)v20 + 1]) << v85;
                v83 = v84 & (0xFFFFFFFF >> (32 - v85));
LABEL_88:
                *v79 = v83 | v82;
                break;
              case 0x36u:
                *(_DWORD *)v35 = v7[(unsigned int)v20 + 1];
                break;
              case 0x3Bu:
                *(_QWORD *)v35 = v7[(unsigned int)v20 + 1];
                break;
              default:
                goto def_4104;
            }
            goto def_4104;
          case 0xDu:
          case 0x15u:
          case 0x1Bu:
          case 0x28u:
            v43 = v13 & 0x3F;
            v44 = v13 & 0xF000 | (v22 >> 20) | (v13 >> 6) & 0x3F | (v23 >> 20) | (v14 >> 20) | (v15 >> 20) | (v16 >> 20) | (v21 >> 20);
            if ( v43 == 13 || v43 == 40 )
            {
              *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19)
                                                              + (signed __int16)v44;
            }
            else if ( v43 == 21 )
            {
              *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) = *(signed int *)(v5 - 304 + 8 * v19)
                                                              + (signed __int64)(signed __int16)v44;
            }
            goto def_4104;
          case 0x10u:
            v56 = v13 & 0xFFF;
            if ( v56 > 2639 )
            {
              if ( v56 > 3727 )
              {
                if ( v56 != 3728 )
                {
                  if ( v56 == 3792 )
                  {
                    LODWORD(v24) = v24 | 0x20;
                  }
                  else
                  {
                    if ( v56 != 3984 )
                      goto def_4104;
                    v17 |= 0x20u;
                  }
                }
                if ( (signed int)(v24 + v17) <= 63 )
                {
                  v19 = (unsigned __int64)v7[(unsigned int)v19 + 1];
                  if ( v17 != 63 )
                    v19 = (v19 >> v24) & ~(-1LL << ((unsigned __int8)v17 + 1));
LABEL_236:
                  v27 = (signed __int64)&v7[(unsigned int)v20];
LABEL_237:
                  *(_QWORD *)(v27 + 8) = v19;
                  goto def_4104;
                }
                goto def_4104;
              }
              if ( v56 != 2640 )
              {
                if ( v56 == 2768 && v17 >= (unsigned int)v24 )
                  *(_QWORD *)(v5 - 304 + 8 * v20) = *(_DWORD *)(v5 - 304 + 8 * v20) & (-1 << v17) | ((*(_DWORD *)(v5 - 304 + 8 * v19) & ~(-1 << (1 - v24 + v17))) << v24) | *(_DWORD *)(v5 - 304 + 8 * v20) & ~(-1 << v24);
                goto def_4104;
              }
            }
            else
            {
              if ( v56 > 655 )
              {
                if ( v56 != 656 && v56 != 1680 )
                {
                  if ( v56 != 2256 )
                    goto def_4104;
                  goto LABEL_163;
                }
                v97 = v13 & 0x7C000FFF;
                if ( (signed int)(v13 & 0x7C000FFF) <= 1275069071 )
                {
                  if ( v97 == 201328272 )
                  {
                    v134 = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20);
                    *(_QWORD *)(v5 - 304 + 8LL * v17) = __ROR8__(
                                                          (v134 << 16) & 0xFFFF0000FFFF0000LL | (v134 >> 16) & 0xFFFF0000FFFFLL,
                                                          32);
                  }
                  else if ( v97 == 939524752 )
                  {
                    *(_QWORD *)(v5 - 304 + 8LL * v17) = *(char *)(v5 - 304 + 8 * v20);
                  }
                  goto def_4104;
                }
                if ( v97 == 1275069072 )
                {
                  *(_QWORD *)(v5 - 304 + 8LL * v17) = *(signed __int16 *)(v5 - 304 + 8 * v20);
                  goto def_4104;
                }
                if ( v97 == 1409287824 )
                {
                  v133 = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20);
                  *(_QWORD *)(v5 - 304 + 8LL * v17) = (v133 << 8) & 0xFF00FF00FF00FF00LL | (v133 >> 8) & 0xFF00FF00FF00FFLL;
                  goto def_4104;
                }
                if ( v97 != 1946157712 )
                  goto def_4104;
                v98 = v5 - 304;
                v99 = (*(_DWORD *)(v5 - 304 + 8 * v20) << 8) & 0xFF00FF00 | (*(_DWORD *)(v5 - 304 + 8 * v20) >> 8) & 0xFF00FF;
                goto LABEL_372;
              }
              if ( v56 == 16 )
              {
                if ( v17 + (unsigned int)v24 > 0x1F )
                  goto def_4104;
                LODWORD(v19) = v7[(unsigned int)v19 + 1];
                if ( v17 != 31 )
                  LODWORD(v19) = ((unsigned int)v19 >> v24) & ~(-2 << v17);
LABEL_92:
                v19 = (signed int)v19;
                goto LABEL_236;
              }
              if ( v56 != 144 )
                goto def_4104;
              LODWORD(v24) = v24 | 0x20;
LABEL_163:
              v17 |= 0x20u;
            }
            if ( (signed int)v17 >= (signed int)v24 )
              *(_QWORD *)(v5 - 304 + 8 * v20) = *(_QWORD *)(v5 - 304 + 8 * v20) & (-1LL << v17) | ((*(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19) & ~(-1LL << ((unsigned __int8)v17 + 1 - (unsigned __int8)v24))) << v24) | *(_QWORD *)(v5 - 304 + 8 * v20) & ~(-1LL << v24);
            goto def_4104;
          case 0x11u:
          case 0x2Au:
            if ( v10 )
              goto def_4104;
            v45 = v13 & 0x3F;
            v46 = v13 & 0x3FFF000 | (v22 >> 20) | (v13 >> 6) & 0x3F | (v23 >> 20) | (v14 >> 20) | (v15 >> 20) | (v16 >> 20) | (v21 >> 20);
            if ( v45 == 17 )
            {
              v53 = 31;
LABEL_129:
              v51 = 0;
              v55 = 0;
              v49 = *(_QWORD *)(v5 - 8) + (unsigned int)(v46 * 4);
              v54 = 1;
              goto LABEL_130;
            }
            if ( v45 == 42 )
            {
              v53 = 0;
              goto LABEL_129;
            }
            if ( v45 != 26 )
              goto def_4104;
            v47 = (signed __int64)v7[(unsigned int)v19 + 1];
            v48 = &result[v46];
            v49 = (signed __int64)(result + 2);
            v50 = (signed __int64)(v48 + 1);
            v51 = v47 < 1;
            v25 = v47 == 0;
            v52 = v47 < 0;
            v53 = 0;
            v54 = v47 > 0;
            if ( !v52 && !v25 )
              v49 = v50;
            v55 = 1;
LABEL_130:
            v91 = v55 != 0;
            v92 = v51 && v91;
            *(_QWORD *)(v5 - 24) = v49;
            if ( v92 & 1 || !v55 || v54 && v91 )
            {
              v93 = 1LL;
              if ( !v92 )
                v93 = 2LL;
              *(_QWORD *)(v5 - 32) = v93;
            }
LABEL_136:
            if ( v53 >= 1 )
            {
LABEL_137:
              v7[v53 + 1] = result + 2;
              *(_QWORD *)(v5 - 16) = result + 2;
            }
            goto def_4104;
          case 0x17u:
            LODWORD(v20) = v13 & 0x1F003F;
            HIDWORD(v58) = (v13 & 0x1F003F) - 65559;
            LODWORD(v58) = (v13 & 0x1F003F) - 65559;
            v57 = v58 >> 16;
            if ( v57 > 0x1A || !((1 << v57) & 0x4842861) || v10 )
              goto def_4104;
            v59 = v13 & 0x1F003F;
            v13 = (signed int)((v13 & 0xF000 | (v22 >> 20) | (v13 >> 6) & 0x3F | (v23 >> 20) | (v14 >> 20) | (v15 >> 20) | (v16 >> 20) | (v21 >> 20)) << 16) >> 14;
            if ( (signed int)(v20 & 0x1FFFFF) <= 65558 )
            {
              v60 = v59 - 3;
              v28 = 0;
              v61 = result;
              switch ( v60 )
              {
                case 0:
                case 23:
                case 42:
                case 60:
                  goto LABEL_50;
                case 2:
                case 12:
                case 41:
                case 55:
                  goto LABEL_51;
                case 14:
                  v28 = 31;
                  goto LABEL_279;
                case 39:
LABEL_279:
                  v65 = 0;
                  v66 = 0;
                  v64 = *(_QWORD *)(v5 - 8) + v13;
                  goto LABEL_290;
                default:
                  goto def_4104;
              }
              goto def_4104;
            }
            if ( v59 > 917526 )
            {
              if ( v59 > 1572886 )
              {
                if ( v59 != 1769495 )
                {
                  v25 = v59 == 1572887;
LABEL_218:
                  if ( !v25 )
                    goto def_4104;
                }
              }
              else if ( v59 != 917527 && v59 != 1245207 )
              {
                goto def_4104;
              }
            }
            else if ( v59 > 458774 )
            {
              if ( v59 != 458775 && v59 != 786455 )
                goto def_4104;
            }
            else if ( v59 != 65559 && v59 != 393239 )
            {
              goto def_4104;
            }
LABEL_50:
            v61 = 0LL;
LABEL_51:
            v62 = (signed __int64)v7[(unsigned int)v19 + 1];
            v63 = v20 & 0x1FFFFF;
            v64 = (signed __int64)result + (signed int)(v13 + 4);
            if ( v63 > 65558 )
            {
              if ( v63 > 917526 )
              {
                if ( v63 > 1572886 )
                {
                  if ( v63 == 1572887 )
                  {
                    v66 = 1;
                    if ( v62 & 0x8000000000000000LL )
                      goto LABEL_294;
                    goto LABEL_288;
                  }
                  if ( v63 == 1769495 )
                  {
                    v28 = 31;
                    v66 = 1;
                    if ( v62 & 0x8000000000000000LL )
                    {
LABEL_311:
                      v65 = 0;
LABEL_290:
                      v129 = 1;
LABEL_301:
                      v130 = v66 != 0;
                      v131 = v65 & v130;
                      *(_QWORD *)(v5 - 24) = v64;
                      if ( !(v131 & 1) && v66 && !(v129 & v130) )
                      {
LABEL_120:
                        if ( v28 < 1 )
                          goto def_4104;
LABEL_121:
                        v7[v28 + 1] = result + 2;
                        *(_QWORD *)(v5 - 16) = result + 2;
                        goto def_4104;
                      }
                      v132 = 1LL;
                      if ( !v131 )
                        v132 = 2LL;
                      *(_QWORD *)(v5 - 32) = v132;
                      if ( v28 >= 1 )
                        goto LABEL_121;
                      goto def_4104;
                    }
                    goto LABEL_300;
                  }
                }
                else
                {
                  if ( v63 == 917527 )
                  {
                    v28 = 31;
                    v66 = 1;
                    if ( !(v62 & 0x8000000000000000LL) )
                      goto LABEL_311;
                    goto LABEL_300;
                  }
                  if ( v63 == 1245207 )
                  {
                    if ( v62 & 0x8000000000000000LL )
                    {
LABEL_298:
                      v28 = 0;
LABEL_299:
                      v66 = 0;
LABEL_300:
                      v129 = 0;
                      v64 = (signed __int64)(result + 2);
                      v65 = 1;
                      goto LABEL_301;
                    }
LABEL_54:
                    v65 = 0;
                    v66 = 0;
LABEL_289:
                    v28 = 0;
                    goto LABEL_290;
                  }
                }
              }
              else if ( v63 > 458774 )
              {
                if ( v63 == 458775 )
                {
                  v66 = 1;
                  if ( !(v62 & 0x8000000000000000LL) )
                  {
LABEL_294:
                    v28 = 0;
                    goto LABEL_300;
                  }
LABEL_288:
                  v65 = 0;
                  goto LABEL_289;
                }
                if ( v63 == 786455 )
                {
                  v28 = 31;
                  if ( v62 & 0x8000000000000000LL )
                    goto LABEL_299;
LABEL_227:
                  v65 = 0;
                  v66 = 0;
                  goto LABEL_290;
                }
              }
              else
              {
                if ( v63 == 65559 )
                {
                  if ( !(v62 & 0x8000000000000000LL) )
                    goto LABEL_298;
                  goto LABEL_54;
                }
                if ( v63 == 393239 )
                {
                  v28 = 31;
                  if ( !(v62 & 0x8000000000000000LL) )
                    goto LABEL_299;
                  goto LABEL_227;
                }
              }
            }
            else
            {
              switch ( v63 )
              {
                case 3:
                  if ( v62 > 0 )
                    goto LABEL_54;
                  goto LABEL_298;
                case 5:
                  if ( (unsigned int *)v62 == v61 )
                    goto LABEL_298;
                  goto LABEL_54;
                case 15:
                  if ( (unsigned int *)v62 != v61 )
                    goto LABEL_298;
                  goto LABEL_54;
                case 26:
                  v66 = 1;
                  if ( v62 > 0 )
                    goto LABEL_288;
                  goto LABEL_294;
                case 44:
                  v66 = 1;
                  if ( (unsigned int *)v62 != v61 )
                    goto LABEL_294;
                  goto LABEL_288;
                case 45:
                  v66 = 1;
                  if ( v62 >= 1 )
                    goto LABEL_294;
                  goto LABEL_288;
                case 58:
                  v66 = 1;
                  if ( (unsigned int *)v62 != v61 )
                    goto LABEL_288;
                  goto LABEL_294;
                case 63:
                  if ( v62 >= 1 )
                    goto LABEL_298;
                  goto LABEL_54;
                default:
                  goto def_4104;
              }
            }
            goto def_4104;
          case 0x23u:
            *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19) < (unsigned __int64)(signed __int16)(v13 & 0xF000 | (v22 >> 20) | (v13 >> 6) & 0x3F | (v23 >> 20) | (v14 >> 20) | (v15 >> 20) | (v16 >> 20) | (v21 >> 20));
            goto def_4104;
          case 0x29u:
            HIDWORD(v68) = (v13 & 0xFFF) - 425;
            LODWORD(v68) = (v13 & 0xFFF) - 425;
            v67 = v68 >> 6;
            if ( v67 > 0x1A )
              goto def_4104;
            if ( !((1 << v67) & 0x4000032) )
            {
              if ( v67 != 2 )
                goto def_4104;
              v76 = v13 & 0xFFF;
              if ( v76 > 2158 )
              {
                if ( v76 > 2542 )
                {
LABEL_67:
                  if ( v76 == 2543 )
                    goto LABEL_159;
                  if ( v76 == 2671 )
                    goto LABEL_250;
                  if ( v76 != 3375 )
                    goto def_4104;
LABEL_256:
                  v114 = v5 - 304;
                  v115 = *(_DWORD *)(v5 - 304 + 8 * v20) + *(_DWORD *)(v5 - 304 + 8 * v19);
                }
                else
                {
LABEL_157:
                  if ( v76 != 2159 )
                  {
                    if ( v76 != 2415 )
                      goto def_4104;
LABEL_159:
                    *(_QWORD *)(v5 - 304 + 8LL * v17) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20)
                                                      + *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19);
                    goto def_4104;
                  }
LABEL_250:
                  v114 = v5 - 304;
                  v115 = *(_DWORD *)(v5 - 304 + 8 * v19) - *(_DWORD *)(v5 - 304 + 8 * v20);
                }
LABEL_257:
                *(_QWORD *)(v114 + 8LL * v17) = v115;
                goto def_4104;
              }
              if ( v76 > 942 )
              {
LABEL_258:
                if ( v76 == 943 || v76 == 1775 )
                  *(_QWORD *)(v5 - 304 + 8LL * v17) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19)
                                                    - *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20);
              }
              else
              {
                if ( v76 == 495 )
                  goto LABEL_256;
LABEL_222:
                if ( v76 == 553 )
                  *(_QWORD *)(v5 - 304 + 8LL * v17) = *(signed int *)(v5 - 304 + 8 * v20)
                                                    * (signed __int64)*(signed int *)(v5 - 304 + 8 * v19);
              }
              goto def_4104;
            }
            v69 = v13 & 0xFFF;
            if ( v69 <= 1902 )
            {
              if ( v69 > 744 )
              {
                if ( v69 != 745 )
                {
                  if ( v69 == 1327 )
                    goto LABEL_389;
                  if ( v69 != 1839 )
                    goto def_4104;
LABEL_187:
                  v100 = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19);
                  v101 = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20);
                  v102 = (unsigned __int128)((signed __int64)v101 * (signed __int128)(signed __int64)v100) >> 64;
LABEL_403:
                  *v12 = v101 * v100;
                  *v11 = v102;
                  goto def_4104;
                }
                v118 = *(_DWORD *)v11;
                v119 = *(_DWORD *)v12;
                v120 = *(signed int *)(v5 - 304 + 8 * v19);
                v121 = *(signed int *)(v5 - 304 + 8 * v20);
              }
              else
              {
                if ( v69 == 431 )
                  goto LABEL_391;
                if ( v69 != 489 )
                {
                  if ( v69 != 681 )
                    goto def_4104;
                  v70 = *(_DWORD *)v11;
                  v71 = *(_DWORD *)v12;
                  v72 = *(unsigned int *)(v5 - 304 + 8 * v19);
                  v73 = *(unsigned int *)(v5 - 304 + 8 * v20);
                  goto LABEL_274;
                }
                v118 = *(_DWORD *)v11;
                v119 = *(_DWORD *)v12;
                v120 = *(unsigned int *)(v5 - 304 + 8 * v19);
                v121 = *(unsigned int *)(v5 - 304 + 8 * v20);
              }
              v122 = (v119 | ((unsigned __int64)v118 << 32)) - v121 * v120;
LABEL_277:
              v123 = (unsigned int)v122;
              v124 = v122 >> 32;
LABEL_393:
              *v12 = v123;
              *v11 = v124;
              goto def_4104;
            }
            if ( v69 <= 2350 )
            {
              if ( v69 == 1903 )
                goto LABEL_402;
              if ( v69 != 2089 )
              {
                if ( v69 != 2223 )
                  goto def_4104;
                goto LABEL_153;
              }
              v70 = *(_DWORD *)v11;
              v71 = *(_DWORD *)v12;
              v72 = *(signed int *)(v5 - 304 + 8 * v19);
              v73 = *(signed int *)(v5 - 304 + 8 * v20);
LABEL_274:
              v122 = (v71 | ((unsigned __int64)v70 << 32)) + v73 * v72;
              goto LABEL_277;
            }
            if ( v69 == 2351 )
              goto LABEL_328;
            if ( v69 == 2863 )
              goto LABEL_397;
            if ( v69 != 3503 )
              goto def_4104;
            goto LABEL_191;
          case 0x2Fu:
            v74 = v13 & 0xFFF;
            HIDWORD(v75) = v74 - 111;
            LODWORD(v75) = v74 - 111;
            switch ( (unsigned int)(v75 >> 6) )
            {
              case 0u:
              case 3u:
              case 9u:
              case 0xFu:
              case 0x2Eu:
              case 0x3Du:
                goto def_4104;
              case 1u:
              case 0xBu:
              case 0x34u:
                v113 = v13 & 0x4000FFF;
                if ( (v13 & 0x4000FFF) == 67109679 )
                  v74 = 67109679;
                goto LABEL_336;
              case 2u:
                v135 = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19) >= *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20);
                v136 = (_QWORD *)(v5 - 304 + 8LL * v17);
                if ( !v135 )
                  goto LABEL_355;
                goto LABEL_321;
              case 6u:
              case 0xDu:
              case 0x1Au:
              case 0x20u:
              case 0x24u:
              case 0x26u:
              case 0x28u:
              case 0x33u:
                v76 = v13 & 0xFFF;
                if ( v76 > 2158 )
                {
                  if ( v76 <= 2542 )
                    goto LABEL_157;
                  goto LABEL_67;
                }
                if ( v76 > 942 )
                  goto LABEL_258;
                if ( v76 != 495 )
                  goto LABEL_222;
                goto LABEL_256;
              case 0xAu:
              case 0x30u:
                goto LABEL_198;
              case 0xCu:
              case 0x17u:
              case 0x1Fu:
              case 0x3Cu:
                v111 = v13 & 0xFFF;
                if ( v111 > 2094 )
                {
                  if ( v111 == 2095 )
                  {
                    *(_QWORD *)(v5 - 304 + 8LL * v17) = ~(*(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) | *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19));
                  }
                  else if ( v111 == 3951 )
                  {
                    *(_QWORD *)(v5 - 304 + 8LL * v17) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) & *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19);
                  }
                }
                else if ( v111 == 879 )
                {
                  *(_QWORD *)(v5 - 304 + 8LL * v17) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) ^ *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19);
                }
                else if ( v111 == 1583 )
                {
                  *(_QWORD *)(v5 - 304 + 8LL * v17) = *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v20) | *(_QWORD *)(v5 - 304 + 8LL * (unsigned int)v19);
                }
                goto def_4104;
              case 0xEu:
              case 0x10u:
              case 0x22u:
              case 0x2Cu:
              case 0x31u:
                v106 = v13 & 0x200FFF;
                if ( (v13 & 0x200FFF) == 2099439 )
                  v74 = 2099439;
                goto LABEL_194;
              case 0x15u:
                if ( v10 )
                  goto def_4104;
                v53 = 0;
                v140 = 0LL;
                switch ( v13 & 0xFFF )
                {
                  case 3u:
                  case 0x1Au:
                  case 0x2Du:
                  case 0x3Fu:
                    goto LABEL_332;
                  case 4u:
                  case 6u:
                  case 7u:
                  case 8u:
                  case 9u:
                  case 0xAu:
                  case 0xBu:
                  case 0xCu:
                  case 0xDu:
                  case 0xEu:
                  case 0x10u:
                  case 0x12u:
                  case 0x13u:
                  case 0x14u:
                  case 0x15u:
                  case 0x16u:
                  case 0x17u:
                  case 0x18u:
                  case 0x19u:
                  case 0x1Bu:
                  case 0x1Cu:
                  case 0x1Du:
                  case 0x1Eu:
                  case 0x1Fu:
                  case 0x20u:
                  case 0x21u:
                  case 0x22u:
                  case 0x23u:
                  case 0x24u:
                  case 0x25u:
                  case 0x26u:
                  case 0x27u:
                  case 0x28u:
                  case 0x29u:
                  case 0x2Bu:
                  case 0x2Eu:
                  case 0x2Fu:
                  case 0x30u:
                  case 0x31u:
                  case 0x32u:
                  case 0x33u:
                  case 0x34u:
                  case 0x35u:
                  case 0x36u:
                  case 0x37u:
                  case 0x38u:
                  case 0x39u:
                  case 0x3Bu:
                  case 0x3Cu:
                  case 0x3Du:
                  case 0x3Eu:
                    goto def_4104;
                  case 5u:
                  case 0xFu:
                  case 0x2Cu:
                  case 0x3Au:
                    v140 = v7[v17 + 1];
LABEL_332:
                    v141 = (signed __int64)v7[(unsigned int)v19 + 1];
                    v142 = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值