Сейчас на форуме: vsv1, NIKOLA, r0lka, johnniewalker (+5 невидимых)

 eXeL@B —› Крэки, обсуждения —› Идентификация алгоритма
Посл.ответ Сообщение

Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 30 августа 2018 15:07 · Поправил: SaNX
· Личное сообщение · #1

Ковыряю прогу под иосом, хитрожопый китаец не юзает стандартный CCCryptor )))

Code:
  1.  v15 = (__ROR4__(0xD7BDE500, 0x18) - 0xDEC3) & ((unsigned int)(__ROR4__(0xD7BDE500, 0x18) - 0xDEC3) >> 0x10) ^ 0x200A;
  2.   while ( 1 )
  3.   {
  4.     switch ( v15 )
  5.     {
  6.       case 1u:
  7.         v27 = 0;
  8.         v3 = __ROR4__((0x6A975C99 * v15 ^ 0x128100) + 0x41790000, 0x18) - 0x49C7;
  9.         v4 = 0x4EE6;
  10.         goto LABEL_2;
  11.       case 2u:
  12.         ++v39;
  13.         v3 = __ROR4__((0x3808E881 * v15 ^ 0xB38900) - 0x66FD0000, 0x18) - 0x74CF;
  14.         v4 = 0x8573;
  15.         goto LABEL_2;
  16.       case 3u:
  17.         v13 = *(_BYTE *)(v20 + v17 + v16);
  18.         if ( v18 )
  19.           goto LABEL_7;
  20.         goto LABEL_8;
  21.       case 4u:
  22.         if ( v45 < 9 )
  23.           goto LABEL_10;
  24.         goto LABEL_11;
  25.       case 5u:
  26.         v29 = 0xFFFFFFFF;
  27.         v3 = __ROR4__((0x1F130108 * v15 ^ 0x3C4400) - 0xB6A0000, 0x18) - 0xB438;
  28.         v4 = 0x701D;
  29.         goto LABEL_2;
  30.       case 6u:
  31.         goto LABEL_54;
  32.       case 7u:
  33.         goto LABEL_106;
  34.       case 8u:
  35.         goto LABEL_98;
  36.       case 9u:
  37.         if ( v47 < 4 )
  38.           goto LABEL_14;
  39.         goto LABEL_15;
  40.       case 0xAu:
  41. LABEL_7:
  42.         v3 = __ROR4__((0x228D617F * v15 ^ 0x579A00) + 0xD8F0000, 0x18) - 0x5009;
  43.         v4 = 0xC7B;
  44.         goto LABEL_2;
  45.       case 0xBu:
  46.         goto LABEL_102;
  47.       case 0xCu:
  48.         if ( v41 < 4 )
  49.           goto LABEL_17;
  50.         goto LABEL_18;
  51.       case 0xDu:
  52.         goto LABEL_125;
  53.       case 0xEu:
  54.         v26 = a1;
  55.         v25 = a2;
  56.         v24 = a3;
  57.         if ( a1 )
  58.           goto LABEL_20;
  59.         goto LABEL_21;
  60.       case 0xFu:
  61.         goto LABEL_25;
  62.       case 0x10u:
  63.         *(_BYTE *)(v22 + v21) = v23;
  64.         v3 = __ROR4__((0x51D9C79 * v15 ^ 0xCD4200) - 0x45F60000, 0x18) - 0x9DEF;
  65.         v4 = 0x1235;
  66.         goto LABEL_2;
  67.       case 0x11u:
  68.         v65 = v71;
  69.         v64 = 0;
  70.         v62 = 0;
  71.         v63 = 0x20;
  72.         v3 = __ROR4__((0x57AC31C * v15 ^ 0xD5E700) - 0x59FA0000, 0x18) - 0x4951;
  73.         v4 = 0x9032;
  74.         goto LABEL_2;
  75.       case 0x12u:
  76.         if ( v21 >= (signed int)v23 )
  77.           goto LABEL_26;
  78. LABEL_25:
  79.         v3 = __ROR4__((0x67945E6 * v15 ^ 0x54F300) + 0x51110000, 0x18) - 0x4A6A;
  80.         v4 = 0xE208;
  81.         goto LABEL_2;
  82.       case 0x13u:
  83.         goto LABEL_109;
  84.       case 0x14u:
  85.         v29 = 0;
  86.         v3 = __ROR4__((0x5E91045 * v15 ^ 0xF46E00) - 0x731D0000, 0x18) - 0xCD1C;
  87.         v4 = 0x847F;
  88.         goto LABEL_2;
  89.       case 0x15u:
  90.         v65[v62++] = v64;
  91.         v3 = __ROR4__((0x65AED49 * v15 ^ 0xD44B00) - 0x2B840000, 0x18) - 0x6C21;
  92.         v4 = 0x1119;
  93.         goto LABEL_2;
  94.       case 0x16u:
  95.         goto LABEL_72;
  96.       case 0x17u:
  97. LABEL_8:
  98.         v3 = __ROR4__((0x3562C4AF * v15 ^ 0x4FF300) + 0x184A0000, 0x18) - 0xB694;
  99.         v4 = 0x114C;
  100.         goto LABEL_2;
  101.       case 0x18u:
  102.         if ( v38 < 4 )
  103.           goto LABEL_30;
  104.         goto LABEL_31;
  105.       case 0x19u:
  106.         ++v42;
  107.         v3 = __ROR4__((0x5C9DD5C * v15 ^ 0xF99B00) - 0x36120000, 0x18) - 0x3AE1;
  108.         v4 = 0x15A;
  109.         goto LABEL_2;
  110.       case 0x1Au:
  111.         v71[8 * v42 + v41++] = v55 | v56;
  112.         v3 = __ROR4__((0x482030C * v15 ^ 0x521600) - 0x7E270000, 0x18) - 0x737F;
  113.         v4 = 0x554;
  114.         goto LABEL_2;
  115.       case 0x1Bu:
  116.         v27 = 0xFFFFFFFF;
  117.         v3 = __ROR4__((0x55AF8A5 * v15 ^ 0x7A7000) - 0x47650000, 0x18) - 0xEDBB;
  118.         v4 = 0x792A;
  119.         goto LABEL_2;
  120.       case 0x1Cu:
  121.         v44 = 0;
  122.         v3 = __ROR4__((0x795BB17 * v15 ^ 0x1F7900) - 0x47AA0000, 0x18) - 0x4111;
  123.         v4 = 0x4153;
  124.         goto LABEL_2;
  125.       case 0x1Du:
  126.         if ( v61 )
  127.           goto LABEL_37;
  128.         goto LABEL_38;
  129.       case 0x1Eu:
  130.         goto LABEL_88;
  131.       case 0x1Fu:
  132.         if ( v18 < v19 )
  133.           goto LABEL_40;
  134.         goto LABEL_41;
  135.       case 0x20u:
  136.         if ( v62 < v63 )
  137.           goto LABEL_43;
  138.         goto LABEL_44;
  139.       case 0x21u:
  140. LABEL_37:
  141.         v3 = __ROR4__((0x63E931D * v15 ^ 0x212D00) - 0x36130000, 0x18) - 0x5CC9;
  142.         v4 = 0x24F2;
  143.         goto LABEL_2;
  144.       case 0x23u:
  145. LABEL_11:
  146.         v3 = __ROR4__((0x1FF9E369 * v15 ^ 0x3C6D00) - 0x3C500000, 0x18) - 0xD073;
  147.         v4 = 0x83BC;
  148.         goto LABEL_2;
  149.       case 0x24u:
  150.         v3 = __ROR4__((0x39D1C92 * v15 ^ 0x183B00) - 0x720B0000, 0x18) - 0xF305;
  151.         v4 = 0x9549;
  152.         goto LABEL_2;
  153.       case 0x25u:
  154.         goto LABEL_76;
  155.       case 0x26u:
  156. LABEL_20:
  157.         v3 = __ROR4__((0xDAD7CFE * v15 ^ 0x30C800) - 0x27430000, 0x18) - 0xD51;
  158.         v4 = 0x12B;
  159.         goto LABEL_2;
  160.       case 0x27u:
  161. LABEL_38:
  162.         v3 = __ROR4__((0x6180670 * v15 ^ 0x930D00) + 0x66630000, 0x18) - 0xA936;
  163.         v4 = 0x6D7;
  164.         goto LABEL_2;
  165.       case 0x28u:
  166.         ++v47;
  167.         v3 = __ROR4__((0x3CE75C7 * v15 ^ 0xF3600) + 0x4BEA0000, 0x18) - 0xEE9E;
  168.         v4 = 0x2249;
  169.         goto LABEL_2;
  170.       case 0x29u:
  171.         goto LABEL_77;
  172.       case 0x2Au:
  173.         goto LABEL_51;
  174.       case 0x2Bu:
  175.         v33 = &v66;
  176.         v32 = 0;
  177.         v30 = 0;
  178.         v31 = 0x10;
  179.         v3 = __ROR4__((0x3C61055 * v15 ^ 0x6B6300) - 0x5F790000, 0x18) - 0xA05C;
  180.         v4 = 0xA6BD;
  181.         goto LABEL_2;
  182.       case 0x2Cu:
  183. LABEL_18:
  184.         v3 = __ROR4__((0xDF2B108 * v15 ^ 0x9D3300) + 0x35790000, 0x18) - 0x6E4B;
  185.         v4 = 0x720B;
  186.         goto LABEL_2;
  187.       case 0x2Du:
  188.         v33[v30++] = v32;
  189.         v15 = (__ROR4__((0x388132E * v15 ^ 0x729800) + 0x52770000, 0x18) - 0x5218) & ((unsigned int)(__ROR4__((0x388132E * v15 ^ 0x729800) + 0x52770000, 0x18) - 0x5218) >> 0x10) ^ 0xB9;
  190.         continue;
  191.       case 0x2Eu:
  192.         if ( v25 )
  193.           goto LABEL_50;
  194. LABEL_51:
  195.         v15 = (__ROR4__((0x2953BE9 * v15 ^ 0xDECE00) - 0x50990000, 0x18) - 0x53CE) & ((unsigned int)(__ROR4__((0x2953BE9 * v15 ^ 0xDECE00) - 0x50990000, 0x18) - 0x53CE) >> 0x10) ^ 0x60;
  196.         continue;
  197.       case 0x2Fu:
  198.         if ( v43 < 4 )
  199.           goto LABEL_53;
  200. LABEL_54:
  201.         v3 = __ROR4__((0x242AB1B * v15 ^ 0x67D000) - 0x62810000, 0x18) - 0x26F8;
  202.         v4 = 0xC835;
  203.         goto LABEL_2;
  204.       case 0x30u:
  205.         goto LABEL_58;
  206.       case 0x31u:
  207.         ++v21;
  208.         v3 = __ROR4__((0x2194937 * v15 ^ 0x5D5D00) + 0x64300000, 0x18) - 0x4CF4;
  209.         v4 = 0x3A44;
  210.         goto LABEL_2;
  211.       case 0x32u:
  212.         v42 = 0;
  213.         v3 = __ROR4__((0x2F7B03B * v15 ^ 0xB15B00) + 0x4FCF0000, 0x18) - 0x639;
  214.         v4 = 0x807A;
  215.         goto LABEL_2;
  216.       case 0x33u:
  217.         if ( !v24 )
  218.           goto LABEL_59;
  219. LABEL_58:
  220.         v15 = (__ROR4__((0x3E34997 * v15 ^ 0x99B400) - 0x76E60000, 0x18) - 0x14DF) & ((unsigned int)(__ROR4__((0x3E34997 * v15 ^ 0x99B400) - 0x76E60000, 0x18) - 0x14DF) >> 0x10) ^ 0x2E;
  221.         continue;
  222.       case 0x34u:
  223.         goto LABEL_110;
  224.       case 0x35u:
  225.         *(_BYTE *)(v20 + v17 + v16) = v13 ^ v14;
  226.         v3 = __ROR4__((0x3D6EFB9 * v15 ^ 0xE70800) - 0x59CF0000, 0x18) - 0xFE88;
  227.         v4 = 0x4890;
  228.         goto LABEL_2;
  229.       case 0x36u:
  230.         v41 = 0;
  231.         v3 = __ROR4__((0x2870C96 * v15 ^ 0x41CE00) + 0x6D9E0000, 0x18) - 0x1CC;
  232.         v4 = 0x8325;
  233.         goto LABEL_2;
  234.       case 0x37u:
  235. LABEL_53:
  236.         v3 = __ROR4__((0x3A78CF4 * v15 ^ 0x1C6200) + 0x55BC0000, 0x18) - 0xA89D;
  237.         v4 = 0x259;
  238.         goto LABEL_2;
  239.       case 0x38u:
  240.         ++v16;
  241.         v5 = __ROR4__((0x3FFDF9C * v15 ^ 0xFE400) + 0x115E0000, 0x18) - 0x1075;
  242.         v6 = 0x1049;
  243.         goto LABEL_104;
  244.       case 0x39u:
  245. LABEL_21:
  246.         v3 = __ROR4__((0xF9113E0 * v15 ^ 0xCBA300) - 0x3CEE0000, 0x18) - 0xE781;
  247.         v4 = 0x1075;
  248.         goto LABEL_2;
  249.       case 0x3Au:
  250.         if ( v40 < 3 )
  251.           goto LABEL_64;
  252.         goto LABEL_65;
  253.       case 0x3Bu:
  254.         goto LABEL_87;
  255.       case 0x3Cu:
  256.         ++v44;
  257.         v3 = __ROR4__((0x24665E6 * v15 ^ 0x7C4000) - 0x1F840000, 0x18) - 0xEB4B;
  258.         v4 = 0x7D58;
  259.         goto LABEL_2;
  260.       case 0x3Du:
  261. LABEL_17:
  262.         v3 = __ROR4__((0xEA94497 * v15 ^ 0x334D00) - 0x49EC0000, 0x18) - 0xC731;
  263.         v4 = 0x407F;
  264.         goto LABEL_2;
  265.       case 0x3Eu:
  266.         if ( *v24 < (unsigned int)(*v25 + 0x10) )
  267.           goto LABEL_68;
  268.         goto LABEL_69;
  269.       case 0x3Fu:
  270. LABEL_14:
  271.         v3 = __ROR4__((0xC00E5FB * v15 ^ 0xB29500) - 0xA470000, 0x18) - 0xC954;
  272.         v4 = 0x26D;
  273.         goto LABEL_2;
  274.       case 0x40u:
  275.         goto LABEL_73;
  276.       case 0x41u:
  277.         v23 = ((*v25 + 0x10) & 0xF0) - *v25;
  278.         v22 = v26 + *v25;
  279.         v21 = 0;
  280.         v3 = __ROR4__((0x109E319 * v15 ^ 0x276C00) + 0x73DC0000, 0x18) - 0x96E7;
  281.         v4 = 0x80D2;
  282.         goto LABEL_2;
  283.       case 0x42u:
  284.         v28 = v20 + v17;
  285.         if ( v20 + v17 )
  286.         {
  287. LABEL_72:
  288.           v3 = __ROR4__((0x1E403C8 * v15 ^ 0xAC6700) + 0xD630000, 0x18) - 0xF299;
  289.           v4 = 0x85BB;
  290.         }
  291.         else
  292.         {
  293. LABEL_73:
  294.           v3 = __ROR4__((0x17335EB * v15 ^ 0x3F6A00) + 0x18080000, 0x18) - 0xA46B;
  295.           v4 = 0x900D;
  296.         }
  297.         goto LABEL_2;
  298.       case 0x43u:
  299.         ++v18;
  300.         v17 += 0x10;
  301.         v3 = __ROR4__((0x1409D6F * v15 ^ 0xA37900) - 0x2EC50000, 0x18) - 0xB795;
  302.         v4 = 0x513;
  303.         goto LABEL_2;
  304.       case 0x44u:
  305.         goto LABEL_124;
  306.       case 0x45u:
  307.         if ( v16 >= 0x10 )
  308.         {
  309. LABEL_77:
  310.           v8 = __ROR4__((0x19C21CC * v15 ^ 0xDD3100) + 0x1F3A0000, 0x18) - 0x2B02;
  311.           v15 = v8 & (v8 >> 0x10) ^ 0x4A;
  312.         }
  313.      .........
  314.  case 0x7Bu:
  315. LABEL_92:
  316.         v15 = (__ROR4__((0x1BA457F * v15 ^ 0xCDC200) - 0x78360000, 0x18) - 0x7C4A) & ((unsigned int)(__ROR4__((0x1BA457F * v15 ^ 0xCDC200) - 0x78360000, 0x18) - 0x7C4A) >> 0x10) ^ 0x32;
  317.         continue;
  318.       case 0x7Cu:
  319. LABEL_95:
  320.         v15 = (__ROR4__((0x11754AA * v15 ^ 0x1FB000) - 0x53140000, 0x18) - 0x2206) & ((unsigned int)(__ROR4__((0x11754AA * v15 ^ 0x1FB000) - 0x53140000, 0x18) - 0x2206) >> 0x10) ^ 0x37;
  321.         continue;
  322.       case 0x7Du:
  323. LABEL_69:
  324.         v3 = __ROR4__((0x38509DC * v15 ^ 0xDF6700) + 0x760E0000, 0x18) - 0xF26A;
  325.         v4 = 0x5543;
  326.         goto LABEL_2;
  327.       default:
  328.         return v27;


Часть листинга, все не влазит. Кто что видит в этом алгосе? Я пытался гуглить по константам - ничего не нагуглил (((

-----
SaNX





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

Создано: 30 августа 2018 17:33 · Поправил: f13nd
· Личное сообщение · #2

Скорей всего если это и существующее что-то, то работает по таблицам. Всё, что в этом цикле есть - функции от v15, которая судя по всему 7 бит. Только китайцу могло прийти в голову заранее в таблицы все это не посчитать.
Например:
Code:
  1.     switch ( v15 )
  2.     {
  3.       case 1u:
  4.         v27 = 0;
  5.         v3 = __ROR4__((0x6A975C99 * v15 ^ 0x128100) + 0x41790000, 0x18) - 0x49C7;

в этой ветке мы при v15==1, мы можем знать заранее значение v3? Нахрена мы его считаем в приложении?

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





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 30 августа 2018 18:15
· Личное сообщение · #3

по мне так больше похоже на банальную обфускацию.
Оригинальный код разбит на блоки и растасован по кейсам чего-то типа конечного автомата, где v15 - внутреннее состояние. Обрати внимание, что в самом начале v15 хоть и вычисляется хитро, но по сути является константой.

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


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

Создано: 30 августа 2018 18:21
· Личное сообщение · #4

Ага похоже. Тогда завычетом всего остается:
Code:
  1.         v13 = *(_BYTE *)(v20 + v17 + v16);
  2.         *(_BYTE *)(v20 + v17 + v16) = v13 ^ v14;



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




Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 30 августа 2018 18:38 · Поправил: SaNX
· Личное сообщение · #5

Отладчиком бы посмотреть ( Кто-нибудь идой дебажил иос? Либо как в фриде хукнуть функу типа sub_123123?

-----
SaNX





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

Создано: 30 августа 2018 19:19 · Поправил: f13nd
· Личное сообщение · #6

SaNX пишет:
Отладчиком бы посмотреть

Здесь отладчик необязателен, можно instruction set simulator'ом обойтись.

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




Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 30 августа 2018 19:20
· Личное сообщение · #7

f13nd пишет:
instruction set sumulator'ом

мне такое неведомо )

-----
SaNX





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

Создано: 30 августа 2018 19:26
· Личное сообщение · #8

SaNX пишет:
мне такое неведомо )

Trace32, Unicorn (Oo) навскидку. Отладка иногда выливается в геморрой, если задача посмотреть алгоритм, не обвешанный системными апи, может и эмулятор сгодиться. Если ничего не путаю, архитектура arm64.

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


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

Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 30 августа 2018 19:39
· Личное сообщение · #9

-=AkaBOSS=- пишет
Обрати внимание, что в самом начале v15 хоть и вычисляется хитро, но по сути является константой.
Равно 4 если я нигде не ошибся.




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 30 августа 2018 19:40
· Личное сообщение · #10

f13nd пишет:
Unicorn (Oo) навскидку

угу..как раз для Ида --> есть такой <-- плуг.
сам не юзал, только сорцы смотрел, вывод инфо автор не плохо намутил.
вот как раз и потестить не плохо.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 30 августа 2018 20:14 · Поправил: SaNX
· Личное сообщение · #11

cppasm пишет:
Равно 4 если я нигде не ошибся.

я так же насчитал

Bronco пишет:
гу..как раз для Ида --> есть такой <-- плуг.

еггоги сыплет сука
LoadLibrary(IDA 7.0\plugins\libgcc_s_seh-1.dll) error: Не найден указанный модуль.
IDA 7.0\plugins\libgcc_s_seh-1.dll: can't load file
IDA 7.0\plugins\libwinpthread-1.dll: incompatible plugin version, skipped

LoadLibrary(IDA 7.0\plugins\sk3wldbg_user.dll) error: Не найден указанный модуль.
IDA 7.0\plugins\sk3wldbg_user.dll: can't load file

LoadLibrary(C:\Soft\IDA 7.0\plugins\unicorn1.dll) error: Не найден указанный модуль.
C:\Soft\IDA 7.0\plugins\unicorn1.dll: can't load file

взял из bin\7.0.\windows с гитхаба

-----
SaNX





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 30 августа 2018 20:18 · Поправил: Bronco
· Личное сообщение · #12

SaNX пишет:
еггоги сыплет сука

хз.. все нужные GNU библиотеки --> в комплекте<-- к плагу идут.
автор линковал с инклудов и статик либ релиза 1.10. трэйсер должен быть стабилен.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 30 августа 2018 20:24
· Личное сообщение · #13

Bronco пишет:
все нужные GNU библиотеки --> в комплекте<-- к плагу идут.

вот я их все скачал и закинул в папку: IDA 7.0\plugins\unicorn1.dll, ...
однако не грузит

-----
SaNX





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 30 августа 2018 20:40 · Поправил: Bronco
· Личное сообщение · #14

SaNX пишет:
закинул в папку: IDA 7.0\plugins\unicorn1.dll

я не помню как в плаге архитектуру выбирают.
Ида не юзаю, куда скидывать не вникал. по отзывам вроде работает.
из описания установки только это:
INSTALLATION
Assuming you have installed IDA to $IDADIR, install the plugin by copying the compiled binaries from $IDASDKDIR/bin/plugins to $IDADIR/plugins (Linux/Windows) or $IDADIR/idabin/plugins (OS X). Windows users should install the 32-bit Unicorn dll into $IDADIR as Unicorn1.dll. Linux and OS X users should make sure they have installed the 32-bit Unicorn shared library into an appropriate location on their respective systems (/usr/local/lib works). This should already be taken care of if you build Unicorn from source.


-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 31 августа 2018 07:57 · Поправил: -=AkaBOSS=-
· Личное сообщение · #15

cppasm пишет:
Равно 4 если я нигде не ошибся.

странно.. у меня получилось 14
Code:
  1. __ROR4__(0xD7BDE500, 0x18) = 0xBDE500D7
  2. 0xBDE500D7 - 0xDEC3 = 0xBDE42214
  3. 0xBDE42214 & (0xBDE42214 >> 16) = 0x2004
  4. 0x2004 ^ 0x200A = 0x000E

Code:
  1.       case 0xEu:
  2.         v26 = a1;
  3.         v25 = a2;
  4.         v24 = a3;
  5.         if ( a1 )
  6.           goto LABEL_20;
  7.         goto LABEL_21

как раз похоже - чтение аргументов и начало их проверки на нулёвость

LABEL_2 в код не попал, но там явно что-то интересное. Скорее всего - вычисление следующего значения v15 на основе v3 и v4



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 31 августа 2018 08:26
· Личное сообщение · #16

-=AkaBOSS=- пишет:
странно.. у меня получилось 14

Да, 14.
Я скобки не так расставил - вначале XOR сделал, а потом AND...



Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 31 августа 2018 10:55
· Личное сообщение · #17

-=AkaBOSS=- пишет:
Скорее всего - вычисление следующего значения v15 на основе v3 и v4

именно так

-----
SaNX




Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 09 сентября 2018 12:30 · Поправил: SaNX
· Личное сообщение · #18

Вобщем, удалось переписать алгос:
Code:
  1. const uint8_t g_encoding_data2[9][4][4][4][2][256];
  2. const unsigned int g_encoding_data1[9][4][4][256];
  3. //это захаркоженные массивы под 300килобайт
  4. const unsigned char g_vector[4][4] = 
  5. {  0, 1, 2, 3,  
  6.     1, 2, 3, 0,  
  7.     2, 3, 0, 1,  
  8.     3, 0, 1, 2 
  9. };
  10.  
  11.  int encodeDataTests(uint8_t *data) {
  12.         uint8_t temp_buffer1[ 4][4];
  13.         uint8_t temp_buffer2[ 8][4];
  14.         uint32_t temp_buffer3[ 4][4];
  15.         if (!data) return -1;
  16.         // pointer to the next block  
  17.         uint8_t * p_data = data;
  18.         memset(temp_buffer1, 0, sizeof(temp_buffer1));
  19.         uint8_t * p_block = data;
  20.         // fill temprorary buffer with block data  
  21.         memset(temp_buffer2, 0, sizeof(temp_buffer2));
  22.         for (int l = 0; l < 4; ++l) {
  23.             for (int n = 0; n < 4; ++n)
  24.                 temp_buffer2[2 * n][l] = *p_block++;
  25.         }
  26.         for (int index1 = 0; index1 < 9; ++index1) {
  27.             for (int index2 = 0; index2 < 4; ++index2) {
  28.                 for (int index3 = 0; index3 < 4; ++index3) {
  29.                     size_t last_index = temp_buffer2[2 * index2][g_vector[index2][index3]];
  30.                     uint32_t temp = g_encoding_data1[index1][index2][index3][last_index];
  31.                     temp_buffer3[index2][index3] = temp;
  32.                 }
  33.             }
  34.             for (int index2 = 0; index2 < 4; ++index2) {
  35.                 for (int index3 = 0; index3 < 4; ++index3) {
  36.                     uint8_t v27[ 4]; //*(uint32_t *)v27 = temp_buffer3[jj][ii];
  37.                     uint8_t * p_temp_buffer3 = (uint8_t *) temp_buffer3;
  38.                     v27[0] = p_temp_buffer3[0 * 16 + index3 * 4 + index2];
  39.                     v27[1] = p_temp_buffer3[1 * 16 + index3 * 4 + index2];
  40.                     v27[2] = p_temp_buffer3[2 * 16 + index3 * 4 + index2];
  41.                     v27[3] = p_temp_buffer3[3 * 16 + index3 * 4 + index2];
  42.                     unsigned int nKey1;
  43.                     int nKey2;
  44.                     nKey2 = v27[0] & 0xF;
  45.                     nKey1 = v27[0] & 0xF0;
  46.                     for (int kk = 0; kk < 3; ++kk) {
  47.                         nKey2 = g_encoding_data2[index1][index2][index3][kk][0][nKey2 | 0x10 * (v27[kk + 1] & 0xF)] & 0xF;
  48.                         nKey1 = 16 * g_encoding_data2[index1][index2][index3][kk][1][v27[kk + 1] & 0xF0 | (nKey1 >> 4)];
  49.                     }
  50.                     uint8_t temp = nKey1 | nKey2;
  51.                     temp_buffer2[2 * index2][index3] = temp;
  52.                 }
  53.             }
  54.         }
  55.         return 0;
  56.     }


Вопрос, как и прежде, что это за алгос?
И второй: как обратить? Это типа шифрация, а вот как дешифровать???

ЗЫ: Арчер, ты же криптогуру, посдкажи, плиз )))

-----
SaNX




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

Создано: 09 сентября 2018 12:48
· Личное сообщение · #19

Судя по таблице перестановок, это похоже на ShiftRows/MixColumns шаг от АЕС. Если учесть что у тебя там 30Кб предпросчитанных таблиц это может быть White-Box AES.

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


| Сообщение посчитали полезным: SaNX, Katana, mak

Ранг: 16.5 (новичок), 5thx
Активность: 0.01=0.01
Статус: Участник
iOS expert

Создано: 09 сентября 2018 12:50 · Поправил: Katana
· Личное сообщение · #20

Это не весь алгоритм, только один кусок, средний. Первый и последний удалось развернуть. И если это AES, как это строго проверить?



Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 09 сентября 2018 12:52 · Поправил: SaNX
· Личное сообщение · #21

r_e пишет:
30Кб

там два по 300 кило )

-----
SaNX





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 09 сентября 2018 14:42
· Личное сообщение · #22

По структуре на Twofish чем-то смахивает ...

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





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

Создано: 09 сентября 2018 15:19
· Личное сообщение · #23

r_e пишет:
это похоже на ShiftRows/MixColumns

По структуре циклов и их примерному содержимому вылитый aes_encrypt_128, только ни единого ксора, что наверное делает его не aes'ом.
https://github.com/openluopworld/aes_128/blob/master/aes.c

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




Ранг: 16.5 (новичок), 5thx
Активность: 0.01=0.01
Статус: Участник
iOS expert

Создано: 09 сентября 2018 15:41
· Личное сообщение · #24

Это точно whitebox AES-128, разобрались уже. Ключ не достать, скорее всего, но в принципе и не надо. В одну сторону шифрует и хорошо.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 09 сентября 2018 16:19
· Личное сообщение · #25

aes128_enc_wb_final
https://doar-e.github.io/blog/2015/02/08/spotlight-on-an-unprotected-aes128-whitebox-implementation/
https://www.slideshare.net/codeblue_jp/key-recovery-attacks-against-commercial-whitebox-cryptography-implementations-by-sanghwan-ahn

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

Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 27 сентября 2018 05:55
· Личное сообщение · #26

Всем спасибо, ключ из таблиц получен )

-----
SaNX



 eXeL@B —› Крэки, обсуждения —› Идентификация алгоритма
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати