吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9015|回复: 20
收起左侧

[Android 原创] 吾爱破解安全大赛 cm7之浅析llvm

  [复制链接]
czr27 发表于 2016-4-5 19:24
本帖最后由 czr27 于 2016-4-5 19:42 编辑

零、
首先膜拜论坛几位大神共享这次比赛的CM的解题思路,对于小白的我只能在此膜拜啊。所以在这里我们不聊其他的,本帖通过crackme32中c6ec函数为例聊聊CM7中的llvm混淆与恢复吧。
IDA载入后得到的其中一个混淆的函数流程图和F5是这样的:
QQ截图20160405183246.jpg
[C] 纯文本查看 复制代码
int __fastcall sub_C6EC(int a1, int a2, int a3, int a4)
{
  signed int v4; // r2@1
  signed int v5; // r6@3
  char v6; // r1@5
  char v7; // r2@7
  signed int v8; // r0@9
  int v9; // r0@23
  int v10; // r1@23
  signed int v11; // r0@23
  unsigned __int8 v12; // nf@25
  unsigned __int8 v13; // vf@25
  signed int v14; // r1@25
  unsigned __int8 v15; // zf@32
  int v16; // r1@71
  signed int v17; // r0@71
  signed int v18; // r1@73
  int v19; // r0@81
  int v20; // r1@81
  signed int v21; // r0@81
  signed int v22; // r1@83
  int v23; // r1@98
  signed int v24; // r0@98
  signed int v25; // r1@100
  int v26; // r1@106
  signed int v27; // r0@106
  signed int v28; // r1@108
  char v29; // r0@122
  int v30; // r1@124
  int v31; // r0@124
  int v32; // r1@124
  signed int v33; // r0@124
  signed int v34; // r1@126
  int v35; // r0@132
  int v36; // r1@132
  signed int v37; // r0@132
  signed int v38; // r1@134
  unsigned int v39; // r1@140
  int v40; // r0@146
  int v41; // r1@149
  signed int v42; // r0@149
  signed int v43; // r1@151
  int v44; // r2@157
  int v45; // r1@157
  signed int v46; // r0@157
  signed int v47; // r1@159
  int v48; // r2@165
  int v49; // r0@165
  int v50; // r1@165
  int v51; // r0@165
  signed int v52; // r1@167
  int v53; // r0@173
  int v54; // r1@173
  signed int v55; // r0@173
  signed int v56; // r1@175
  char v57; // r0@185
  int v58; // r1@187
  int v59; // r0@187
  int v60; // r1@187
  signed int v61; // r0@187
  signed int v62; // r1@189
  int v63; // r0@201
  int v64; // r1@201
  signed int v65; // r0@201
  signed int v66; // r1@203
  char v67; // r0@211
  int v68; // r0@218
  int v69; // r1@218
  signed int v70; // r0@218
  signed int v71; // r1@220
  int v72; // r1@245
  int v73; // r0@245
  int v74; // r1@245
  signed int v75; // r0@245
  signed int v76; // r1@247
  int v77; // r0@254
  int v78; // r1@254
  signed int v79; // r0@254
  signed int v80; // r1@256
  int v81; // r0@277
  int v82; // r1@277
  signed int v83; // r0@277
  signed int v84; // r1@279
  int v85; // r1@289
  signed int v86; // r0@289
  signed int v87; // r1@291
  int v88; // r0@301
  int v89; // r1@301
  signed int v90; // r0@301
  signed int v91; // r1@303
  int v92; // r0@325
  int v93; // r1@325
  signed int v94; // r0@325
  signed int v95; // r1@327
  char v96; // zf@341
  int v97; // r1@347
  signed int v98; // r0@347
  signed int v99; // r1@349
  int result; // r0@354
  int *v101; // [sp+0h] [bp-138h]@9
  int v102; // [sp+4h] [bp-134h]@9
  int *v103; // [sp+8h] [bp-130h]@9
  int *v104; // [sp+Ch] [bp-12Ch]@9
  int *v105; // [sp+10h] [bp-128h]@9
  int *v106; // [sp+14h] [bp-124h]@9
  int *v107; // [sp+18h] [bp-120h]@9
  int *v108; // [sp+1Ch] [bp-11Ch]@9
  int *v109; // [sp+20h] [bp-118h]@9
  int *v110; // [sp+24h] [bp-114h]@9
  int v111; // [sp+28h] [bp-110h]@1
  int *v112; // [sp+2Ch] [bp-10Ch]@9
  int *v113; // [sp+30h] [bp-108h]@9
  int v114; // [sp+34h] [bp-104h]@9
  int *v115; // [sp+38h] [bp-100h]@9
  int *v116; // [sp+3Ch] [bp-FCh]@9
  int *v117; // [sp+40h] [bp-F8h]@9
  int *v118; // [sp+44h] [bp-F4h]@9
  int v119; // [sp+48h] [bp-F0h]@9
  int *v120; // [sp+4Ch] [bp-ECh]@9
  int *v121; // [sp+50h] [bp-E8h]@9
  int *v122; // [sp+54h] [bp-E4h]@9
  int *v123; // [sp+58h] [bp-E0h]@9
  int v124; // [sp+5Ch] [bp-DCh]@5
  int *v125; // [sp+60h] [bp-D8h]@9
  int v126; // [sp+64h] [bp-D4h]@1
  int v127; // [sp+68h] [bp-D0h]@9
  int v128; // [sp+6Ch] [bp-CCh]@9
  int v129; // [sp+70h] [bp-C8h]@9
  int v130; // [sp+74h] [bp-C4h]@9
  int v131; // [sp+78h] [bp-C0h]@9
  int v132; // [sp+7Ch] [bp-BCh]@9
  int v133; // [sp+80h] [bp-B8h]@9
  int v134; // [sp+84h] [bp-B4h]@9
  int v135; // [sp+88h] [bp-B0h]@1
  int *v136; // [sp+8Ch] [bp-ACh]@9
  int v137; // [sp+90h] [bp-A8h]@1
  char v138; // [sp+96h] [bp-A2h]@7
  char v139; // [sp+97h] [bp-A1h]@9
  int *v140; // [sp+98h] [bp-A0h]@12
  int v141; // [sp+9Ch] [bp-9Ch]@12
  char v142; // [sp+A3h] [bp-95h]@89
  int *v143; // [sp+A4h] [bp-94h]@12
  int v144; // [sp+A8h] [bp-90h]@122
  char v145; // [sp+AEh] [bp-8Ah]@142
  char v146; // [sp+AFh] [bp-89h]@124
  int v147; // [sp+B0h] [bp-88h]@165
  int v148; // [sp+B4h] [bp-84h]@310
  int v149; // [sp+B8h] [bp-80h]@157
  int v150; // [sp+BCh] [bp-7Ch]@165
  int v151; // [sp+C0h] [bp-78h]@140
  int v152; // [sp+C4h] [bp-74h]@32
  int v153; // [sp+C8h] [bp-70h]@32
  int v154; // [sp+CCh] [bp-6Ch]@157
  int v155; // [sp+D0h] [bp-68h]@32
  unsigned int v156; // [sp+D4h] [bp-64h]@140
  unsigned int v157; // [sp+D8h] [bp-60h]@140
  char v158; // [sp+DFh] [bp-59h]@32
  int v159; // [sp+E0h] [bp-58h]@32
  int v160; // [sp+E4h] [bp-54h]@32
  int v161; // [sp+E8h] [bp-50h]@32
  int v162; // [sp+ECh] [bp-4Ch]@120
  char v163; // [sp+F2h] [bp-46h]@230
  char v164; // [sp+F3h] [bp-45h]@120
  int v165; // [sp+F4h] [bp-44h]@120
  int v166; // [sp+F8h] [bp-40h]@227
  int v167; // [sp+FCh] [bp-3Ch]@227
  int v168; // [sp+100h] [bp-38h]@17
  int v169; // [sp+104h] [bp-34h]@17
  int v170; // [sp+108h] [bp-30h]@17
  int v171; // [sp+10Ch] [bp-2Ch]@17
  int v172; // [sp+110h] [bp-28h]@218
  int v173; // [sp+114h] [bp-24h]@1

  v111 = a1;
  v137 = a3;
  v126 = a4;
  v135 = a2;
  v173 = unk_4E04C;
  v4 = -579956637;
  if ( !a2 )
    v4 = 20066;
  LOWORD(v5) = 9458;
  if ( !a2 )
    HIWORD(v4) = -22070;
  v6 = 0;
  v124 = v4;
  if ( !(((unk_556A4 - 1) * unk_556A4 ^ 0xFFFFFFFE) & (unk_556A4 - 1) * unk_556A4) )
    v6 = 1;
  v138 = v6;
  v7 = 0;
  if ( unk_556D4 < 10 )
    v7 = 1;
  v139 = v7;
  v127 = (int)&unk_4C000;
  HIWORD(v5) = 30605;
  v110 = &dword_4BFF4;
  v109 = &dword_4BFF4;
  v108 = &dword_4BFF4;
  v107 = &dword_4BFF4;
  v106 = &dword_4BFF4;
  v105 = &dword_4BFF4;
  v104 = &dword_4BFF4;
  v103 = &dword_4BFF4;
  v102 = (int)&unk_4C000;
  v101 = &dword_4BFF4;
  v112 = &dword_4BFF4;
  v113 = &dword_4BFF4;
  v114 = (int)&unk_474BF;
  v134 = -19253;
  v115 = &dword_4BFF4;
  v133 = -19253;
  v116 = &dword_4BFF4;
  v132 = -19253;
  v117 = &dword_4BFF4;
  v131 = -19253;
  v118 = &dword_4BFF4;
  v128 = -19253;
  v120 = &dword_4BFF4;
  v129 = -19253;
  v121 = &dword_4BFF4;
  v130 = -19253;
  v122 = &dword_4BFF4;
  v119 = -19253;
  v123 = &dword_4BFF4;
  v125 = &dword_4BFF4;
  v136 = &dword_4BFF4;
  v8 = -768040915;
  do
  {
    while ( 1 )
    {
      while ( 1 )
      {
        while ( 1 )
        {
          while ( 1 )
          {
            while ( 1 )
            {
              while ( 1 )
              {
                while ( 1 )
                {
                  while ( 1 )
                  {
                    while ( 1 )
                    {
                      while ( 1 )
                      {
                        while ( 1 )
                        {
                          while ( 1 )
                          {
                            while ( 1 )
                            {
                              while ( 1 )
                              {
                                while ( 1 )
                                {
                                  while ( 1 )
                                  {
                                    while ( 1 )
                                    {
                                      while ( 1 )
                                      {
                                        while ( 1 )
                                        {
                                          while ( 1 )
                                          {
                                            while ( 1 )
                                            {
                                              while ( 1 )
                                              {
                                                while ( 1 )
                                                {
                                                  while ( 1 )
                                                  {
                                                    while ( 1 )
                                                    {
                                                      while ( 1 )
                                                      {
                                                        while ( 1 )
                                                        {
                                                          while ( 1 )
                                                          {
                                                            while ( 1 )
                                                            {
                                                              while ( 1 )
                                                              {
                                                                while ( 1 )
                                                                {
                                                                  while ( 1 )
                                                                  {
                                                                    while ( 1 )
                                                                    {
                                                                      while ( 1 )
                                                                      {
                                                                        while ( 1 )
                                                                        {
                                                                          while ( 1 )
                                                                          {
                                                                            while ( 1 )
                                                                            {
                                                                              while ( 1 )
                                                                              {
                                                                                while ( 1 )
                                                                                {
                                                                                  while ( 1 )
                                                                                  {
                                                                                    while ( 1 )
                                                                                    {
                                                                                      while ( 1 )
                                                                                      {
                                                                                        while ( 1 )
                                                                                        {
                                                                                          while ( 1 )
                                                                                          {
                                                                                            while ( 1 )
                                                                                            {
                                                                                              while ( 1 )
                                                                                              {
                                                                                                while ( 1 )
                                                                                                {
                                                                                                  while ( 1 )
                                                                                                  {
                                                                                                    while ( 1 )
                                                                                                    {
                                                                                                      while ( 1 )
                                                                                                      {
                                                                                                        while ( v8 <= -1901452613 )
                                                                                                        {
                                                                                                          if ( v8 == -2107012333 )
                                                                                                          {
                                                                                                            sub_14B4E(v137, v141, 0);
                                                                                                            v143 = v140;
                                                                                                            v8 = 615070360;
                                                                                                          }
                                                                                                        }
                                                                                                        if ( v8 <= 2144827489 )
                                                                                                          break;
                                                                                                        if ( v8 == 2144827490 )
                                                                                                          v8 = 1412174859;
                                                                                                      }
                                                                                                      if ( v8 <= 2005738737 )
                                                                                                        break;
                                                                                                      if ( v8 == v5 )
                                                                                                      {
                                                                                                        v9 = (*(_DWORD *)*(v136 - 120) - 1) * *(_DWORD *)*(v136 - 120);
                                                                                                        v10 = *(_DWORD *)*(v136 - 119);
                                                                                                        v15 = ((v9 ^ 0xFFFFFFFE) & v9) == 0;
                                                                                                        v11 = 0;
                                                                                                        if ( v15 )
                                                                                                          v11 = 1;
                                                                                                        v13 = __OFSUB__(v10, 10);
                                                                                                        v12 = v10 - 10 < 0;
                                                                                                        v14 = 0;
                                                                                                        if ( v12 ^ v13 )
                                                                                                          v14 = 1;
                                                                                                        v15 = (v11 ^ v14 | v11 & v14) == 0;
                                                                                                        v8 = 200515412;
                                                                                                        if ( !v15 )
                                                                                                          v8 = 1875019872;
                                                                                                      }
                                                                                                    }
                                                                                                    if ( v8 > -1862303910 )
                                                                                                      break;
                                                                                                    if ( v8 == -1901452612 )
                                                                                                    {
                                                                                                      v168 = v131;
                                                                                                      v169 = v132;
                                                                                                      v170 = v133;
                                                                                                      v171 = v134;
                                                                                                      v8 = -1343014647;
                                                                                                      if ( v133 < v135 )
                                                                                                        v8 = -211159207;
                                                                                                    }
                                                                                                  }
                                                                                                  if ( v8 > -1725333822 )
                                                                                                    break;
                                                                                                  if ( v8 == -1862303909 )
                                                                                                  {
                                                                                                    v159 = v152 + 1;
                                                                                                    *(_BYTE *)v152 = v158;
                                                                                                    v160 = v153 + 1;
                                                                                                    v161 = *(_BYTE *)v155;
                                                                                                    v15 = v161 == *(_BYTE *)v127;
                                                                                                    v8 = 408476889;
                                                                                                    v130 = v155;
                                                                                                    if ( !v15 )
                                                                                                      v8 = 5570;
                                                                                                    v129 = v159;
                                                                                                    if ( !v15 )
                                                                                                      HIWORD(v8) = -8680;
                                                                                                    v128 = v160;
                                                                                                  }
                                                                                                }
                                                                                                if ( v8 > -1693408896 )
                                                                                                  break;
                                                                                                if ( v8 == -1725333821 )
                                                                                                  v8 = 1485624584;
                                                                                              }
                                                                                              if ( v8 <= 1926646756 )
                                                                                                break;
                                                                                              if ( v8 == 1926646757 )
                                                                                                v8 = 1265469521;
                                                                                            }
                                                                                            if ( v8 <= 1911860848 )
                                                                                              break;
                                                                                            if ( v8 == 1911860849 )
                                                                                            {
                                                                                              v19 = *(v125 - 120);
                                                                                              v141 = *(_DWORD *)v126;
                                                                                              v20 = *(_DWORD *)*(v125 - 119);
                                                                                              v15 = (((*(_DWORD *)v19 - 1) * *(_DWORD *)v19 ^ 0xFFFFFFFE) & (*(_DWORD *)v19 - 1) * *(_DWORD *)v19) == 0;
                                                                                              v21 = 0;
                                                                                              if ( v15 )
                                                                                                v21 = 1;
                                                                                              v13 = __OFSUB__(v20, 10);
                                                                                              v12 = v20 - 10 < 0;
                                                                                              v22 = 0;
                                                                                              if ( v12 ^ v13 )
                                                                                                v22 = 1;
                                                                                              v15 = (v21 ^ v22 | v21 & v22) == 0;
                                                                                              v8 = -1322783334;
                                                                                              if ( !v15 )
                                                                                                v8 = -787925199;
                                                                                            }
                                                                                          }
                                                                                          if ( v8 <= 1888903569 )
                                                                                            break;
                                                                                          if ( v8 == 1888903570 )
                                                                                          {
                                                                                            v8 = -2107012333;
                                                                                            if ( v142 )
                                                                                              v8 = -1446359454;
                                                                                          }
                                                                                        }
                                                                                        if ( v8 <= 1875019871 )
                                                                                          break;
                                                                                        if ( v8 == 1875019872 )
                                                                                          v8 = 1826254214;
                                                                                      }
                                                                                      if ( v8 <= 1826254213 )
                                                                                        break;
                                                                                      if ( v8 == 1826254214 )
                                                                                        v8 = v124;
                                                                                    }
                                                                                    if ( v8 <= 1786078353 )
                                                                                      break;
                                                                                    if ( v8 == 1786078354 )
                                                                                    {
                                                                                      v23 = *(_DWORD *)*(v123 - 119);
                                                                                      v24 = 0;
                                                                                      if ( (~((*(_DWORD *)*(v123 - 120)
                                                                                             - 1)
                                                                                            * *(_DWORD *)*(v123 - 120)) | 0xFFFFFFFE) == -1 )
                                                                                        v24 = 1;
                                                                                      v13 = __OFSUB__(v23, 10);
                                                                                      v12 = v23 - 10 < 0;
                                                                                      v25 = 0;
                                                                                      if ( v12 ^ v13 )
                                                                                        v25 = 1;
                                                                                      v15 = (v24 ^ v25 | v24 & v25) == 0;
                                                                                      v8 = -1725333821;
                                                                                      if ( !v15 )
                                                                                        v8 = 1485624584;
                                                                                    }
                                                                                  }
                                                                                  if ( v8 <= 1759492015 )
                                                                                    break;
                                                                                  if ( v8 == 1759492016 )
                                                                                  {
                                                                                    v26 = *(_DWORD *)*(v122 - 119);
                                                                                    v27 = 0;
                                                                                    if ( (~((*(_DWORD *)*(v122 - 120) - 1)
                                                                                          * *(_DWORD *)*(v122 - 120)) | 0xFFFFFFFE) != -1 )
                                                                                      v27 = 1;
                                                                                    v13 = __OFSUB__(v26, 9);
                                                                                    v15 = v26 == 9;
                                                                                    v12 = v26 - 9 < 0;
                                                                                    v28 = 0;
                                                                                    if ( !((unsigned __int8)(v12 ^ v13) | v15) )
                                                                                      v28 = 1;
                                                                                    v15 = (v27 ^ v28 | (v27 | v28) ^ 1) == 0;
                                                                                    v8 = -1224362487;
                                                                                    if ( !v15 )
                                                                                      v8 = 552383739;
                                                                                  }
                                                                                }
                                                                                if ( v8 <= 1668326195 )
                                                                                  break;
                                                                                if ( v8 == 1668326196 )
                                                                                  v8 = 1386747132;
                                                                              }
                                                                              if ( v8 <= 1662374462 )
                                                                                break;
                                                                              if ( v8 == 1662374463 )
                                                                                v8 = -709053658;
                                                                            }
                                                                            if ( v8 <= 1628979202 )
                                                                              break;
                                                                            if ( v8 == 1628979203 )
                                                                              v8 = 1003626917;
                                                                          }
                                                                          if ( v8 <= 1559277927 )
                                                                            break;
                                                                          if ( v8 == 1559277928 )
                                                                          {
                                                                            *(_BYTE *)v159 = v164;
                                                                            v130 = v162;
                                                                            v128 = v160 + 1;
                                                                            v129 = v165;
                                                                            v8 = 408476889;
                                                                          }
                                                                        }
                                                                        if ( v8 <= 1485624583 )
                                                                          break;
                                                                        if ( v8 == 1485624584 )
                                                                        {
                                                                          v29 = 0;
                                                                          if ( v144 != 10 )
                                                                            v29 = 1;
                                                                          v30 = *v121;
                                                                          v146 = v29;
                                                                          v31 = (*(_DWORD *)v30 - 1) * *(_DWORD *)v30;
                                                                          v32 = *(_DWORD *)*v121;
                                                                          v15 = ((v31 ^ 0xFFFFFFFE) & v31) == 0;
                                                                          v33 = 0;
                                                                          if ( v15 )
                                                                            v33 = 1;
                                                                          v13 = __OFSUB__(v32, 10);
                                                                          v12 = v32 - 10 < 0;
                                                                          v34 = 0;
                                                                          if ( v12 ^ v13 )
                                                                            v34 = 1;
                                                                          v15 = (v33 ^ v34 | v33 & v34) == 0;
                                                                          v8 = -1725333821;
                                                                          if ( !v15 )
                                                                            v8 = 2144827490;
                                                                        }
                                                                      }
                                                                      if ( v8 <= 1412174858 )
                                                                        break;
                                                                      if ( v8 == 1412174859 )
                                                                      {
                                                                        v35 = (*(_DWORD *)*v120 - 1) * *(_DWORD *)*v120;
                                                                        v36 = *(_DWORD *)*v120;
                                                                        v15 = ((v35 ^ 0xFFFFFFFE) & v35) == 0;
                                                                        v37 = 0;
                                                                        if ( v15 )
                                                                          v37 = 1;
                                                                        v13 = __OFSUB__(v36, 10);
                                                                        v12 = v36 - 10 < 0;
                                                                        v38 = 0;
                                                                        if ( v12 ^ v13 )
                                                                          v38 = 1;
                                                                        v15 = (v37 & v38 | v37 ^ v38) == 0;
                                                                        v8 = -329744832;
                                                                        if ( !v15 )
                                                                          v8 = -130772934;
                                                                      }
                                                                    }
                                                                    if ( v8 <= 1386747131 )
                                                                      break;
                                                                    if ( v8 == 1386747132 )
                                                                    {
                                                                      v39 = ((v156 >> 4) ^ 0xFFFFFFC) & (v156 >> 4);
                                                                      v157 = v151 + (v156 << 12) + v39;
                                                                      v158 = (unsigned __int16)((_WORD)v151
                                                                                              + ((_WORD)v156 << 12)
                                                                                              + (_WORD)v39) >> 8;
                                                                      v8 = -1862303909;
                                                                    }
                                                                  }
                                                                  if ( v8 <= 1360782912 )
                                                                    break;
                                                                  if ( v8 == 1360782913 )
                                                                  {
                                                                    v8 = -206615233;
                                                                    if ( v145 )
                                                                      v8 = 1786078354;
                                                                  }
                                                                }
                                                                if ( v8 <= 1324097311 )
                                                                  break;
                                                                if ( v8 == 1324097312 )
                                                                {
                                                                  v40 = v171;
                                                                  goto LABEL_147;
                                                                }
                                                              }
                                                              if ( v8 <= 1291296763 )
                                                                break;
                                                              if ( v8 == 1291296764 )
                                                              {
                                                                v41 = *(_DWORD *)*v118;
                                                                v42 = 0;
                                                                if ( (~((*(_DWORD *)*v118 - 1) * *(_DWORD *)*v118) | 0xFFFFFFFE) == -1 )
                                                                  v42 = 1;
                                                                v13 = __OFSUB__(v41, 10);
                                                                v12 = v41 - 10 < 0;
                                                                v43 = 0;
                                                                if ( v12 ^ v13 )
                                                                  v43 = 1;
                                                                v15 = (v42 & v43 | v42 ^ v43) == 0;
                                                                v8 = 517347731;
                                                                if ( !v15 )
                                                                  v8 = 1324097312;
                                                              }
                                                            }
                                                            if ( v8 <= 1265469520 )
                                                              break;
                                                            if ( v8 == 1265469521 )
                                                            {
                                                              v155 = v149 + 1;
                                                              v44 = *v117;
                                                              v156 = *((_BYTE *)v140 + v154);
                                                              v45 = *(_DWORD *)*v117;
                                                              v46 = 0;
                                                              if ( (~((*(_DWORD *)v44 - 1) * *(_DWORD *)v44) | 0xFFFFFFFE) == -1 )
                                                                v46 = 1;
                                                              v13 = __OFSUB__(v45, 10);
                                                              v12 = v45 - 10 < 0;
                                                              v47 = 0;
                                                              if ( v12 ^ v13 )
                                                                v47 = 1;
                                                              v15 = (v46 ^ v47 | v46 & v47) == 0;
                                                              v8 = 1926646757;
                                                              if ( !v15 )
                                                                v8 = 1668326196;
                                                            }
                                                          }
                                                          if ( v8 <= 1003626916 )
                                                            break;
                                                          if ( v8 == 1003626917 )
                                                          {
                                                            v149 = v147 + 1;
                                                            v48 = *v116;
                                                            v150 = *((_BYTE *)v140 + *(_BYTE *)v147);
                                                            v49 = ~-*(_DWORD *)v48 * *(_DWORD *)v48;
                                                            v50 = *(_DWORD *)*v116;
                                                            v51 = (v49 ^ 0xFFFFFFFE) & v49;
                                                            if ( v51 )
                                                              v51 = 1;
                                                            v13 = __OFSUB__(v50, 9);
                                                            v15 = v50 == 9;
                                                            v12 = v50 - 9 < 0;
                                                            v52 = 0;
                                                            if ( !((unsigned __int8)(v12 ^ v13) | v15) )
                                                              v52 = 1;
                                                            v15 = (v51 ^ v52 | (v51 | v52) ^ 1) == 0;
                                                            v8 = 1628979203;
                                                            if ( !v15 )
                                                              v8 = 27249737;
                                                          }
                                                        }
                                                        if ( v8 <= 881679339 )
                                                          break;
                                                        if ( v8 == 881679340 )
                                                        {
                                                          v53 = (*(_DWORD *)*v115 - 1) * *(_DWORD *)*v115;
                                                          v54 = *(_DWORD *)*v115;
                                                          v15 = ((v53 ^ 0xFFFFFFFE) & v53) == 0;
                                                          v55 = 0;
                                                          if ( v15 )
                                                            v55 = 1;
                                                          v13 = __OFSUB__(v54, 10);
                                                          v12 = v54 - 10 < 0;
                                                          v56 = 0;
                                                          if ( v12 ^ v13 )
                                                            v56 = 1;
                                                          v15 = (v55 & v56 | v55 ^ v56) == 0;
                                                          v8 = 517347731;
                                                          if ( !v15 )
                                                            v8 = 1291296764;
                                                        }
                                                      }
                                                      if ( v8 <= 782683747 )
                                                        break;
                                                      if ( v8 == 782683748 )
                                                        v8 = 416826029;
                                                    }
                                                    if ( v8 <= 615070359 )
                                                      break;
                                                    if ( v8 == 615070360 )
                                                    {
                                                      sub_14B4A(v143, v114, 256);
                                                      v8 = -1693408895;
                                                    }
                                                  }
                                                  if ( v8 <= 552383738 )
                                                    break;
                                                  if ( v8 == 552383739 )
                                                  {
                                                    v57 = 0;
                                                    if ( v144 != 13 )
                                                      v57 = 1;
                                                    v58 = *v113;
                                                    v145 = v57;
                                                    v59 = (*(_DWORD *)v58 - 1) * *(_DWORD *)v58;
                                                    v60 = *(_DWORD *)*v113;
                                                    v15 = ((v59 ^ 0xFFFFFFFE) & v59) == 0;
                                                    v61 = 0;
                                                    if ( v15 )
                                                      v61 = 1;
                                                    v13 = __OFSUB__(v60, 10);
                                                    v12 = v60 - 10 < 0;
                                                    v62 = 0;
                                                    if ( v12 ^ v13 )
                                                      v62 = 1;
                                                    v15 = (v61 ^ v62 | v61 & v62) == 0;
                                                    v8 = -1224362487;
                                                    if ( !v15 )
                                                      v8 = -327612536;
                                                  }
                                                }
                                                if ( v8 <= 517347730 )
                                                  break;
                                                if ( v8 == 517347731 )
                                                  v8 = 1291296764;
                                              }
                                              if ( v8 <= 492339595 )
                                                break;
                                              if ( v8 == 492339596 )
                                              {
                                                v8 = -206615233;
                                                if ( v146 )
                                                  v8 = -341342023;
                                              }
                                            }
                                            if ( v8 <= 416826028 )
                                              break;
                                            if ( v8 == 416826029 )
                                            {
                                              v63 = (*(_DWORD *)*v112 - 1) * *(_DWORD *)*v112;
                                              v64 = *(_DWORD *)*v112;
                                              v15 = ((v63 ^ 0xFFFFFFFE) & v63) == 0;
                                              v65 = 0;
                                              if ( v15 )
                                                v65 = 1;
                                              v13 = __OFSUB__(v64, 10);
                                              v12 = v64 - 10 < 0;
                                              v66 = 0;
                                              if ( v12 ^ v13 )
                                                v66 = 1;
                                              v15 = (v65 & v66 | v65 ^ v66) == 0;
                                              v8 = 782683748;
                                              if ( !v15 )
                                                v8 = -594247879;
                                            }
                                          }
                                          if ( v8 <= 408476888 )
                                            break;
                                          if ( v8 == 408476889 )
                                          {
                                            v134 = v128;
                                            v133 = v170 + 4;
                                            v8 = -1901452612;
                                            v132 = v129;
                                            v131 = v130;
                                          }
                                        }
                                        if ( v8 <= 373449796 )
                                          break;
                                        if ( v8 == 373449797 )
                                        {
                                          v67 = 0;
                                          if ( v141 < v135 )
                                            v67 = 1;
                                          v142 = v67;
                                          v8 = 1888903570;
                                        }
                                      }
                                      if ( v8 <= 268320251 )
                                        break;
                                      if ( v8 == 268320252 )
                                        v8 = -968901991;
                                    }
                                    if ( v8 > -1687541981 )
                                      break;
                                    if ( v8 == -1693408895 )
                                    {
                                      v16 = *(_DWORD *)*(v110 - 119);
                                      v17 = 0;
                                      if ( (~((*(_DWORD *)*(v110 - 120) - 1) * *(_DWORD *)*(v110 - 120)) | 0xFFFFFFFE) == -1 )
                                        v17 = 1;
                                      v13 = __OFSUB__(v16, 10);
                                      v12 = v16 - 10 < 0;
                                      v18 = 0;
                                      if ( v12 ^ v13 )
                                        v18 = 1;
                                      v15 = (v17 & v18 | v17 ^ v18) == 0;
                                      v8 = 1662374463;
                                      if ( !v15 )
                                        v8 = -709053658;
                                    }
                                  }
                                  if ( v8 > -1642076405 )
                                    break;
                                  if ( v8 == -1687541980 )
                                  {
                                    v172 = v119;
                                    v68 = (*(_DWORD *)*v109 - 1) * *(_DWORD *)*v109;
                                    v69 = *(_DWORD *)*v109;
                                    v15 = ((v68 ^ 0xFFFFFFFE) & v68) == 0;
                                    v70 = 0;
                                    if ( v15 )
                                      v70 = 1;
                                    v13 = __OFSUB__(v69, 10);
                                    v12 = v69 - 10 < 0;
                                    v71 = 0;
                                    if ( v12 ^ v13 )
                                      v71 = 1;
                                    v15 = (v70 & v71 | v70 ^ v71) == 0;
                                    v8 = 782683748;
                                    if ( !v15 )
                                      v8 = 416826029;
                                  }
                                }
                                if ( v8 > -1447795291 )
                                  break;
                                if ( v8 == -1642076404 )
                                {
                                  v131 = v166;
                                  v133 = v167;
                                  v134 = v171;
                                  v132 = v169;
                                  v8 = -1901452612;
                                }
                              }
                              if ( v8 > -1446359455 )
                                break;
                              if ( v8 == -1447795290 )
                              {
                                v164 = 4 * v163 + v157;
                                v165 = v159 + 1;
                                v8 = 1559277928;
                              }
                            }
                            if ( v8 > -1343014648 )
                              break;
                            if ( v8 == -1446359454 )
                            {
                              v40 = 0;
LABEL_147:
                              v119 = v40;
                              v8 = -1687541980;
                            }
                          }
                          if ( v8 > -1322783335 )
                            break;
                          if ( v8 == -1343014647 )
                            v8 = 881679340;
                        }
                        if ( v8 > -1224362488 )
                          break;
                        if ( v8 == -1322783334 )
                          v8 = 1911860849;
                      }
                      if ( v8 > -968901992 )
                        break;
                      if ( v8 == -1224362487 )
                        v8 = 552383739;
                    }
                    if ( v8 > -917428403 )
                      break;
                    if ( v8 == -968901991 )
                    {
                      v72 = *v108;
                      v140 = (int *)(&v101 - 64);
                      v73 = (*(_DWORD *)v72 - 1) * *(_DWORD *)v72;
                      v74 = *(_DWORD *)*v108;
                      v15 = ((v73 ^ 0xFFFFFFFE) & v73) == 0;
                      v75 = 0;
                      if ( v15 )
                        v75 = 1;
                      v13 = __OFSUB__(v74, 10);
                      v12 = v74 - 10 < 0;
                      v76 = 0;
                      if ( v12 ^ v13 )
                        v76 = 1;
                      v15 = (v75 ^ v76 | v75 & v76) == 0;
                      v8 = 268320252;
                      if ( !v15 )
                        v8 = -821278251;
                    }
                  }
                  if ( v8 > -858444357 )
                    break;
                  if ( v8 == -917428402 )
                  {
                    v77 = (*(_DWORD *)*v107 - 1) * *(_DWORD *)*v107;
                    v78 = *(_DWORD *)*v107;
                    v15 = ((v77 ^ 0xFFFFFFFE) & v77) == 0;
                    v79 = 0;
                    if ( v15 )
                      v79 = 1;
                    v13 = __OFSUB__(v78, 10);
                    v12 = v78 - 10 < 0;
                    v80 = 0;
                    if ( v12 ^ v13 )
                      v80 = 1;
                    v15 = (v79 & v80 | v79 ^ v80) == 0;
                    v8 = 200515412;
                    if ( !v15 )
                      v8 = 2005738738;
                  }
                }
                if ( v8 > -821278252 )
                  break;
                if ( v8 == -858444356 )
                {
                  v167 = v170 + 1;
                  v8 = -1642076404;
                }
              }
              if ( v8 > -787925200 )
                break;
              if ( v8 == -821278251 )
                v8 = -917428402;
            }
            if ( v8 > -768040916 )
              break;
            if ( v8 == -787925199 )
              v8 = 373449797;
          }
          if ( v8 > -709053659 )
            break;
          if ( v8 == -768040915 )
          {
            v8 = 268320252;
            if ( ((unsigned __int8)(v138 ^ v139) | (unsigned __int8)~(~v138 | (unsigned __int8)~v139)) & 1 )
              v8 = -968901991;
          }
        }
        if ( v8 > -594247880 )
          break;
        if ( v8 == -709053658 )
        {
          v81 = (*(_DWORD *)*v106 - 1) * *(_DWORD *)*v106;
          v82 = *(_DWORD *)*v106;
          v15 = ((v81 ^ 0xFFFFFFFE) & v81) == 0;
          v83 = 0;
          if ( v15 )
            v83 = 1;
          v13 = __OFSUB__(v82, 10);
          v12 = v82 - 10 < 0;
          v84 = 0;
          if ( v12 ^ v13 )
            v84 = 1;
          v15 = (v83 ^ v84 | v83 & v84) == 0;
          v8 = 1662374463;
          if ( !v15 )
            v8 = -121304508;
        }
      }
      if ( v8 <= -579956638 )
        break;
      if ( v8 > -568846911 )
      {
        if ( v8 > -406745412 )
        {
          if ( v8 > -341342024 )
          {
            if ( v8 > -329744833 )
            {
              if ( v8 > -327612537 )
              {
                if ( v8 > -211159208 )
                {
                  if ( v8 > -206615234 )
                  {
                    if ( v8 > -130772935 )
                    {
                      if ( v8 > -121304509 )
                      {
                        if ( v8 > 27249736 )
                        {
                          if ( v8 > 74139172 )
                          {
                            switch ( v8 )
                            {
                              case 74139173:
                                v151 = (((v150 << 22) ^ 0xFF000000) & (v150 << 22))
                                     + v148
                                     + (((v150 << 6) ^ 0xFFFFF0C0) & (v150 << 6));
                                v152 = v169 + 1;
                                *(_BYTE *)v169 = (unsigned int)v151 >> 16;
                                v153 = v171 + 1;
                                v154 = *(_BYTE *)v149;
                                v96 = v154 == *(_BYTE *)v102;
                                v8 = 408476889;
                                v130 = v149;
                                if ( !v96 )
                                  v8 = 31171;
                                v129 = v152;
                                if ( !v96 )
                                  HIWORD(v8) = 3061;
                                v128 = v153;
                                break;
                              case 200515412:
                                v8 = v5;
                                break;
                              case 200636867:
                                v97 = *(_DWORD *)*v101;
                                v98 = 0;
                                if ( (~((*(_DWORD *)*v101 - 1) * *(_DWORD *)*v101) | 0xFFFFFFFE) == -1 )
                                  v98 = 1;
                                v13 = __OFSUB__(v97, 10);
                                v12 = v97 - 10 < 0;
                                v99 = 0;
                                if ( v12 ^ v13 )
                                  v99 = 1;
                                v15 = (v98 & v99 | v98 ^ v99) == 0;
                                v8 = 1926646757;
                                if ( !v15 )
                                  v8 = 1265469521;
                                break;
                            }
                          }
                          else if ( v8 == 27249737 )
                          {
                            v8 = 74139173;
                          }
                        }
                        else if ( v8 == -121304508 )
                        {
                          v133 = 0;
                          v134 = 0;
                          v8 = -1901452612;
                          v132 = v137;
                          v131 = v111;
                        }
                      }
                      else if ( v8 == -130772934 )
                      {
                        v92 = (*(_DWORD *)*v103 - 1) * *(_DWORD *)*v103;
                        v93 = *(_DWORD *)*v103;
                        v15 = ((v92 ^ 0xFFFFFFFE) & v92) == 0;
                        v94 = 0;
                        if ( v15 )
                          v94 = 1;
                        v13 = __OFSUB__(v93, 10);
                        v12 = v93 - 10 < 0;
                        v95 = 0;
                        if ( v12 ^ v13 )
                          v95 = 1;
                        v15 = (v94 & v95 | v94 ^ v95) == 0;
                        v8 = -329744832;
                        if ( !v15 )
                          v8 = 492339596;
                      }
                    }
                    else if ( v8 == -206615233 )
                    {
                      v166 = v168 + 1;
                      v8 = -858444356;
                    }
                  }
                  else if ( v8 == -211159207 )
                  {
                    v144 = *(_BYTE *)v168;
                    v8 = 1759492016;
                  }
                }
                else if ( v8 == -327612536 )
                {
                  v8 = 1360782913;
                }
              }
              else if ( v8 == -329744832 )
              {
                v8 = -130772934;
              }
            }
            else if ( v8 == -341342023 )
            {
              v147 = v168 + 1;
              v148 = *((_BYTE *)v140 + v144) << 16;
              v8 = -406745411;
            }
          }
          else if ( v8 == -406745411 )
          {
            v88 = ~-*(_DWORD *)*v104 * *(_DWORD *)*v104;
            v89 = *(_DWORD *)*v104;
            v15 = ((v88 ^ 0xFFFFFFFE) & v88) == 0;
            v90 = 0;
            if ( v15 )
              v90 = 1;
            v13 = __OFSUB__(v89, 10);
            v12 = v89 - 10 < 0;
            v91 = 0;
            if ( v12 ^ v13 )
              v91 = 1;
            v15 = (v90 ^ v91 | v90 & v91) == 0;
            v8 = 1628979203;
            if ( !v15 )
              v8 = 1003626917;
          }
        }
        else if ( v8 == -568846910 )
        {
          v162 = v155 + 1;
          v163 = *((_BYTE *)v140 + v161);
          v8 = -1447795290;
        }
      }
      else if ( v8 == -579956637 )
      {
        v85 = *(_DWORD *)*v105;
        v86 = 0;
        if ( (~(~-*(_DWORD *)*v105 * *(_DWORD *)*v105) | 0xFFFFFFFE) == -1 )
          v86 = 1;
        v13 = __OFSUB__(v85, 10);
        v12 = v85 - 10 < 0;
        v87 = 0;
        if ( v12 ^ v13 )
          v87 = 1;
        v15 = (v86 & v87 | v86 ^ v87) == 0;
        v8 = -1322783334;
        if ( !v15 )
          v8 = 1911860849;
      }
    }
  }
  while ( v8 != -594247879 );
  result = v172;
  if ( v0 != v173 )
  {
    ((void (__fastcall *)(int, int))loc_19420)(v172, v0 - v173);
    result = sub_DFA4();
  }
  return result;
}

