首页
社区
课程
招聘
[讨论]看一下这是什么加密算法
2015-8-14 11:04 3441

[讨论]看一下这是什么加密算法

2015-8-14 11:04
3441
int __cdecl DecryptData(int pData, int dataLen, int pRandomData, int randomDataLen)
{
  int v4; // ebp@0
  unsigned __int8 v5; // al@2
  char *v6; // esi@2
  char v7; // cl@3
  signed int v8; // ecx@6
  int *v9; // eax@6
  int v10; // edx@7
  __int16 v11; // cx@8
  __int16 v12; // si@8
  int v13; // esi@13
  int v14; // edi@13
  int v15; // ecx@13
  int *v16; // eax@13
  int v17; // esi@14
  int v18; // edx@15
  unsigned __int8 v19; // bl@15
  bool v20; // zf@15
  bool v21; // sf@16
  unsigned __int8 v22; // of@16
  int result; // eax@17
  __int16 v24; // di@18
  int v25; // eax@18
  __int16 v26; // cx@18
  __int16 v27; // si@18
  int v28; // ebx@20
  int v29; // eax@20
  __int16 v30; // bx@20
  __int16 v31; // bp@21
  __int16 v32; // di@23
  __int16 v33; // ax@24
  __int16 v34; // cx@24
  __int16 v35; // ax@26
  unsigned __int16 v36; // di@28
  unsigned __int16 v37; // ax@28
  int v38; // edx@30
  unsigned int v39; // ecx@30
  unsigned __int16 v40; // bx@33
  unsigned int v41; // ecx@35
  int v42; // esi@35
  unsigned __int16 v43; // bp@38
  unsigned __int16 v44; // di@38
  __int16 v45; // cx@38
  unsigned __int16 v46; // ax@38
  unsigned int v47; // ecx@40
  unsigned __int16 v48; // dx@40
  int v49; // edx@43
  int v50; // edi@43
  unsigned __int16 v51; // cx@44
  int v52; // ebp@46
  int v53; // ecx@48
  int v54; // ebx@51
  int v55; // ecx@51
  __int16 v56; // bx@51
  unsigned int v57; // ecx@53
  int v58; // esi@53
  __int16 v59; // bp@57
  __int16 v60; // cx@57
  unsigned int v61; // edx@61
  int v62; // esi@61
  __int16 v63; // ST2C_2@64
  __int16 v64; // cx@64
  __int16 v65; // ax@64
  __int16 v66; // di@67
  __int16 v67; // cx@67
  signed int v68; // eax@71
  int v69; // [sp-Ch] [bp-268h]@4
  int v70; // [sp-8h] [bp-264h]@4
  int *v71; // [sp-4h] [bp-260h]@4
  char *v72; // [sp+10h] [bp-24Ch]@13
  __int16 v73; // [sp+10h] [bp-24Ch]@67
  int v74; // [sp+14h] [bp-248h]@13
  char *v75; // [sp+14h] [bp-248h]@26
  signed int v76; // [sp+18h] [bp-244h]@14
  int v77; // [sp+18h] [bp-244h]@18
  signed int v78; // [sp+1Ch] [bp-240h]@13
  unsigned int v79; // [sp+28h] [bp-234h]@1
  unsigned int v80; // [sp+28h] [bp-234h]@18
  unsigned int v81; // [sp+2Ch] [bp-230h]@46
  __int16 v82; // [sp+34h] [bp-228h]@56
  _BYTE v83[3]; // [sp+3Ch] [bp-220h]@59
  __int16 v84; // [sp+44h] [bp-218h]@59
  __int16 v85; // [sp+4Ch] [bp-210h]@51
  int v86; // [sp+54h] [bp-208h]@20
  int v87; // [sp+58h] [bp-204h]@20
  signed int v88; // [sp+60h] [bp-1FCh]@26
  int v89; // [sp+64h] [bp-1F8h]@17
  int v90; // [sp+68h] [bp-1F4h]@17
  int v91; // [sp+6Ch] [bp-1F0h]@18
  int v92; // [sp+70h] [bp-1ECh]@18
  int v93; // [sp+74h] [bp-1E8h]@4
  int v94; // [sp+78h] [bp-1E4h]@6
  int v95; // [sp+7Ch] [bp-1E0h]@6
  int v96; // [sp+80h] [bp-1DCh]@6
  char v97; // [sp+84h] [bp-1D8h]@13
  int v98; // [sp+94h] [bp-1C8h]@20
  int v99; // [sp+A6h] [bp-1B6h]@18
  int v100; // [sp+B8h] [bp-1A4h]@23
  int v101; // [sp+CAh] [bp-192h]@18
  char v102; // [sp+DAh] [bp-182h]@26
  int v103; // [sp+E4h] [bp-178h]@6
  int v104; // [sp+F0h] [bp-16Ch]@6
  int v105; // [sp+F4h] [bp-168h]@6
  int v106; // [sp+F8h] [bp-164h]@6
  int v107; // [sp+FCh] [bp-160h]@6
  char v108; // [sp+15Ch] [bp-100h]@2

  v79 = 8 * ((unsigned int)dataLen >> 3);
  if ( pRandomData )
  {
    v71 = &v93;
    v70 = randomDataLen;
    v69 = pRandomData;
  }
  else
  {
    v5 = 0;
    v6 = &v108;
    do
    {
      v7 = v5 ^ (16 * v5 | (v5 >> 4));
      ++v5;
      *v6++ = v7;
    }
    while ( v5 < 0xFFu );
    v71 = &v93;
    v70 = 255;
    v69 = (int)&v108;
  }
  MD5Hash16(v69, v70, v71);
  v104 = v93;
  v105 = v94;
  v106 = v95;
  v107 = v96;
  v8 = 9;
  v9 = &v103;
  do
  {
    v10 = v8 + 1;
    if ( ((_BYTE)v8 + 1) & 7 )
    {
      if ( v8 & 7 )
      {
        v11 = *((_WORD *)v9 + 8) >> 7;
        v12 = *((_WORD *)v9 + 7) << 9;
      }
      else
      {
        v11 = *((_WORD *)v9 - 1) << 9;
        v12 = *(_WORD *)v9 >> 7;
      }
    }
    else
    {
      v11 = *((_WORD *)v9 + 7) << 9;
      v12 = *(_WORD *)v9 >> 7;
    }
    *((_WORD *)v9 + 14) = v12 ^ v11;
    v8 = v10;
    v9 = (int *)((char *)v9 + 2);
  }
  while ( (unsigned int)(v10 - 1) < 0x36 );
  v13 = 0;
  v14 = (int)&v97;
  v15 = 10;
  v74 = 0;
  v72 = &v97;
  v78 = 10;
  v16 = &v104;
  do
  {
    v17 = v13 + 12;
    v76 = 6;
    do
    {
      v18 = (unsigned __int8)v17;
      v16 = (int *)((char *)v16 + 2);
      v17 += 11;
      v14 += 18;
      LOWORD(v4) = (unsigned __int8)byte_540E5C[(unsigned __int8)byte_540E5C[v18]];
      v19 = v15;
      v15 += 7;
      v4 = (unsigned __int8)byte_540E5C[(unsigned __int8)byte_540E5C[v19]] + (v4 << 8);
      v20 = v76-- == 1;
      *(_WORD *)(v14 - 18) = *((_WORD *)v16 - 1) + v4;
    }
    while ( !v20 );
    v15 = v78 + 3;
    v13 = v74 + 1;
    v14 = (int)(v72 + 2);
    v22 = __OFSUB__(v78 + 3, 34);
    v20 = v78 == 31;
    v21 = v78 - 31 < 0;
    ++v74;
    v78 += 3;
    v72 += 2;
  }
  while ( (unsigned __int8)(v21 ^ v22) | v20 );
  result = v93;
  v89 = v93;
  v90 = v94;
  if ( (signed int)v79 > 0 )
  {
    v24 = v99;
    v25 = pData;
    v26 = v99 & 1;
    v27 = v101 & 1;
    v91 = v99 & 1;
    v92 = v101 & 1;
    v77 = pData;
    v80 = (v79 + 7) >> 3;
    while ( 1 )
    {
      v28 = *(_DWORD *)v25;
      v29 = *(_DWORD *)(v25 + 4);
      v86 = v28;
      v30 = v98 ^ v28;
      v87 = v29;
      v31 = v26 ? v24 - HIWORD(v86) : HIWORD(v86) - v24;
      v32 = v100 ^ v29;
      if ( v27 )
      {
        v33 = v101;
        v34 = HIWORD(v87);
      }
      else
      {
        v33 = HIWORD(v29);
        v34 = v101;
      }
      v35 = v33 - v34;
      v75 = &v102;
      v88 = 8;
      while ( 1 )
      {
        v36 = v30 + v32;
        v37 = v31 + v35;
        if ( v36 && v37 )
        {
          v38 = v36;
          v39 = (v36 * v37 & 0xFFFF) - (v36 * (unsigned int)v37 >> 16);
          if ( (signed int)v39 <= 0 )
            LOWORD(v39) = v36 * v37 - (v36 * (unsigned int)v37 >> 16) + 1;
        }
        else
        {
          v38 = v36;
          LOWORD(v39) = 1 - v37 - v36;
        }
        v40 = v39 ^ v30;
        if ( v36 && (_WORD)v39 )
        {
          v41 = (v38 * (unsigned __int16)v39 & 0xFFFF) - (v38 * (unsigned int)(unsigned __int16)v39 >> 16);
          LOWORD(v42) = v41;
          if ( (signed int)v41 <= 0 )
            LOWORD(v42) = v41 + 1;
        }
        else
        {
          v42 = 65537 - (unsigned __int16)v39 - v38;
        }
        v43 = v42 ^ v31;
        v44 = v36 - v40;
        v45 = *((_WORD *)v75 + 9);
        v46 = *((_WORD *)v75 + 9) ^ (v37 - v43);
        if ( v46 && v45 )
        {
          v47 = (v46 * *((_WORD *)v75 + 9) & 0xFFFF) - (v46 * (unsigned int)*((_WORD *)v75 + 9) >> 16);
          v48 = v46 * *((_WORD *)v75 + 9) - (v46 * (unsigned int)*((_WORD *)v75 + 9) >> 16);
          if ( (signed int)v47 <= 0 )
            v48 = v46 * *((_WORD *)v75 + 9) - (v46 * (unsigned int)*((_WORD *)v75 + 9) >> 16) + 1;
        }
        else
        {
          v48 = 1 - v45 - v46;
        }
        v49 = v48;
        v50 = v49 ^ v44;
        v51 = v50 & 1 ? v50 - (_WORD)v49 : v50 + (_WORD)v49;
        v81 = v51;
        LOBYTE(v81) = byte_540F5C[(unsigned __int8)v51];
        *(_WORD *)((char *)&v81 + 1) = (unsigned __int8)byte_540F5C[BYTE1(v81)];
        v52 = v81 ^ v43;
        if ( (_WORD)v52 && (_WORD)v81 )
        {
          v53 = ((unsigned __int16)v81 * (unsigned __int16)v52 & 0xFFFF)
              - ((unsigned __int16)v81 * (unsigned int)(unsigned __int16)v52 >> 16);
          if ( v53 <= 0 )
            LOWORD(v53) = v81 * (_WORD)v52 - ((unsigned __int16)v81 * (unsigned int)(unsigned __int16)v52 >> 16) + 1;
        }
        else
        {
          v53 = 65537 - (unsigned __int16)v52 - (unsigned __int16)v81;
        }
        v54 = (unsigned __int16)v53 ^ v40;
        LOBYTE(v85) = byte_540F5C[(unsigned __int8)v54];
        HIBYTE(v85) = byte_540F5C[BYTE1(v54)];
        v55 = *(_WORD *)v75;
        v56 = v85 - v55;
        if ( v85 != (_WORD)v55 && (_WORD)v55 )
        {
          v57 = ((unsigned __int16)(v85 - v55) * (unsigned __int16)v55 & 0xFFFF)
              - ((unsigned __int16)(v85 - v55) * (unsigned int)(unsigned __int16)v55 >> 16);
          LOWORD(v58) = v57;
          if ( (signed int)v57 <= 0 )
            LOWORD(v58) = v57 + 1;
        }
        else
        {
          v58 = 65537 - (unsigned __int16)v55 - (unsigned __int16)(v85 - v55);
        }
        LOBYTE(v82) = byte_540F5C[(unsigned __int8)v52];
        HIBYTE(v82) = byte_540F5C[BYTE1(v52)];
        if ( ((_BYTE)v82 - (_BYTE)v58) & 1 )
        {
          v59 = v82 - v58;
          v60 = v82 - v58 - v58;
        }
        else
        {
          v59 = v82 - v58;
          v60 = v82;
        }
        v83[0] = byte_540F5C[(unsigned __int8)v60];
        *(_WORD *)&v83[1] = (unsigned __int8)byte_540F5C[HIBYTE(v60)];
        LOBYTE(v84) = byte_540F5C[(unsigned __int8)v50];
        HIBYTE(v84) = byte_540F5C[BYTE1(v50)];
        if ( *(_WORD *)v83 && v84 != *(_WORD *)v83 )
        {
          v61 = ((unsigned __int16)(v84 - *(_WORD *)v83) * *(unsigned __int16 *)v83 & 0xFFFF)
              - ((unsigned __int16)(v84 - *(_WORD *)v83) * (unsigned int)*(unsigned __int16 *)v83 >> 16);
          LOWORD(v62) = (v84 - *(_WORD *)v83) * *(_WORD *)v83
                      - ((unsigned __int16)(v84 - *(_WORD *)v83) * (unsigned int)*(unsigned __int16 *)v83 >> 16);
          if ( (signed int)v61 <= 0 )
            LOWORD(v62) = (v84 - *(_WORD *)v83) * *(_WORD *)v83
                        - ((unsigned __int16)(v84 - *(_WORD *)v83) * (unsigned int)*(unsigned __int16 *)v83 >> 16)
                        + 1;
        }
        else
        {
          v62 = 65537 - *(unsigned __int16 *)v83 - (unsigned __int16)(v84 - *(_WORD *)v83);
        }
        LOBYTE(v63) = byte_540F5C[(unsigned __int8)v46];
        v30 = *((_WORD *)v75 - 36) ^ v56;
        HIBYTE(v63) = byte_540F5C[HIBYTE(v46)];
        v64 = *((_WORD *)v75 - 27);
        v65 = v63 - v62;
        v31 = v64 & 1 ? v64 - v59 : v59 - v64;
        v66 = *((_WORD *)v75 - 18) ^ (v84 - *(_WORD *)v83);
        v67 = *((_WORD *)v75 - 9);
        v73 = *((_WORD *)v75 - 18) ^ (v84 - *(_WORD *)v83);
        v35 = v67 & 1 ? v67 - v65 : v65 - v67;
        v20 = v88 == 1;
        v75 -= 2;
        --v88;
        if ( v20 )
          break;
        v32 = v73;
      }
      *(_WORD *)(v77 + 6) = v35;
      *(_WORD *)v77 = v30;
      *(_WORD *)(v77 + 2) = v31;
      *(_WORD *)(v77 + 4) = v66;
      v68 = 0;
      do
      {
        *(_BYTE *)(v77 + v68) ^= *((_BYTE *)&v89 + v68);
        ++v68;
      }
      while ( v68 < 8 );
      v89 = v86;
      result = v80 - 1;
      v20 = v80 == 1;
      v90 = v87;
      v77 += 8;
      --v80;
      if ( v20 )
        break;
      v26 = v91;
      v24 = v99;
      v27 = v92;
      v25 = v77;
    }
  }
  return result;
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回