Алгоритм декодирования по коду

OtherSide
Уже с Приветом
Posts: 8369
Joined: 01 Mar 2008 15:14

Алгоритм декодирования по коду

Post by OtherSide » 14 Sep 2018 14:03

Летом я создавал тему о декодировании (взломе) одной офисной программы.
В общем, прогресс идет. Изучил ассемблер и windbg и по константам, которые использовались в коде удалось найти кодировщики - оказалось шифровали блочными алгоритмами blowfish и cast5
из спротивного интереса полез дальше ковырять, там еще одним блочным алгоритмом дешифруется, но выглядит он с одной стороны просто, с другой неочевидно.. констант для зацепки не вижу. Может кто то подскажет, поймет по коду о чем речь?'

функция sub_75DDE0 декодирует блоки по 8 байт, судя по всему блоки независимы друг от друга, первый параметр - какая то информация для декодировани, вторые 2 - указатели In и Out, на практике указывают в одно место

Code: Select all

WORD *__usercall sub_75DB2C@<eax>(_WORD *result@<eax>, unsigned __int16 a2@<dx>)
{
  int v2; // ecx

  v2 = a2 * (unsigned __int16)*result;
  if ( v2 )
  {
    *result = HIWORD(v2);
    *result = v2 - *result;
    if ( (unsigned __int16)v2 < *result )
      ++*result;
  }
  else
  {
    *result = 1 - *result - a2;
  }
  return result;
}

int __usercall sub_75DDE0@<eax>(_WORD *a1@<eax>, unsigned int a2@<edx>, _DWORD *a3@<ecx>)
{
  signed int v3; // edi
  unsigned __int16 *v4; // eax
  unsigned int v5; // ecx
  signed int v6; // edi
  _WORD *v7; // ebx
  int v8; // edx
  int v9; // ecx
  int v10; // edx
  int v11; // ecx
  unsigned __int16 v12; // bp
  int v13; // edx
  int v14; // ecx
  int v15; // edx
  int v16; // edx
  int v17; // ecx
  unsigned __int16 v18; // bp
  int result; // eax
  _WORD *v20; // [esp+0h] [ebp-24h]
  _DWORD *v21; // [esp+4h] [ebp-20h]
  unsigned __int16 v22; // [esp+8h] [ebp-1Ch]
  unsigned __int16 v23; // [esp+Ah] [ebp-1Ah]
  unsigned __int16 v24; // [esp+Ch] [ebp-18h]
  unsigned __int16 v25; // [esp+Eh] [ebp-16h]
  unsigned __int16 v26; // [esp+10h] [ebp-14h]

  v21 = a3;
  v20 = a1;
  v22 = *(_WORD *)a2;
  v23 = *(_DWORD *)a2 >> 16;
  v24 = *(_WORD *)(a2 + 4);
  v25 = *(_DWORD *)(a2 + 4) >> 16;
  v3 = 4;
  v4 = &v22;
  do
  {
    LOWORD(a2) = *v4;
    v5 = a2 << 8;
    a2 = (unsigned int)*v4 >> 8;
    LOWORD(v5) = a2 | v5;
    *v4 = v5;
    ++v4;
    --v3;
  }
  while ( v3 );
  v6 = 8;
  v7 = v20 + 60;
  do
  {
    LOWORD(a2) = *v7;
    ((void (__fastcall *)(unsigned int, unsigned int))unk_75DB2C)(v5, a2);
    v23 += v7[1];
    v24 += v7[2];
    LOWORD(v8) = v7[3];
    ((void (__fastcall *)(int, int))unk_75DB2C)(v9, v8);
    v26 = v24;
    v24 ^= v22;
    LOWORD(v10) = v7[4];
    ((void (__fastcall *)(int, int))unk_75DB2C)(v11, v10);
    v12 = v23;
    v23 ^= v25;
    v23 += v24;
    LOWORD(v13) = v7[5];
    ((void (__fastcall *)(int, int))unk_75DB2C)(v14, v13);
    v24 += v23;
    v22 ^= v23;
    v25 ^= v24;
    v23 ^= v26;
    v24 ^= v12;
    v7 += 6;
    --v6;
  }
  while ( v6 );
  HIWORD(v15) = HIWORD(v20);
  LOWORD(v15) = v20[108];
  ((void (__fastcall *)(unsigned int, int))unk_75DB2C)(v5, v15);
  v24 += v20[109];
  v23 += v20[110];
  HIWORD(v16) = HIWORD(v20);
  LOWORD(v16) = v20[111];
  ((void (__fastcall *)(int, int))unk_75DB2C)(v17, v16);
  v22 = (v22 >> 8) | (v22 << 8);
  v18 = (v24 >> 8) | (v24 << 8);
  v24 = (v23 >> 8) | (v23 << 8);
  v25 = (v25 >> 8) | (v25 << 8);
  v23 = v18;
  *v21 = v18;
  *v21 <<= 16;
  *v21 |= v22;
  v21[1] = v25;
  v21[1] <<= 16;
  result = v24;
  v21[1] |= v24;
  return result;
}

User avatar
KVA
Уже с Приветом
Posts: 4992
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Алгоритм декодирования по коду

Post by KVA » 14 Sep 2018 14:54

Не в порядке критики, но столько времени потрачено. Не будет дешевле купить? Понятно что спортивный интерес, но все же....

OtherSide
Уже с Приветом
Posts: 8369
Joined: 01 Mar 2008 15:14

Re: Алгоритм декодирования по коду

Post by OtherSide » 17 Sep 2018 16:07

KVA wrote:
14 Sep 2018 14:54
Не в порядке критики, но столько времени потрачено. Не будет дешевле купить? Понятно что спортивный интерес, но все же....
А мне например не понятно, какого ответа вы ждете. Типа "слушай, отличная мысль, а ведь и правда лучше купить, как же сразу мне в голову не пришло!"
Наверное если приходиться ковырять чужие данные купить невозможно, как считаете?

Алгоритм кстати расковырял, это IDEA

Return to “Вопросы и новости IT”