由于在做本题之前,还不知道有llvm这回事,当时真是把本宝宝给吓尿了,不过可以看得出如此复杂并非人为。既然是程序混淆必定会有他的混淆规则,也就是“套路”。


一、混淆
经过总结我们得出了本次混淆的几点套路:
TL1.最明显的发现,用了非常多的if,while的嵌套以混淆对函数结构的整体把握
www.jpg
TL2.出现了必真必假的逻辑垃圾,这对我们后面分析有很大帮助
jjj.jpg
TL3.定义了相同意义的变量,仅仅被赋值过一次(不过未必是llvm的产物)
333.jpg
TL4.多出一堆无意义的变量来实现无意义代码和循环往复的跳转代码
如num2中看到的v12 v13
TL5.有一个关键变量,类似pc来实现跳转,本例为v8
vvv.jpg
TL6.多重嵌套时,真正有效的代码部分总是在条件判断pc全等的情况,可以直接忽略pc大于小于等判断
TL7.最后以while(类pc != xxx)来跳出准备结束函数
hs.jpg
有了上述套路,对我们恢复llvm混淆函数有非常大的帮助。 哦?你问我套路怎么得来的,先挑一个相对短一点的混淆函数,然后让我们一起愉快的F8吧!


二、恢复
其实前面说了一堆混淆的内容要作为恢复的根据,我们现在开始尝试恢复。在恢复前不得不提一下本例c6ec因为花指令无法F5,需要修花。
p.jpg
来到c6ec,F5提示没有function,p报错,找到报错地址patch program并c,然后回到c6ec p,F5,反编译结束,注意的是不要在我们patch的地方F8或下断点。
QQ截图20160405184136.jpg

恢复第一步,我命名为f,j变量聚类。
简单的说就是把变量分成功能变量,混淆变量,但是怎么区分呢:
我们手中已经有一些已知变量的分类:
FL1.类pc,单独一类
FL2.无效逻辑代码所用到的变量都可以认定为混淆变量(我起名为jx,j表示junk,x代表原变量名中的数字建议不改恢复方便)
FL3.本函数的输入参数,功能函数的输入参数都认为是f变量(我起名为fx,f表示func,x你懂了)

有了这些变量,开始聚类,和f变有比较,赋值,函数传参操作的全部定义为f变量,越吸越多跟画板中同色填充一样
同样的与j变量比较,赋值的变量互相吸收为同类

我们修复后会发现一部分f变量j变量互相操作的,要人工修复。优先设成f,宁可多分析无效的变量也绝对不可错杀f变量,还有一些始终不确定的保留原来的vx吧。

fs.jpg

接下来同义变量吸收,这步需要一些写一些代码来分析,但是着实有些帮助。思路是找到某些变量,这些变量当左值仅仅一次并且分析后可以用右值代替。
xs.jpg

然后前面有效代码只出现在类pc全等判断的块中,去这些块中找如果所有的不是全部j变量自己瞎玩,只要有函数调用或f变量操作全部下断,对,全部下断。去掉无效块后,估计只有十来个有效块。下断完全速跑,记录断点停留顺序,包括重复进入的顺序。如下图所示:
sssss.jpg

开一个编辑器,从小到大依次复制代码块,重复的只复制一次就可以了。

然后开始分析,只进入过一次的代码块很好分析一般只在开始和结束出现。出现过多次的肯定由if语句或循环语句实现,而在这里肯定是上文有代码块对类pc变量有过不同的赋值来实现if或循环。
tz.jpg

知道这些,在根据我们得到的代码块进入次序。我们开始拼接代码,假设进入顺序为1的块和顺序为2的块可以直接合并,这种块只运行一次,常见于刚开始或快结束。
假设进入顺序为5,10,19和进入顺序为6,11,20,的可以直接合并,当然看一下前者代码块中没有对类pc变量有可能不同的辅助。
其他的如进入顺序为8,13,25和进入顺序为9,27的函数,去关注期间对类pc变量赋不同值的条件,非常重要,如上图的f138<keylen就是循环条件之一。

有了这些信息我们就可以完完整整还原这个函数了。

c6ec函数最后的恢复结果:
[C] 纯文本查看 复制代码
#include <stdio.h>
char bookBase[256]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0B,0x16,0x09,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,
0x11,0x26,0x23,0x1F,0x1D,0x0D,0x30,0x04,0x33,0x00,0x00,0x00,0x36,0x08,0x35,0x00,
0x1A,0x2F,0x0E,0x12,0x00,0x05,0x2A,0x1C,0x14,0x2B,0x28,0x07,0x3E,0x1E,0x00,0x3A,
0x3C,0x19,0x0C,0x10,0x0F,0x2E,0x13,0x34,0x0A,0x02,0x3B,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x39,0x3D,0x06,0x1B,0x3F,0x21,0x00,0x29,0x01,0x38,0x2C,0x20,0x25,0x27,
0x18,0x22,0x31,0x32,0x24,0x15,0x00,0x37,0x17,0x2D,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

