Сейчас на форуме: tyns777, bezumchik (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Помогите определить тип шифрования
Посл.ответ Сообщение

Ранг: 18.3 (новичок), 6thx
Активность: 0.030.02
Статус: Участник

Создано: 10 октября 2019 16:36 · Поправил: Lambda
· Личное сообщение · #1

Привет! Подскажите, пожалуйста, тип шифрования.

В функцию передается:
- указатель на входной буфер с оригинальными данными
- указатель на выходной буфер
- в ECX указатель на буфер с ключом (?) (подготавливается тут - 4CC2D0)

Code:
  1. void __thiscall FUN_004cbae0(int param_1,byte *param_2,byte *param_3)
  2. {
  3.   undefined4 uVar1;
  4.   uint *puVar2;
  5.   uint uVar3;
  6.   uint uVar4;
  7.   uint uVar5;
  8.   uint uVar6;
  9.   uint uVar7;
  10.   int iVar8;
  11.   undefined auStack36 [12];
  12.   int iStack24;
  13.   int iStack20;
  14.   uint *puStack12;
  15.   uint uStack8;
  16.  
  17.   if (*(char *)(param_1 + 4) == '\0') {
  18.     iStack24 = param_1;
  19.     FUN_004cb160(DAT_00d4fb5c);
  20.                     /* WARNING: Subroutine does not return */
  21.     _CxxThrowException(auStack36,&DAT_00cbaa9c);
  22.   uVar6 = ((uint)*param_2 << 0x18 | (uint)param_2[1] << 0x10 | (uint)param_2[2] << 8 |
  23.           (uint)param_2[3]) ^ *(uint *)(param_1 + 8);
  24.   uVar3 = ((uint)param_2[4] << 0x18 | (uint)param_2[5] << 0x10 | (uint)param_2[6] << 8 |
  25.           (uint)param_2[7]) ^ *(uint *)(param_1 + 0xc);
  26.   uStack8 = ((uint)param_2[8] << 0x18 | (uint)param_2[9] << 0x10 | (uint)param_2[10] << 8 |
  27.             (uint)param_2[0xb]) ^ *(uint *)(param_1 + 0x10);
  28.   iVar8 = *(int *)(param_1 + 0x3d0);
  29.   param_2 = (byte *)(((uint)CONCAT11(param_2[0xe],param_2[0xf]) |
  30.                      (uint)param_2[0xc] << 0x18 | (uint)param_2[0xd] << 0x10) ^
  31.                     *(uint *)(param_1 + 0x14));
  32.   puStack12 = (uint *)uVar6;
  33.   if (1 < iVar8) {
  34.     iStack20 = iVar8 + -1;
  35.     uVar4 = uVar3;
  36.     uVar5 = (uint)param_2;
  37.     puVar2 = (uint *)(param_1 + 0x30);
  38.       puStack12 = puVar2;
  39.       uVar3 = *(uint *)(&DAT_00c204a0 + ((int)uVar5 >> 8 & 0xffU) * 4) ^
  40.               *(uint *)(&DAT_00c200a0 + ((int)uStack8 >> 0x10 & 0xffU) * 4) ^
  41.               *(uint *)(&DAT_00c1fca0 + ((int)uVar4 >> 0x18 & 0xffU) * 4) ^
  42.               *(uint *)(&DAT_00c208a0 + (uVar6 & 0xff) * 4) ^ puStack12[-1];
  43.       uVar7 = *(uint *)(&DAT_00c200a0 + ((int)uVar5 >> 0x10 & 0xffU) * 4) ^
  44.               *(uint *)(&DAT_00c1fca0 + ((int)uStack8 >> 0x18 & 0xffU) * 4) ^
  45.               *(uint *)(&DAT_00c204a0 + ((int)uVar6 >> 8 & 0xffU) * 4) ^
  46.               *(uint *)(&DAT_00c208a0 + (uVar4 & 0xff) * 4) ^ *puStack12;
  47.       param_2 = (byte *)(*(uint *)(&DAT_00c1fca0 + ((int)uVar5 >> 0x18 & 0xffU) * 4) ^
  48.                          *(uint *)(&DAT_00c204a0 + ((int)uVar4 >> 8 & 0xffU) * 4) ^
  49.                          *(uint *)(&DAT_00c200a0 + ((int)uVar6 >> 0x10 & 0xffU) * 4) ^
  50.                          *(uint *)(&DAT_00c208a0 + (uStack8 & 0xff) * 4) ^ puStack12[1]);
  51.       puVar2 = puStack12 + 8;
  52.       uVar6 = *(uint *)(&DAT_00c204a0 + ((int)uStack8 >> 8 & 0xffU) * 4) ^
  53.               *(uint *)(&DAT_00c200a0 + ((int)uVar4 >> 0x10 & 0xffU) * 4) ^
  54.               *(uint *)(&DAT_00c1fca0 + ((int)uVar6 >> 0x18 & 0xffU) * 4) ^
  55.               *(uint *)(&DAT_00c208a0 + (uVar5 & 0xff) * 4) ^ puStack12[-2];
  56.       iStack20 = iStack20 + -1;
  57.       uVar4 = uVar3;
  58.       uVar5 = (uint)param_2;
  59.       puStack12 = (uint *)uVar6;
  60.       uStack8 = uVar7;
  61.     } while (iStack20 != 0);
  62.   iVar8 = iVar8 * 0x20;
  63.   uVar1 = *(undefined4 *)(iVar8 + 8 + param_1);
  64.   *param_3 = (byte)((uint)uVar1 >> 0x18) ^ (&DAT_00c1faa0)[(int)puStack12 >> 0x18 & 0xff];
  65.   param_3[1] = (byte)((uint)uVar1 >> 0x10) ^ (&DAT_00c1faa0)[(int)uVar3 >> 0x10 & 0xff];
  66.   param_3[2] = (byte)((uint)uVar1 >> 8) ^ (&DAT_00c1faa0)[(int)uStack8 >> 8 & 0xff];
  67.   param_3[3] = (&DAT_00c1faa0)[(uint)param_2 & 0xff] ^ (byte)uVar1;
  68.   uVar1 = *(undefined4 *)(iVar8 + 0xc + param_1);
  69.   param_3[4] = (byte)((uint)uVar1 >> 0x18) ^ (&DAT_00c1faa0)[(int)uVar3 >> 0x18 & 0xff];
  70.   param_3[5] = (byte)((uint)uVar1 >> 0x10) ^ (&DAT_00c1faa0)[(int)uStack8 >> 0x10 & 0xff];
  71.   param_3[6] = (byte)((uint)uVar1 >> 8) ^ (&DAT_00c1faa0)[(int)param_2 >> 8 & 0xff];
  72.   param_3[7] = (&DAT_00c1faa0)[(uint)puStack12 & 0xff] ^ (byte)uVar1;
  73.   uVar1 = *(undefined4 *)(iVar8 + 0x10 + param_1);
  74.   param_3[8] = (byte)((uint)uVar1 >> 0x18) ^ (&DAT_00c1faa0)[(int)uStack8 >> 0x18 & 0xff];
  75.   param_3[9] = (byte)((uint)uVar1 >> 0x10) ^ (&DAT_00c1faa0)[(int)param_2 >> 0x10 & 0xff];
  76.   param_3[10] = (byte)((uint)uVar1 >> 8) ^ (&DAT_00c1faa0)[(int)puStack12 >> 8 & 0xff];
  77.   param_3[0xb] = (&DAT_00c1faa0)[uVar3 & 0xff] ^ (byte)uVar1;
  78.   uVar1 = *(undefined4 *)(iVar8 + 0x14 + param_1);
  79.   param_3[0xc] = (byte)((uint)uVar1 >> 0x18) ^ (&DAT_00c1faa0)[(int)param_2 >> 0x18 & 0xff];
  80.   param_3[0xd] = (byte)((uint)uVar1 >> 0x10) ^ (&DAT_00c1faa0)[(int)puStack12 >> 0x10 & 0xff];
  81.   param_3[0xe] = (byte)((uint)uVar1 >> 8) ^ (&DAT_00c1faa0)[(int)uVar3 >> 8 & 0xff];
  82.   param_3[0xf] = (&DAT_00c1faa0)[uStack8 & 0xff] ^ (byte)uVar1;
  83.   return;
  84. }


EXE: https://mega.nz/#!ENkz3KbS!LKsHNsJwYeUp4JLG2nJxAWq4QNFdxkKUXos_7riRd80



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 10 октября 2019 16:59
· Личное сообщение · #2

Сходу ничего не понятно.. Сравни таблицы с типовыми для АЕС и прочих. Если криптофайндеры ничего не находят, возможно, это из области white-box.

-----
старый пень


| Сообщение посчитали полезным: Lambda


Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 10 октября 2019 17:03
· Личное сообщение · #3

aes128. Первая же таблица (0x63a5c663, 0x7c84f87c, ...) гуглится гуглом.

-----
2 оттенка серого




Ранг: 18.3 (новичок), 6thx
Активность: 0.030.02
Статус: Участник

Создано: 10 октября 2019 17:04 · Поправил: Lambda
· Личное сообщение · #4

Hash & Crypto Detector v1.4:

Code:
  1. Rijndael S-Box - 0081EEA0 - 00C1FAA0

А в коде вышеприведенной функции используется константа 00C1FAA0

AES 256 ?

Добавлено спустя 2 минуты
f13nd пишет:
aes128.


Там в функцию(4CC2D0) для подготовки ключа передается константа 0x20

Так что 256 bit?




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 10 октября 2019 17:26 · Поправил: f13nd
· Личное сообщение · #5

Lambda пишет:
Так что 256 bit?

Видимо используется такой.

16*8/24*8/32*8--> Link <--
Code:
  1. //Expand a user-supplied key material into a session key.
  2. // key        - The 128/192/256-bit user-key to use.
  3. // chain      - initial chain block for CBC and CFB modes.
  4. // keylength  - 16, 24 or 32 bytes
  5. // blockSize  - The block size in bytes of this Rijndael (16, 24 or 32 bytes).


-----
2 оттенка серого


| Сообщение посчитали полезным: Lambda
 eXeL@B —› Вопросы новичков —› Помогите определить тип шифрования
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати