Помогите понять алгорит шифрования.

Тема в разделе "WASM.CRYPTO", создана пользователем AllexInTheDark, 25 сен 2008.

  1. AllexInTheDark

    AllexInTheDark New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2008
    Сообщения:
    7
    Код (Text):
    1. int __thiscall sub_45AA20(int this, LPCSTR lpFileName)
    2. {
    3.   HANDLE v2; // eax@1
    4.   int v3; // edi@1
    5.   signed int v4; // esi@1
    6.   char v5; // bl@5
    7.   const CHAR *v6; // ebp@5
    8.   DWORD v7; // ecx@6
    9.   signed int v8; // edi@7
    10.   const CHAR v9; // al@8
    11.   int v10; // eax@14
    12.   void *v11; // esi@14
    13.   int v12; // edi@15
    14.   void *v13; // esi@20
    15.   int v14; // eax@28
    16.   void *v15; // esi@28
    17.   int v16; // edi@29
    18.   void *v17; // esi@34
    19.   int v19; // ecx@15
    20.   const CHAR *v20; // eax@23
    21.   int v21; // ecx@29
    22.   DWORD NumberOfBytesRead; // [sp+14h] [bp-A34h]@1
    23.   unsigned int v23; // [sp+A34h] [bp-14h]@1
    24.   int v24; // [sp+20h] [bp-A28h]@1
    25.   LONG Buffer; // [sp+24h] [bp-A24h]@2
    26.   __int16 v26; // [sp+15Ch] [bp-8ECh]@5
    27.   char Dst; // [sp+15Eh] [bp-8EAh]@5
    28.   __int16 v28; // [sp+54h] [bp-9F4h]@5
    29.   char v29; // [sp+56h] [bp-9F2h]@5
    30.   const CHAR *v30; // [sp+18h] [bp-A30h]@5
    31.   _BYTE v31[2000]; // [sp+264h] [bp-7E4h]@5
    32.   signed int v32; // [sp+1Ch] [bp-A2Ch]@7
    33.   int v33; // [sp+2Ch] [bp-A1Ch]@12
    34.   unsigned __int8 *Src; // [sp+30h] [bp-A18h]@14
    35.   signed int v35; // [sp+A44h] [bp-4h]@14
    36.   int v36; // [sp+28h] [bp-A20h]@15
    37.   char v37; // [sp+38h] [bp-A10h]@17
    38.   signed int v38; // [sp+50h] [bp-9F8h]@17
    39.   void *Memory; // [sp+3Ch] [bp-A0Ch]@18
    40.   int v40; // [sp+4Ch] [bp-9FCh]@31
    41.  
    42.   v23 = (unsigned int)&NumberOfBytesRead ^ dword_4B7028;
    43.   v4 = 0;
    44.   v3 = this;
    45.   v24 = this;
    46.   v2 = CreateFileA(lpFileName, 0x80000000u, 1u, 0, 3u, 0x80u, 0);
    47.   *(_DWORD *)(v3 + 4) = v2;
    48.   if ( v2
    49.     && ReadFile(v2, &Buffer, 4u, &NumberOfBytesRead, 0)
    50.     && NumberOfBytesRead == 4
    51.     && SetFilePointer(*(HANDLE *)(v3 + 4), Buffer, 0, 0) != -1 )
    52.   {
    53.     v5 = 1;
    54.     v26 = 0;
    55.     memset(&Dst, 0, 0x103u);
    56.     v28 = 0;
    57.     memset(&v29, 0, 0x103u);
    58.     v30 = (const CHAR *)&v28;
    59.     v6 = (const CHAR *)&v26;
    60.     if ( ReadFile(*(HANDLE *)(v3 + 4), v31, 0x7D0u, &NumberOfBytesRead, 0) )
    61.     {
    62.       do
    63.       {
    64.         v7 = NumberOfBytesRead;
    65.         if ( !NumberOfBytesRead )
    66.           break;
    67.         v8 = 0;
    68.         v32 = 0;
    69.         if ( (signed int)NumberOfBytesRead > 0 )
    70.         {
    71.           do
    72.           {
    73.             v9 = v31[v8];
    74.             if ( v5 )
    75.             {
    76.               if ( !v9 )
    77.               {
    78.                 v6[v4] = v9;
    79.                 v5 = 0;
    80. LABEL_24:
    81.                 v4 = 0;
    82.                 goto LABEL_25;
    83.               }
    84.               v6[v4] = v9 ^ (unsigned __int8)((-(v4 % 2 != 0) & 0xF6) - 47);
    85.               ++v4;
    86.             }
    87.             else
    88.             {
    89.               *((_BYTE *)&v33 + v4++) = v9;
    90.               if ( v4 == 4 )
    91.               {
    92.                 if ( *v30 )
    93.                 {
    94.                   sub_43E340(v30, (int)&Src);
    95.                   v35 = 0;
    96.                   sub_43E210();
    97.                   v11 = Src;
    98.                   _mbsupr(Src);
    99.                   v10 = operator new(8u);
    100.                   if ( v10 )
    101.                   {
    102.                     v19 = v33 - v36;
    103.                     *(_DWORD *)v10 = v36;
    104.                     *(_DWORD *)(v10 + 4) = v19;
    105.                     v12 = v10;
    106.                   }
    107.                   else
    108.                   {
    109.                     v12 = 0;
    110.                   }
    111.                   sub_4097A0(v11);
    112.                   LOBYTE(v35) = 1;
    113.                   *(_DWORD *)sub_45B180(&v37) = v12;
    114.                   if ( (unsigned int)v38 >= 0x10 )
    115.                     j__free(Memory);
    116.                   v35 = -1;
    117.                   if ( (_UNKNOWN *)((char *)v11 - 12) != &unk_4BE1D8 )
    118.                   {
    119.                     v13 = (char *)v11 - 12;
    120.                     if ( InterlockedDecrement((LPLONG)v13) <= 0 )
    121.                       j_j__free(v13);
    122.                   }
    123.                   v8 = v32;
    124.                 }
    125.                 v20 = v6;
    126.                 v6 = v30;
    127.                 v36 = v33;
    128.                 v7 = NumberOfBytesRead;
    129.                 v5 = 1;
    130.                 v30 = v20;
    131.                 goto LABEL_24;
    132.               }
    133.             }
    134. LABEL_25:
    135.             ++v8;
    136.             v32 = v8;
    137.           }
    138.           while ( v8 < (signed int)v7 );
    139.         }
    140.       }
    141.       while ( ReadFile(*(HANDLE *)(v24 + 4), v31, 0x7D0u, &NumberOfBytesRead, 0) );
    142.     }
    143.     if ( *v30 )
    144.     {
    145.       sub_43E340(v30, (int)&Src);
    146.       v35 = 2;
    147.       sub_43E210();
    148.       v15 = Src;
    149.       _mbsupr(Src);
    150.       v14 = operator new(8u);
    151.       if ( v14 )
    152.       {
    153.         v21 = Buffer - v36;
    154.         *(_DWORD *)v14 = v36;
    155.         *(_DWORD *)(v14 + 4) = v21;
    156.         v16 = v14;
    157.       }
    158.       else
    159.       {
    160.         v16 = 0;
    161.       }
    162.       v38 = 15;
    163.       v40 = 0;
    164.       LOBYTE(Memory) = 0;
    165.       sub_409D10(v15, strlen((const char *)v15));
    166.       LOBYTE(v35) = 3;
    167.       *(_DWORD *)sub_45B180(&v37) = v16;
    168.       if ( (unsigned int)v38 >= 0x10 )
    169.         j__free(Memory);
    170.       if ( (_UNKNOWN *)((char *)v15 - 12) != &unk_4BE1D8 )
    171.       {
    172.         v17 = (char *)v15 - 12;
    173.         if ( InterlockedDecrement((LPLONG)v17) <= 0 )
    174.           j_j__free(v17);
    175.       }
    176.     }
    177.   }
    178.   return sub_46A2EC();
    179. }
    Скажите хотябы - куда копать. Практически полный нуб в плане работы с IDA...
     
  2. AllexInTheDark

    AllexInTheDark New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2008
    Сообщения:
    7
    Пока я вижу, что данные читаются блоками по 2000 байтов.
    Четные и не четные дешифруются по разным принципам.
    А вот дальше я заглох. :dntknw:
     
  3. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    AllexInTheDark
    Это после HexRays? Да в таком виде вряд-ли кто смотреть будет :) Тут головой и руками надо сначала поработать: хотя бы постараться дать осмысленные названия переменным и избавиться от меток.
     
  4. AllexInTheDark

    AllexInTheDark New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2008
    Сообщения:
    7
    А как в ХекчРейс код менять??
    ОНо разрешает менять только название переменных и то не всех...
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    AllexInTheDark
    А зачем тебе в ИДЕ копаться? Скинь в текстовый файл, благо кода немного, и ковыряйся в нем сколько нужно.