int main()/* fix sub_C6EC */
{
        char key[13]="11111111111";
        char out[20]={0};
        int f156_OK,f40_OK,f162_OK,i;
        int returnValue = 0;
        for(i=0;i<3;i++){
                f156_OK = (((bookBase[key[i*4+1]] << 22) ^ 0xFF000000) & (bookBase[key[i*4+1]] << 22))// 9 20 31
                + (bookBase[key[i*4]]<<16)
                + (((bookBase[key[i*4+1]] << 6) ^ 0xFFFFF0C0) & (bookBase[key[i*4+1]] << 6)); 

                out[i*3] = (unsigned int)f156_OK >> 16;

                f40_OK = ((bookBase[key[i*4+2]] >> 4) ^ 0xFFFFFFC) & (bookBase[key[i*4+2]] >> 4);// 10 21 32
                f162_OK = f156_OK + (bookBase[key[i*4+2]] << 12) + f40_OK;

                out[i*3+1]= (short)((short)f156_OK + ((short)bookBase[key[i*4+2]] << 12) + (short)f40_OK) >> 8;

                out[i*3+2] = 4 * bookBase[key[i*4+3]] + f162_OK;
        }
        returnValue = i*3;
        printf("%02x %02x %02x %02x ",out[0]&0xFF,out[1]&0xFF,out[2]&0xFF,out[3]&0xFF);
        printf("%02x %02x %02x %02x\n",out[4]&0xFF,out[5]&0xFF,out[6]&0xFF,out[7]&0xFF);
        return 0;
}


再贴上f,j聚类后的ida反编译代码:
[C] 纯文本查看 复制代码
int __fastcall keyGen0GostencodeA_C6EC(char *key, int keylen, int a3, int a4, int *a5)
{
  signed int j5; // r2@1
  signed int j6; // r6@3
  char v7; // r1@5
  char v8; // r2@7
  signed int u9; // r0@9
  int j10; // r0@23
  int j11; // r1@23
  signed int j12; // r0@23
  unsigned __int8 j13; // nf@25
  unsigned __int8 j14; // vf@25
  signed int j15; // r1@25
  unsigned __int8 j16; // zf@32
  int j17; // r1@71
  signed int j18; // r0@71
  signed int j19; // r1@73
  int j20; // r0@81
  int j21; // r1@81
  signed int j22; // r0@81
  signed int j23; // r1@83
  int j24; // r1@98
  signed int j25; // r0@98
  signed int j26; // r1@100
  int j27; // r1@106
  signed int j28; // r0@106
  signed int j29; // r1@108
  char notKeyEnd2Flag; // r0@122
  int j31; // r1@124
  int j32; // r0@124
  int j33; // r1@124
  signed int j34; // r0@124
  signed int j35; // r1@126
  int j36; // r0@132
  int j37; // r1@132
  signed int j38; // r0@132
  signed int j39; // r1@134
  unsigned int f40; // r1@140
  int result_; // r0@146
  int j42; // r1@149
  signed int j43; // r0@149
  signed int j44; // r1@151
  int j45; // r2@157
  int j46; // r1@157
  signed int j47; // r0@157
  signed int j48; // r1@159
  int j49; // r2@165
  int j50; // r0@165
  int j51; // r1@165
  int j52; // r0@165
  signed int j53; // r1@167
  int j54; // r0@173
  int j55; // r1@173
  signed int j56; // r0@173
  signed int j57; // r1@175
  char NotKeyEndFlag; // r0@185
  int j59; // r1@187
  int j60; // r0@187
  int j61; // r1@187
  signed int j62; // r0@187
  signed int j63; // r1@189
  int j64; // r0@201
  int j65; // r1@201
  signed int notEndFlag; // r0@201
  signed int j67; // r1@203
  char f68; // r0@211
  int j69; // r0@218
  int j70; // r1@218
  signed int j71; // r0@218
  signed int j72; // r1@220
  int j73; // r1@245
  int j74; // r0@245
  int j75; // r1@245
  signed int j76; // r0@245
  signed int j77; // r1@247
  int j78; // r0@254
  int j79; // r1@254
  signed int j80; // r0@254
  signed int j81; // r1@256
  int j82; // r0@277
  int j83; // r1@277
  signed int j84; // r0@277
  signed int j85; // r1@279
  int j86; // r1@289
  signed int j87; // r0@289
  signed int j88; // r1@291
  int j89; // r0@301
  int j90; // r1@301
  signed int j91; // r0@301
  signed int j92; // r1@303
  int j93; // r0@325
  int j94; // r1@325
  signed int j95; // r0@325
  signed int j96; // r1@327
  char v97; // zf@341
  int j98; // r1@347
  signed int j99; // r0@347
  signed int j100; // r1@349
  int result; // r0@354
  int v102; // r0@355
  char *v103; // r1@355
  int v104; // r2@355
  int v105; // r3@355
  int *j106; // [sp+0h] [bp-138h]@9
  int v107; // [sp+4h] [bp-134h]@9
  int *j108; // [sp+8h] [bp-130h]@9
  int *j109; // [sp+Ch] [bp-12Ch]@9
  int *j110; // [sp+10h] [bp-128h]@9
  int *j111; // [sp+14h] [bp-124h]@9
  int *j112; // [sp+18h] [bp-120h]@9
  int *j113; // [sp+1Ch] [bp-11Ch]@9
  int *j114; // [sp+20h] [bp-118h]@9
  int *j115; // [sp+24h] [bp-114h]@9
  char *key_; // [sp+28h] [bp-110h]@1
  int *j117; // [sp+2Ch] [bp-10Ch]@9
  int *j118; // [sp+30h] [bp-108h]@9
  int v119; // [sp+34h] [bp-104h]@9
  int *j120; // [sp+38h] [bp-100h]@9
  int *j121; // [sp+3Ch] [bp-FCh]@9
  int *v122; // [sp+40h] [bp-F8h]@9
  int *j123; // [sp+44h] [bp-F4h]@9
  int result__; // [sp+48h] [bp-F0h]@9
  int *j125; // [sp+4Ch] [bp-ECh]@9
  int *j126; // [sp+50h] [bp-E8h]@9
  int *j127; // [sp+54h] [bp-E4h]@9
  int *j128; // [sp+58h] [bp-E0h]@9
  int v129; // [sp+5Ch] [bp-DCh]@5
  int *j130; // [sp+60h] [bp-D8h]@9
  int i4_; // [sp+64h] [bp-D4h]@1
  int j132; // [sp+68h] [bp-D0h]@9
  int v133; // [sp+6Ch] [bp-CCh]@9
  int f134; // [sp+70h] [bp-C8h]@9
  int v135; // [sp+74h] [bp-C4h]@9
  int f136; // [sp+78h] [bp-C0h]@9
  int f137; // [sp+7Ch] [bp-BCh]@9
  int f138; // [sp+80h] [bp-B8h]@9
  int result___; // [sp+84h] [bp-B4h]@9
  int keylen_; // [sp+88h] [bp-B0h]@1
  int *j141; // [sp+8Ch] [bp-ACh]@9
  int f142; // [sp+90h] [bp-A8h]@1
  char j143; // [sp+96h] [bp-A2h]@7
  char j144; // [sp+97h] [bp-A1h]@9
  int *bookBase; // [sp+98h] [bp-A0h]@12
  int f146; // [sp+9Ch] [bp-9Ch]@12
  char notEndFlag_; // [sp+A3h] [bp-95h]@89
  int *bookBase_; // [sp+A4h] [bp-94h]@12
  int nowKeyChar; // [sp+A8h] [bp-90h]@122
  char NotKeyEndFlag_; // [sp+AEh] [bp-8Ah]@142
  char notKeyEnd2Flag_; // [sp+AFh] [bp-89h]@124
  int f152; // [sp+B0h] [bp-88h]@165
  int f153; // [sp+B4h] [bp-84h]@310
  int j154; // [sp+B8h] [bp-80h]@157
  int j155; // [sp+BCh] [bp-7Ch]@165
  int f156; // [sp+C0h] [bp-78h]@140
  int f157; // [sp+C4h] [bp-74h]@32
  int v158; // [sp+C8h] [bp-70h]@32
  int f159; // [sp+CCh] [bp-6Ch]@157
  int j160; // [sp+D0h] [bp-68h]@32
  unsigned int f161; // [sp+D4h] [bp-64h]@140
  unsigned int f162; // [sp+D8h] [bp-60h]@140
  char f163; // [sp+DFh] [bp-59h]@32
  int f164; // [sp+E0h] [bp-58h]@32
  int v165; // [sp+E4h] [bp-54h]@32
  int f166; // [sp+E8h] [bp-50h]@32
  int j167; // [sp+ECh] [bp-4Ch]@120
  char f168; // [sp+F2h] [bp-46h]@230
  char f169; // [sp+F3h] [bp-45h]@120
  int f170; // [sp+F4h] [bp-44h]@120
  int j171; // [sp+F8h] [bp-40h]@227
  int v172; // [sp+FCh] [bp-3Ch]@227
  int f136_; // [sp+100h] [bp-38h]@17
  int f174; // [sp+104h] [bp-34h]@17
  int f175; // [sp+108h] [bp-30h]@17
  int result_____; // [sp+10Ch] [bp-2Ch]@17
  int result____; // [sp+110h] [bp-28h]@218
  int v178; // [sp+114h] [bp-24h]@1

  key_ = key;
  f142 = a3;
  i4_ = a4;
  keylen_ = keylen;
  v178 = unk_4E04C;
  j5 = -579956637;
  if ( !keylen )
    j5 = 20066;
  LOWORD(j6) = 9458;
  if ( !keylen )
    HIWORD(j5) = -22070;
  v7 = 0;
  v129 = j5;
  if ( !(((unk_556A4 - 1) * unk_556A4 ^ 0xFFFFFFFE) & (unk_556A4 - 1) * unk_556A4) )
    v7 = 1;
  j143 = v7;
  v8 = 0;
  if ( unk_556D4 < 10 )
    v8 = 1;
  j144 = v8;
  j132 = (int)&unk_4C000;
  HIWORD(j6) = 30605;
  j115 = &dword_4BFF4;
  j114 = &dword_4BFF4;
  j113 = &dword_4BFF4;
  j112 = &dword_4BFF4;
  j111 = &dword_4BFF4;
  j110 = &dword_4BFF4;
  j109 = &dword_4BFF4;
  j108 = &dword_4BFF4;
  v107 = (int)&unk_4C000;
  j106 = &dword_4BFF4;
  j117 = &dword_4BFF4;
  j118 = &dword_4BFF4;
  v119 = (int)&unk_474BF;
  result___ = -19253;
  j120 = &dword_4BFF4;
  f138 = -19253;
  j121 = &dword_4BFF4;
  f137 = -19253;
  v122 = &dword_4BFF4;
  f136 = -19253;
  j123 = &dword_4BFF4;
  v133 = -19253;
  j125 = &dword_4BFF4;
  f134 = -19253;
  j126 = &dword_4BFF4;
  v135 = -19253;
  j127 = &dword_4BFF4;
  result__ = -19253;
  j128 = &dword_4BFF4;
  j130 = &dword_4BFF4;
  j141 = &dword_4BFF4;
  u9 = -768040915;
  do
  {
    while ( 1 )
    {
      while ( 1 )
      {
        while ( 1 )
        {
          while ( 1 )
          {
            while ( 1 )
            {
              while ( 1 )
              {
                while ( 1 )
                {
                  while ( 1 )
                  {
                    while ( 1 )
                    {
                      while ( 1 )
                      {
                        while ( 1 )
                        {
                          while ( 1 )
                          {
                            while ( 1 )
                            {
                              while ( 1 )
                              {
                                while ( 1 )
                                {
                                  while ( 1 )
                                  {
                                    while ( 1 )
                                    {
                                      while ( 1 )
                                      {
                                        while ( 1 )
                                        {
                                          while ( 1 )
                                          {
                                            while ( 1 )
                                            {
                                              while ( 1 )
                                              {
                                                while ( 1 )
                                                {
                                                  while ( 1 )
                                                  {
                                                    while ( 1 )
                                                    {
                                                      while ( 1 )
                                                      {
                                                        while ( 1 )
                                                        {
                                                          while ( 1 )
                                                          {
                                                            while ( 1 )
                                                            {
                                                              while ( 1 )
                                                              {
                                                                while ( 1 )
                                                                {
                                                                  while ( 1 )
                                                                  {
                                                                    while ( 1 )
                                                                    {
                                                                      while ( 1 )
                                                                      {
                                                                        while ( 1 )
                                                                        {
                                                                          while ( 1 )
                                                                          {
                                                                            while ( 1 )
                                                                            {
                                                                              while ( 1 )
                                                                              {
                                                                                while ( 1 )
                                                                                {
                                                                                  while ( 1 )
                                                                                  {
                                                                                    while ( 1 )
                                                                                    {
                                                                                      while ( 1 )
                                                                                      {
                                                                                        while ( 1 )
                                                                                        {
                                                                                          while ( 1 )
                                                                                          {
                                                                                            while ( 1 )
                                                                                            {
                                                                                              while ( 1 )
                                                                                              {
                                                                                                while ( 1 )
                                                                                                {
                                                                                                  while ( 1 )
                                                                                                  {
                                                                                                    while ( 1 )
                                                                                                    {
                                                                                                      while ( 1 )
                                                                                                      {
                                                                                                        while ( u9 <= -1901452613 )
                                                                                                        {
                                                                                                          if ( u9 == -2107012333 )
                                                                                                          {
                                                                                                            ClearMemory(f142, f146, 0);// 3
                                                                                                            bookBase_ = bookBase;
                                                                                                            u9 = 615070360;
                                                                                                          }
                                                                                                        }
                                                                                                        if ( u9 <= 2144827489 )
                                                                                                          break;
                                                                                                        if ( u9 == 2144827490 )
                                                                                                          u9 = 1412174859;
                                                                                                      }
                                                                                                      if ( u9 <= 2005738737 )
                                                                                                        break;
                                                                                                      if ( u9 == j6 )// rubbish
                                                                                                      {
                                                                                                        j10 = (*(_DWORD *)*(j141 - 120) - 1) * *(_DWORD *)*(j141 - 120);
                                                                                                        j11 = *(_DWORD *)*(j141 - 119);
                                                                                                        j16 = ((j10 ^ 0xFFFFFFFE) & j10) == 0;
                                                                                                        j12 = 0;
                                                                                                        if ( j16 )
                                                                                                          j12 = 1;
                                                                                                        j14 = __OFSUB__(j11, 10);
                                                                                                        j13 = j11 - 10 < 0;
                                                                                                        j15 = 0;
                                                                                                        if ( j13 ^ j14 )
                                                                                                          j15 = 1;
                                                                                                        j16 = (j12 ^ j15 | j12 & j15) == 0;
                                                                                                        u9 = 200515412;
                                                                                                        if ( !j16 )
                                                                                                          u9 = 1875019872;
                                                                                                      }
                                                                                                    }
                                                                                                    if ( u9 > -1862303910 )
                                                                                                      break;
                                                                                                    if ( u9 == -1901452612 )
                                                                                                    {
                                                                                                      f136_ = f136;// 6 16 27 35
                                                                                                      f174 = f137;
                                                                                                      f175 = f138;
                                                                                                      result_____ = result___;
                                                                                                      u9 = -1343014647;
                                                                                                      if ( f138 < keylen_ )
                                                                                                        u9 = -211159207;
                                                                                                    }
                                                                                                  }
                                                                                                  if ( u9 > -1725333822 )
                                                                                                    break;
                                                                                                  if ( u9 == -1862303909 )
                                                                                                  {
                                                                                                    f164 = f157 + 1;// 11 22 33
                                                                                                    *(_BYTE *)f157 = f163;// out[i*3+1]
                                                                                                    v165 = v158 + 1;
                                                                                                    f166 = *(_BYTE *)j160;
                                                                                                    j16 = f166 == *(_BYTE *)j132;
                                                                                                    u9 = 408476889;
                                                                                                    v135 = j160;
                                                                                                    if ( !j16 )
                                                                                                      u9 = 5570;
                                                                                                    f134 = f164;
                                                                                                    if ( !j16 )
                                                                                                      HIWORD(u9) = -8680;
                                                                                                    v133 = v165;
                                                                                                  }
                                                                                                }
                                                                                                if ( u9 > -1693408896 )
                                                                                                  break;
                                                                                                if ( u9 == -1725333821 )
                                                                                                  u9 = 1485624584;
                                                                                              }
                                                                                              if ( u9 <= 1926646756 )
                                                                                                break;
                                                                                              if ( u9 == 1926646757 )
                                                                                                u9 = 1265469521;
                                                                                            }
                                                                                            if ( u9 <= 1911860848 )
                                                                                              break;
                                                                                            if ( u9 == 1911860849 )
                                                                                            {
                                                                                              j20 = *(j130 - 120);
                                                                                              f146 = *(_DWORD *)i4_;// 1
                                                                                              j21 = *(_DWORD *)*(j130 - 119);
                                                                                              j16 = (((*(_DWORD *)j20 - 1) * *(_DWORD *)j20 ^ 0xFFFFFFFE) & (*(_DWORD *)j20 - 1) * *(_DWORD *)j20) == 0;
                                                                                              j22 = 0;
                                                                                              if ( j16 )
                                                                                                j22 = 1;
                                                                                              j14 = __OFSUB__(j21, 10);
                                                                                              j13 = j21 - 10 < 0;
                                                                                              j23 = 0;
                                                                                              if ( j13 ^ j14 )
                                                                                                j23 = 1;
                                                                                              j16 = (j22 ^ j23 | j22 & j23) == 0;
                                                                                              u9 = -1322783334;
                                                                                              if ( !j16 )
                                                                                                u9 = -787925199;
                                                                                            }
                                                                                          }
                                                                                          if ( u9 <= 1888903569 )
                                                                                            break;
                                                                                          if ( u9 == 1888903570 )
                                                                                          {
                                                                                            u9 = -2107012333;
                                                                                            if ( notEndFlag_ )
                                                                                              u9 = -1446359454;
                                                                                          }
                                                                                        }
                                                                                        if ( u9 <= 1875019871 )
                                                                                          break;
                                                                                        if ( u9 == 1875019872 )
                                                                                          u9 = 1826254214;
                                                                                      }
                                                                                      if ( u9 <= 1826254213 )
                                                                                        break;
                                                                                      if ( u9 == 1826254214 )
                                                                                        u9 = v129;
                                                                                    }
                                                                                    if ( u9 <= 1786078353 )
                                                                                      break;
                                                                                    if ( u9 == 1786078354 )// rubbish
                                                                                    {
                                                                                      j24 = *(_DWORD *)*(j128 - 119);
                                                                                      j25 = 0;
                                                                                      if ( (~((*(_DWORD *)*(j128 - 120)
                                                                                             - 1)
                                                                                            * *(_DWORD *)*(j128 - 120)) | 0xFFFFFFFE) == -1 )
                                                                                        j25 = 1;
                                                                                      j14 = __OFSUB__(j24, 10);
                                                                                      j13 = j24 - 10 < 0;
                                                                                      j26 = 0;
                                                                                      if ( j13 ^ j14 )
                                                                                        j26 = 1;
                                                                                      j16 = (j25 ^ j26 | j25 & j26) == 0;
                                                                                      u9 = -1725333821;
                                                                                      if ( !j16 )
                                                                                        u9 = 1485624584;
                                                                                    }
                                                                                  }
                                                                                  if ( u9 <= 1759492015 )
                                                                                    break;
                                                                                  if ( u9 == 1759492016 )// rubbish
                                                                                  {
                                                                                    j27 = *(_DWORD *)*(j127 - 119);
                                                                                    j28 = 0;
                                                                                    if ( (~((*(_DWORD *)*(j127 - 120) - 1)
                                                                                          * *(_DWORD *)*(j127 - 120)) | 0xFFFFFFFE) != -1 )
                                                                                      j28 = 1;
                                                                                    j14 = __OFSUB__(j27, 9);
                                                                                    j16 = j27 == 9;
                                                                                    j13 = j27 - 9 < 0;
                                                                                    j29 = 0;
                                                                                    if ( !((unsigned __int8)(j13 ^ j14) | j16) )
                                                                                      j29 = 1;
                                                                                    j16 = (j28 ^ j29 | (j28 | j29) ^ 1) == 0;
                                                                                    u9 = -1224362487;
                                                                                    if ( !j16 )
                                                                                      u9 = 552383739;
                                                                                  }
                                                                                }
                                                                                if ( u9 <= 1668326195 )
                                                                                  break;
                                                                                if ( u9 == 1668326196 )
                                                                                  u9 = 1386747132;
                                                                              }
                                                                              if ( u9 <= 1662374462 )
                                                                                break;
                                                                              if ( u9 == 1662374463 )
                                                                                u9 = -709053658;
                                                                            }
                                                                            if ( u9 <= 1628979202 )
                                                                              break;
                                                                            if ( u9 == 1628979203 )
                                                                              u9 = 1003626917;
                                                                          }
                                                                          if ( u9 <= 1559277927 )
                                                                            break;
                                                                          if ( u9 == 1559277928 )
                                                                          {
                                                                            *(_BYTE *)f164 = f169;// 14 25 out[i*3+2]
                                                                            v135 = j167;
                                                                            v133 = v165 + 1;
                                                                            f134 = f170;
                                                                            u9 = 408476889;
                                                                          }
                                                                        }
                                                                        if ( u9 <= 1485624583 )
                                                                          break;
                                                                        if ( u9 == 1485624584 )
                                                                        {
                                                                          notKeyEnd2Flag = 0;
                                                                          if ( nowKeyChar != 10 )// 8 18 29
                                                                            notKeyEnd2Flag = 1;
                                                                          j31 = *j126;
                                                                          notKeyEnd2Flag_ = notKeyEnd2Flag;
                                                                          j32 = (*(_DWORD *)j31 - 1) * *(_DWORD *)j31;
                                                                          j33 = *(_DWORD *)*j126;
                                                                          j16 = ((j32 ^ 0xFFFFFFFE) & j32) == 0;
                                                                          j34 = 0;
                                                                          if ( j16 )
                                                                            j34 = 1;
                                                                          j14 = __OFSUB__(j33, 10);
                                                                          j13 = j33 - 10 < 0;
                                                                          j35 = 0;
                                                                          if ( j13 ^ j14 )
                                                                            j35 = 1;
                                                                          j16 = (j34 ^ j35 | j34 & j35) == 0;
                                                                          u9 = -1725333821;
                                                                          if ( !j16 )
                                                                            u9 = 2144827490;
                                                                        }
                                                                      }
                                                                      if ( u9 <= 1412174858 )
                                                                        break;
                                                                      if ( u9 == 1412174859 )// rubbish
                                                                      {
                                                                        j36 = (*(_DWORD *)*j125 - 1) * *(_DWORD *)*j125;
                                                                        j37 = *(_DWORD *)*j125;
                                                                        j16 = ((j36 ^ 0xFFFFFFFE) & j36) == 0;
                                                                        j38 = 0;
                                                                        if ( j16 )
                                                                          j38 = 1;
                                                                        j14 = __OFSUB__(j37, 10);
                                                                        j13 = j37 - 10 < 0;
                                                                        j39 = 0;
                                                                        if ( j13 ^ j14 )
                                                                          j39 = 1;
                                                                        j16 = (j38 & j39 | j38 ^ j39) == 0;
                                                                        u9 = -329744832;
                                                                        if ( !j16 )
                                                                          u9 = -130772934;
                                                                      }
                                                                    }
                                                                    if ( u9 <= 1386747131 )
                                                                      break;
                                                                    if ( u9 == 1386747132 )
                                                                    {
                                                                      f40 = ((f161 >> 4) ^ 0xFFFFFFC) & (f161 >> 4);// 10 21 32
                                                                      f162 = f156 + (f161 << 12) + f40;
                                                                      f163 = (unsigned __int16)((_WORD)f156
                                                                                              + ((_WORD)f161 << 12)
                                                                                              + (_WORD)f40) >> 8;
                                                                      u9 = -1862303909;
                                                                    }
                                                                  }
                                                                  if ( u9 <= 1360782912 )
                                                                    break;
                                                                  if ( u9 == 1360782913 )
                                                                  {
                                                                    u9 = -206615233;
                                                                    if ( NotKeyEndFlag_ )
                                                                      u9 = 1786078354;
                                                                  }
                                                                }
                                                                if ( u9 <= 1324097311 )
                                                                  break;
                                                                if ( u9 == 1324097312 )
                                                                {
                                                                  result_ = result_____;// 36
                                                                  goto LABEL_147;
                                                                }
                                                              }
                                                              if ( u9 <= 1291296763 )
                                                                break;
                                                              if ( u9 == 1291296764 )// rubbish
                                                              {
                                                                j42 = *(_DWORD *)*j123;
                                                                j43 = 0;
                                                                if ( (~((*(_DWORD *)*j123 - 1) * *(_DWORD *)*j123) | 0xFFFFFFFE) == -1 )
                                                                  j43 = 1;
                                                                j14 = __OFSUB__(j42, 10);
                                                                j13 = j42 - 10 < 0;
                                                                j44 = 0;
                                                                if ( j13 ^ j14 )
                                                                  j44 = 1;
                                                                j16 = (j43 & j44 | j43 ^ j44) == 0;
                                                                u9 = 517347731;
                                                                if ( !j16 )
                                                                  u9 = 1324097312;
                                                              }
                                                            }
                                                            if ( u9 <= 1265469520 )
                                                              break;
                                                            if ( u9 == 1265469521 )// rubbish
                                                            {
                                                              j160 = j154 + 1;
                                                              j45 = *v122;
                                                              f161 = *((_BYTE *)bookBase + f159);
                                                              j46 = *(_DWORD *)*v122;
                                                              j47 = 0;
                                                              if ( (~((*(_DWORD *)j45 - 1) * *(_DWORD *)j45) | 0xFFFFFFFE) == -1 )
                                                                j47 = 1;
                                                              j14 = __OFSUB__(j46, 10);
                                                              j13 = j46 - 10 < 0;
                                                              j48 = 0;
                                                              if ( j13 ^ j14 )
                                                                j48 = 1;
                                                              j16 = (j47 ^ j48 | j47 & j48) == 0;
                                                              u9 = 1926646757;
                                                              if ( !j16 )
                                                                u9 = 1668326196;
                                                            }
                                                          }
                                                          if ( u9 <= 1003626916 )
                                                            break;
                                                          if ( u9 == 1003626917 )// rubbish
                                                          {
                                                            j154 = f152 + 1;
                                                            j49 = *j121;
                                                            j155 = *((_BYTE *)bookBase + *(_BYTE *)f152);
                                                            j50 = ~-*(_DWORD *)j49 * *(_DWORD *)j49;
                                                            j51 = *(_DWORD *)*j121;
                                                            j52 = (j50 ^ 0xFFFFFFFE) & j50;
                                                            if ( j52 )
                                                              j52 = 1;
                                                            j14 = __OFSUB__(j51, 9);
                                                            j16 = j51 == 9;
                                                            j13 = j51 - 9 < 0;
                                                            j53 = 0;
                                                            if ( !((unsigned __int8)(j13 ^ j14) | j16) )
                                                              j53 = 1;
                                                            j16 = (j52 ^ j53 | (j52 | j53) ^ 1) == 0;
                                                            u9 = 1628979203;
                                                            if ( !j16 )
                                                              u9 = 27249737;
                                                          }
                                                        }
                                                        if ( u9 <= 881679339 )
                                                          break;
                                                        if ( u9 == 881679340 )// rubbish
                                                        {
                                                          j54 = (*(_DWORD *)*j120 - 1) * *(_DWORD *)*j120;
                                                          j55 = *(_DWORD *)*j120;
                                                          j16 = ((j54 ^ 0xFFFFFFFE) & j54) == 0;
                                                          j56 = 0;
                                                          if ( j16 )
                                                            j56 = 1;
                                                          j14 = __OFSUB__(j55, 10);
                                                          j13 = j55 - 10 < 0;
                                                          j57 = 0;
                                                          if ( j13 ^ j14 )
                                                            j57 = 1;
                                                          j16 = (j56 & j57 | j56 ^ j57) == 0;
                                                          u9 = 517347731;
                                                          if ( !j16 )
                                                            u9 = 1291296764;
                                                        }
                                                      }
                                                      if ( u9 <= 782683747 )
                                                        break;
                                                      if ( u9 == 782683748 )
                                                        u9 = 416826029;
                                                    }
                                                    if ( u9 <= 615070359 )
                                                      break;
                                                    if ( u9 == 615070360 )
                                                    {
                                                      ((void (__fastcall *)(int *, int, signed int))sub_14B4A)(
                                                        bookBase_,
                                                        v119,
                                                        256);// 4
                                                      u9 = -1693408895;
                                                    }
                                                  }
                                                  if ( u9 <= 552383738 )
                                                    break;
                                                  if ( u9 == 552383739 )
                                                  {
                                                    NotKeyEndFlag = 0;// 7 17 28
                                                    if ( nowKeyChar != 13 )
                                                      NotKeyEndFlag = 1;
                                                    j59 = *j118;
                                                    NotKeyEndFlag_ = NotKeyEndFlag;
                                                    j60 = (*(_DWORD *)j59 - 1) * *(_DWORD *)j59;
                                                    j61 = *(_DWORD *)*j118;
                                                    j16 = ((j60 ^ 0xFFFFFFFE) & j60) == 0;
                                                    j62 = 0;
                                                    if ( j16 )
                                                      j62 = 1;
                                                    j14 = __OFSUB__(j61, 10);
                                                    j13 = j61 - 10 < 0;
                                                    j63 = 0;
                                                    if ( j13 ^ j14 )
                                                      j63 = 1;
                                                    j16 = (j62 ^ j63 | j62 & j63) == 0;
                                                    u9 = -1224362487;
                                                    if ( !j16 )
                                                      u9 = -327612536;
                                                  }
                                                }
                                                if ( u9 <= 517347730 )
                                                  break;
                                                if ( u9 == 517347731 )
                                                  u9 = 1291296764;
                                              }
                                              if ( u9 <= 492339595 )
                                                break;
                                              if ( u9 == 492339596 )
                                              {
                                                u9 = -206615233;
                                                if ( notKeyEnd2Flag_ )
                                                  u9 = -341342023;
                                              }
                                            }
                                            if ( u9 <= 416826028 )
                                              break;
                                            if ( u9 == 416826029 )// rubbish
                                            {
                                              j64 = (*(_DWORD *)*j117 - 1) * *(_DWORD *)*j117;
                                              j65 = *(_DWORD *)*j117;
                                              j16 = ((j64 ^ 0xFFFFFFFE) & j64) == 0;
                                              notEndFlag = 0;
                                              if ( j16 )
                                                notEndFlag = 1;
                                              j14 = __OFSUB__(j65, 10);
                                              j13 = j65 - 10 < 0;
                                              j67 = 0;
                                              if ( j13 ^ j14 )
                                                j67 = 1;
                                              j16 = (notEndFlag & j67 | notEndFlag ^ j67) == 0;
                                              u9 = 782683748;
                                              if ( !j16 )
                                                u9 = -594247879;
                                            }
                                          }
                                          if ( u9 <= 408476888 )
                                            break;
                                          if ( u9 == 408476889 )
                                          {
                                            result___ = v133;
                                            f138 = f175 + 4;
                                            u9 = -1901452612;
                                            f137 = f134;
                                            f136 = v135;// 15 26 34
                                          }
                                        }
                                        if ( u9 <= 373449796 )
                                          break;
                                        if ( u9 == 373449797 )
                                        {
                                          f68 = 0;
                                          if ( f146 < keylen_ )
                                            f68 = 1;// 2
                                          notEndFlag_ = f68;
                                          u9 = 1888903570;
                                        }
                                      }
                                      if ( u9 <= 268320251 )
                                        break;
                                      if ( u9 == 268320252 )
                                        u9 = -968901991;
                                    }
                                    if ( u9 > -1687541981 )
                                      break;
                                    if ( u9 == -1693408895 )
                                    {
                                      j17 = *(_DWORD *)*(j115 - 119);
                                      j18 = 0;
                                      if ( (~((*(_DWORD *)*(j115 - 120) - 1) * *(_DWORD *)*(j115 - 120)) | 0xFFFFFFFE) == -1 )
                                        j18 = 1;
                                      j14 = __OFSUB__(j17, 10);
                                      j13 = j17 - 10 < 0;
                                      j19 = 0;
                                      if ( j13 ^ j14 )// rubbish
                                        j19 = 1;
                                      j16 = (j18 & j19 | j18 ^ j19) == 0;
                                      u9 = 1662374463;
                                      if ( !j16 )
                                        u9 = -709053658;
                                    }
                                  }
                                  if ( u9 > -1642076405 )
                                    break;
                                  if ( u9 == -1687541980 )
                                  {
                                    result____ = result__;
                                    j69 = (*(_DWORD *)*j114 - 1) * *(_DWORD *)*j114;
                                    j70 = *(_DWORD *)*j114;
                                    j16 = ((j69 ^ 0xFFFFFFFE) & j69) == 0;
                                    j71 = 0;
                                    if ( j16 )
                                      j71 = 1;
                                    j14 = __OFSUB__(j70, 10);
                                    j13 = j70 - 10 < 0;
                                    j72 = 0;
                                    if ( j13 ^ j14 )
                                      j72 = 1;
                                    j16 = (j71 & j72 | j71 ^ j72) == 0;
                                    u9 = 782683748;
                                    if ( !j16 )
                                      u9 = 416826029;
                                  }
                                }
                                if ( u9 > -1447795291 )
                                  break;
                                if ( u9 == -1642076404 )// dead code
                                {
                                  f136 = j171;
                                  f138 = v172;
                                  result___ = result_____;
                                  f137 = f174;
                                  u9 = -1901452612;
                                }
                              }
                              if ( u9 > -1446359455 )
                                break;
                              if ( u9 == -1447795290 )
                              {
                                f169 = 4 * f168 + f162;// 13 24
                                f170 = f164 + 1;
                                u9 = 1559277928;
                              }
                            }
                            if ( u9 > -1343014648 )
                              break;
                            if ( u9 == -1446359454 )
                            {
                              result_ = 0;      // dead code
LABEL_147:
                              result__ = result_;// 37
                              u9 = -1687541980;
                            }
                          }
                          if ( u9 > -1322783335 )
                            break;
                          if ( u9 == -1343014647 )
                            u9 = 881679340;
                        }
                        if ( u9 > -1224362488 )
                          break;
                        if ( u9 == -1322783334 )
                          u9 = 1911860849;
                      }
                      if ( u9 > -968901992 )
                        break;
                      if ( u9 == -1224362487 )
                        u9 = 552383739;
                    }
                    if ( u9 > -917428403 )
                      break;
                    if ( u9 == -968901991 )     // rubbish
                    {
                      j73 = *j113;
                      bookBase = (int *)(&j106 - 64);
                      j74 = (*(_DWORD *)j73 - 1) * *(_DWORD *)j73;
                      j75 = *(_DWORD *)*j113;
                      j16 = ((j74 ^ 0xFFFFFFFE) & j74) == 0;
                      j76 = 0;
                      if ( j16 )
                        j76 = 1;
                      j14 = __OFSUB__(j75, 10);
                      j13 = j75 - 10 < 0;
                      j77 = 0;
                      if ( j13 ^ j14 )
                        j77 = 1;
                      j16 = (j76 ^ j77 | j76 & j77) == 0;
                      u9 = 268320252;
                      if ( !j16 )
                        u9 = -821278251;
                    }
                  }
                  if ( u9 > -858444357 )
                    break;
                  if ( u9 == -917428402 )       // rubbish
                  {
                    j78 = (*(_DWORD *)*j112 - 1) * *(_DWORD *)*j112;
                    j79 = *(_DWORD *)*j112;
                    j16 = ((j78 ^ 0xFFFFFFFE) & j78) == 0;
                    j80 = 0;
                    if ( j16 )
                      j80 = 1;
                    j14 = __OFSUB__(j79, 10);
                    j13 = j79 - 10 < 0;
                    j81 = 0;
                    if ( j13 ^ j14 )
                      j81 = 1;
                    j16 = (j80 & j81 | j80 ^ j81) == 0;
                    u9 = 200515412;
                    if ( !j16 )
                      u9 = 2005738738;
                  }
                }
                if ( u9 > -821278252 )
                  break;
                if ( u9 == -858444356 )
                {
                  v172 = f175 + 1;              // dead code
                  u9 = -1642076404;
                }
              }
              if ( u9 > -787925200 )
                break;
              if ( u9 == -821278251 )
                u9 = -917428402;
            }
            if ( u9 > -768040916 )
              break;
            if ( u9 == -787925199 )
              u9 = 373449797;
          }
          if ( u9 > -709053659 )
            break;
          if ( u9 == -768040915 )
          {
            u9 = 268320252;
            if ( ((unsigned __int8)(j143 ^ j144) | (unsigned __int8)~(~j143 | (unsigned __int8)~j144)) & 1 )
              u9 = -968901991;
          }
        }
        if ( u9 > -594247880 )
          break;
        if ( u9 == -709053658 )
        {
          j82 = (*(_DWORD *)*j111 - 1) * *(_DWORD *)*j111;
          j83 = *(_DWORD *)*j111;
          j16 = ((j82 ^ 0xFFFFFFFE) & j82) == 0;
          j84 = 0;
          if ( j16 )
            j84 = 1;
          j14 = __OFSUB__(j83, 10);
          j13 = j83 - 10 < 0;
          j85 = 0;
          if ( j13 ^ j14 )
            j85 = 1;
          j16 = (j84 ^ j85 | j84 & j85) == 0;
          u9 = 1662374463;
          if ( !j16 )
            u9 = -121304508;
        }
      }
      if ( u9 <= -579956638 )
        break;
      if ( u9 > -568846911 )
      {
        if ( u9 > -406745412 )
        {
          if ( u9 > -341342024 )
          {
            if ( u9 > -329744833 )
            {
              if ( u9 > -327612537 )
              {
                if ( u9 > -211159208 )
                {
                  if ( u9 > -206615234 )
                  {
                    if ( u9 > -130772935 )
                    {
                      if ( u9 > -121304509 )
                      {
                        if ( u9 > 27249736 )
                        {
                          if ( u9 > 74139172 )
                          {
                            switch ( u9 )
                            {
                              case 74139173:
                                f156 = (((j155 << 22) ^ 0xFF000000) & (j155 << 22))// 9 20 31
                                     + f153
                                     + (((j155 << 6) ^ 0xFFFFF0C0) & (j155 << 6));
                                f157 = f174 + 1;
                                *(_BYTE *)f174 = (unsigned int)f156 >> 16;// out[i*3]
                                v158 = result_____ + 1;
                                f159 = *(_BYTE *)j154;
                                v97 = f159 == *(_BYTE *)v107;
                                u9 = 408476889;
                                v135 = j154;
                                if ( !v97 )
                                  u9 = 31171;
                                f134 = f157;
                                if ( !v97 )
                                  HIWORD(u9) = 3061;
                                v133 = v158;
                                break;
                              case 200515412:
                                u9 = j6;
                                break;
                              case 200636867:   // rubbish
                                j98 = *(_DWORD *)*j106;
                                j99 = 0;
                                if ( (~((*(_DWORD *)*j106 - 1) * *(_DWORD *)*j106) | 0xFFFFFFFE) == -1 )
                                  j99 = 1;
                                j14 = __OFSUB__(j98, 10);
                                j13 = j98 - 10 < 0;
                                j100 = 0;
                                if ( j13 ^ j14 )
                                  j100 = 1;
                                j16 = (j99 & j100 | j99 ^ j100) == 0;
                                u9 = 1926646757;
                                if ( !j16 )
                                  u9 = 1265469521;
                                break;
                            }
                          }
                          else if ( u9 == 27249737 )
                          {
                            u9 = 74139173;
                          }
                        }
                        else if ( u9 == -121304508 )
                        {
                          f138 = 0;
                          result___ = 0;
                          u9 = -1901452612;
                          f137 = f142;          // 5
                          f136 = (int)key_;
                        }
                      }
                      else if ( u9 == -130772934 )                         // rubbish
                      {
                        j93 = (*(_DWORD *)*j108 - 1) * *(_DWORD *)*j108;
                        j94 = *(_DWORD *)*j108;
                        j16 = ((j93 ^ 0xFFFFFFFE) & j93) == 0;
                        j95 = 0;
                        if ( j16 )
                          j95 = 1;
                        j14 = __OFSUB__(j94, 10);
                        j13 = j94 - 10 < 0;
                        j96 = 0;
                        if ( j13 ^ j14 )
                          j96 = 1;
                        j16 = (j95 & j96 | j95 ^ j96) == 0;
                        u9 = -329744832;
                        if ( !j16 )
                          u9 = 492339596;
                      }
                    }
                    else if ( u9 == -206615233 )
                    {
                      j171 = f136_ + 1;
                      u9 = -858444356;
                    }
                  }
                  else if ( u9 == -211159207 )
                  {
                    nowKeyChar = *(_BYTE *)f136_;
                    u9 = 1759492016;
                  }
                }
                else if ( u9 == -327612536 )
                {
                  u9 = 1360782913;
                }
              }
              else if ( u9 == -329744832 )
              {
                u9 = -130772934;
              }
            }
            else if ( u9 == -341342023 )
            {
              f152 = f136_ + 1;
              f153 = *((_BYTE *)bookBase + nowKeyChar) << 16;// 8 19 30 f153=bookBase[nowKeyChar]<<16
              u9 = -406745411;
            }
          }
          else if ( u9 == -406745411 )                         // rubbish
          {
            j89 = ~-*(_DWORD *)*j109 * *(_DWORD *)*j109;
            j90 = *(_DWORD *)*j109;
            j16 = ((j89 ^ 0xFFFFFFFE) & j89) == 0;
            j91 = 0;
            if ( j16 )
              j91 = 1;
            j14 = __OFSUB__(j90, 10);
            j13 = j90 - 10 < 0;
            j92 = 0;
            if ( j13 ^ j14 )
              j92 = 1;
            j16 = (j91 ^ j92 | j91 & j92) == 0;
            u9 = 1628979203;
            if ( !j16 )
              u9 = 1003626917;
          }
        }
        else if ( u9 == -568846910 )
        {
          j167 = j160 + 1;                      // 12 23
          f168 = *((_BYTE *)bookBase + f166);
          u9 = -1447795290;
        }
      }
      else if ( u9 == -579956637 )                         // rubbish
      {
        j86 = *(_DWORD *)*j110;
        j87 = 0;
        if ( (~(~-*(_DWORD *)*j110 * *(_DWORD *)*j110) | 0xFFFFFFFE) == -1 )
          j87 = 1;
        j14 = __OFSUB__(j86, 10);
        j13 = j86 - 10 < 0;
        j88 = 0;
        if ( j13 ^ j14 )
          j88 = 1;
        j16 = (j87 & j88 | j87 ^ j88) == 0;
        u9 = -1322783334;
        if ( !j16 )
          u9 = 1911860849;
      }
    }
  }
  while ( u9 != -594247879 );
  result = result____;
  if ( v0 != v178 )
  {
    v102 = sub_19420();
    result = keyGenGostencodeA_DFA4(v102, v103, v104, v105, a5);
  }
  return result;
}


同学,今天,你了吗?

免费评分

参与人数 5威望 +3 热心值 +4 收起 理由
Ericky + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
infofans + 1 热心回复!
梦游枪手 + 1 用心讨论,共获提升!
蚯蚓翔龙 + 1 好似很复杂
Sound + 2 欢迎分析讨论交流,吾爱破解论坛有你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| czr27 发表于 2016-4-5 19:36
枫叶飘零 发表于 2016-4-5 19:31
前排膜拜大牛。对了,cm7为啥子无后缀

.so或.elf格式的文件,实际内容为带地址的二进制代码,也带其他信息,还可以带一些符号信息,cm7可以直接在手机上运行
头像被屏蔽
叫我屌炸天 发表于 2016-4-6 17:47
枫MapleLCG 发表于 2016-4-5 19:31
本帖最后由 枫叶飘零 于 2016-4-5 19:33 编辑

前排膜拜大牛。对了,cm7为啥子无后缀
bushcs 发表于 2016-4-5 19:33
膜拜大牛  虽然没看懂      
神话じ挚爱兰 发表于 2016-4-5 19:35
看不懂分析的,可能是我太笨。
85811248a 发表于 2016-4-5 19:37
同学,今天,你逆了吗?
Niuer 发表于 2016-4-5 19:46
基本没看懂 都是套路
冰楓丶殘瀷 发表于 2016-4-5 19:52
我就来打个酱油
背着家旅行 发表于 2016-4-5 20:24
看不懂分析的,可能是我太笨。
头像被屏蔽
ttyaohui 发表于 2016-4-5 20:31
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表