Сейчас на форуме: rmn, exp50848 (+8 невидимых)

 eXeL@B —› Основной форум —› Шифр перестановкой
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 26 июля 2012 20:46 · Поправил: OnLyOnE
· Личное сообщение · #1

Пытаюсь разобрать алго преобразования большого числа.
Необходимо его реверснуть.
Как понял (на сколько мозгов хватило ) в него заложен принцип шифрования перестановкой... только все происходит на уровне бит.

Т.е. поэтапно ...

Этап "расшифровки" числа, в результате которого число [ 10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8 ] преобразуется в [ 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 ]
Шаги "расшифровки":

1. создается буфер размером в 120 байт (78h) и число [ 10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8 ] раскладывается в буфер на биты т.е. двоичная система исчисления

Code:
  1. 0033C050  00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00  ...Ђ............
  2. 0033C060  80 00 80 00 00 00 80 00 00 00 00 00 00 00 00 00  Ђ.Ђ...Ђ.........
  3. 0033C070  00 80 80 00 00 00 80 80 00 00 00 00 80 80 80 00  .ЂЂ...ЂЂ....ЂЂЂ.
  4. 0033C080  80 80 00 00 80 00 80 00 00 80 00 00 00 80 00 80  ЂЂ..Ђ.Ђ..Ђ...Ђ.Ђ
  5. 0033C090  00 00 00 00 00 00 00 80 80 00 80 00 80 00 80 00  .......ЂЂ.Ђ.Ђ.Ђ.
  6. 0033C0A0  80 80 80 80 00 80 80 80 80 80 80 80 00 00 00 00  ЂЂЂЂ.ЂЂЂЂЂЂЂ....
  7. 0033C0B0  00 00 00 00 00 00 00 00 80 00 80 00 00 80 80 00  ........Ђ.Ђ..ЂЂ.
  8. 0033C0C0  80 80 80 80 80 00 00 00                                          ЂЂЂЂЂ...


В данном случае вместо единичек ставиться 80h.

Затем создается на основе вышеуказанного массива "словарь" для "расшифровки" числа, причем "словарь" имеет такой вид

Code:
  1. 0033C150  00 00 00 00 01 00 00 00 02 00 00 00 4D 00 00 00  ..........M...
  2. 0033C160  03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00  ............
  3. 0033C170  07 00 00 00 08 00 00 00 09 00 00 00 0A 00 00 00  ..............
  4. 0033C180  0B 00 00 00 0C 00 00 00 0D 00 00 00 0E 00 00 00   ..............
  5. 0033C190  4E 00 00 00 0F 00 00 00 4F 00 00 00 10 00 00 00  N......O......
  6. 0033C1A0  11 00 00 00 12 00 00 00 50 00 00 00 13 00 00 00  ......P......
  7. 0033C1B0  14 00 00 00 15 00 00 00 16 00 00 00 17 00 00 00  ............
  8. 0033C1C0  18 00 00 00 19 00 00 00 1A 00 00 00 1B 00 00 00  ............
  9. 0033C1D0  1C 00 00 00 51 00 00 00 52 00 00 00 1D 00 00 00  ...Q...R......
  10. 0033C1E0  1E 00 00 00 1F 00 00 00 53 00 00 00 54 00 00 00  ......S...T...
  11. 0033C1F0  20 00 00 00 21 00 00 00 22 00 00 00 23 00 00 00   ...!..."...#...
  12. 0033C200  55 00 00 00 56 00 00 00 57 00 00 00 24 00 00 00  U...V...W...$...
  13. 0033C210  58 00 00 00 59 00 00 00 25 00 00 00 26 00 00 00  X...Y...%...&...
  14. 0033C220  5A 00 00 00 27 00 00 00 5B 00 00 00 28 00 00 00  Z...'...[...(...
  15. 0033C230  29 00 00 00 5C 00 00 00 2A 00 00 00 2B 00 00 00  )...\...*...+...
  16. 0033C240  2C 00 00 00 5D 00 00 00 2D 00 00 00 5E 00 00 00  ,...]...-...^...
  17. 0033C250  2E 00 00 00 2F 00 00 00 30 00 00 00 31 00 00 00  ..../...0...1...
  18. 0033C260  32 00 00 00 33 00 00 00 34 00 00 00 5F 00 00 00  2...3...4..._...
  19. 0033C270  60 00 00 00 35 00 00 00 61 00 00 00 36 00 00 00  `...5...a...6...
  20. 0033C280  62 00 00 00 37 00 00 00 63 00 00 00 38 00 00 00  b...7...c...8...
  21. 0033C290  64 00 00 00 65 00 00 00 66 00 00 00 67 00 00 00  d...e...f...g...
  22. 0033C2A0  39 00 00 00 68 00 00 00 69 00 00 00 6A 00 00 00  9...h...i...j...
  23. 0033C2B0  6B 00 00 00 6C 00 00 00 6D 00 00 00 6E 00 00 00  k...l...m...n...
  24. 0033C2C0  3A 00 00 00 3B 00 00 00 3C 00 00 00 3D 00 00 00  :...;...<...=...
  25. 0033C2D0  3E 00 00 00 3F 00 00 00 40 00 00 00 41 00 00 00  >...?...@...A...
  26. 0033C2E0  42 00 00 00 43 00 00 00 44 00 00 00 45 00 00 00  B...C...D...E...
  27. 0033C2F0  6F 00 00 00 46 00 00 00 70 00 00 00 47 00 00 00  o...F...p...G...
  28. 0033C300  48 00 00 00 71 00 00 00 72 00 00 00 49 00 00 00  H...q...r...I...
  29. 0033C310  73 00 00 00 74 00 00 00 75 00 00 00 76 00 00 00  s...t...u...v...
  30. 0033C320  77 00 00 00 4A 00 00 00 4B 00 00 00 4C 00 00 00  w...J...K...L...


и на основе этого "словаря" бинарный вид расшифровываемого числа превращается вот в такой вид

Code:
  1. 0033C0D0  00 00 00 80 80 00 00 00 00 00 00 00 00 80 80 00  ...ЂЂ........ЂЂ.
  2. 0033C0E0  00 00 80 00 80 00 00 00 80 80 80 00 00 80 00 80  ..Ђ.Ђ...ЂЂЂ..Ђ.Ђ
  3. 0033C0F0  00 80 80 80 80 00 00 80 80 80 80 80 00 00 80 00  .ЂЂЂЂ..ЂЂЂЂЂ..Ђ.
  4. 0033C100  80 80 80 80 80 00 00 80 80 00 00 80 00 80 80 00  ЂЂЂЂЂ..ЂЂ..Ђ.ЂЂ.
  5. 0033C110  00 80 80 00 00 00 80 00 00 00 00 00 00 00 80 00  .ЂЂ...Ђ.......Ђ.
  6. 0033C120  80 00 80 80 00 00 80 80 00 00 00 00 00 00 80 80  Ђ.ЂЂ..ЂЂ......ЂЂ
  7. 0033C130  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  8. 0033C140  00 00 00 00 80 00 00 00                                          ....Ђ...


Т.е. после преобразования двоичных данных в хекс получаем [ 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 ]

Вот цикл преобразования

Code:
  1. mov esi, offset [Словарь]
  2. mov edi, offset [Выходной буфер]
  3. mov eax, offset [Число в бинарном виде]
  4. mov ebp,78h
  5.  
  6. xor ecx,ecx
  7. L001:
  8. cmp dword ptr ds:[esi+ecx*4h],0h
  9. jl L012
  10. mov ebx,ecx
  11. L004:
  12. movzx edx,byte ptr ds:[ebx+eax]
  13. mov byte ptr ss:[ebp+edi],dl
  14. dec ebp
  15. lea edx,dword ptr ds:[ebx*4h]
  16. mov ebx,dword ptr ds:[esi+edx]
  17. mov dword ptr ds:[esi+edx],-1h
  18. cmp dword ptr ds:[esi+ebx*4h],0h
  19. jge L004
  20. L012:
  21. inc ecx
  22. test ebp,ebp
  23. jge L001
  24. nop


Вроде просто на первый взгляд... но никогда не сталкивался с данным принципом.
Может кто уже сталкивался с аналогичным?
Подскажите как реверснуть?
И на каком этапе? Может надо обращать цикл создания "словаря"?
В общем ... вот так
Заранее благодарен за помощь!

-----
aLL rIGHTS rEVERSED!




Ранг: 4.9 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 26 июля 2012 21:10 · Поправил: m0bscene
· Личное сообщение · #2

На DES похоже.

OnLyOnE пишет:
Если б

Кусок в глаза бросился, ляпнул с ходу, на код не смотрел..)
Code:
  1.     0033C050  00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00  ...Ђ............
  2.     0033C060  80 00 80 00 00 00 80 00 00 00 00 00 00 00 00 00  Ђ.Ђ...Ђ.........
  3.     0033C070  00 80 80 00 00 00 80 80 00 00 00 00 80 80 80 00  .ЂЂ...ЂЂ....ЂЂЂ.
  4.     0033C080  80 80 00 00 80 00 80 00 00 80 00 00 00 80 00 80  ЂЂ..Ђ.Ђ..Ђ...Ђ.Ђ
  5.     0033C090  00 00 00 00 00 00 00 80 80 00 80 00 80 00 80 00  .......ЂЂ.Ђ.Ђ.Ђ.
  6.     0033C0A0  80 80 80 80 00 80 80 80 80 80 80 80 00 00 00 00  ЂЂЂЂ.ЂЂЂЂЂЂЂ....
  7.     0033C0B0  00 00 00 00 00 00 00 00 80 00 80 00 00 80 80 00  ........Ђ.Ђ..ЂЂ.
  8.     0033C0C0  80 80 80 80 80 00 00 00                                          ЂЂЂЂЂ...





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 26 июля 2012 22:38
· Личное сообщение · #3

m0bscene пишет:
На DES похоже.

Если б
Где на.. гуру реверса наши Ну пердложите умную идЭю ..

-----
aLL rIGHTS rEVERSED!





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

Создано: 26 июля 2012 23:04
· Личное сообщение · #4

- я про словарь вообще не понял, каким образом он создается? реверсни в псевдо алго
- последний асм код тоже лучше преобразовать в псевдо алго




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

Создано: 26 июля 2012 23:21 · Поправил: -=AkaBOSS=-
· Личное сообщение · #5

OnLyOnE пишет:
Вот цикл преобразования

в приведенном коде мало информации.
единственное, что заметил я - побайтовое копирование чисел в бинарном виде куда-то туда
Code:
  1. movzx edx,byte ptr ds:[ebx+eax]
  2. mov byte ptr ss:[ebp+edi],dl
  3. dec ebp


больше работа с ними здесь не производится
нужен более полный код




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 26 июля 2012 23:30 · Поправил: OnLyOnE
· Личное сообщение · #6

-=AkaBOSS=- пишет:
в приведенном коде мало информации.

Code:
  1. mov esi, offset [Словарь]
  2. mov edi, offset [Выходной буфер]
  3. mov eax, offset [Число в бинарном виде]


Откуда -> куда.. там все видно..

-----
aLL rIGHTS rEVERSED!





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 26 июля 2012 23:43 · Поправил: OKOB
· Личное сообщение · #7

OnLyOnE пишет:
Вот цикл преобразования


В код не попала инициализация ebp.

PS
mov byte ptr ss:[ebp+edi],dl >>>>>>>>>>>>>> use
dec ebp >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> decrement
test ebp,ebp >>>>>>>>>>>>>>>>>>>>>>>>>>> exit check

initialization ?????

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 26 июля 2012 23:47 · Поправил: OnLyOnE
· Личное сообщение · #8

OKOB пишет:
В код не попала инициализация ebp.

Code:
  1.  
  2.  
  3.     mov esi, offset [Словарь]
  4.     mov edi, offset [Выходной буфер]
  5.     mov eax, offset [Число в бинарном виде]
  6.     mov ebp,78h
  7.      
  8.     xor ecx,ecx
  9.     L001:
  10.     cmp dword ptr ds:[esi+ecx*4h],0h
  11.     jl L012
  12.     mov ebx,ecx
  13.     L004:
  14.     movzx edx,byte ptr ds:[ebx+eax]
  15.     mov byte ptr ss:[ebp+edi],dl
  16.     dec ebp
  17.     lea edx,dword ptr ds:[ebx*4h]
  18.     mov ebx,dword ptr ds:[esi+edx]
  19.     mov dword ptr ds:[esi+edx],-1h
  20.     cmp dword ptr ds:[esi+ebx*4h],0h
  21.     jge L004
  22.     L012:
  23.     inc ecx
  24.     test ebp,ebp
  25.     jge L001
  26.     nop


Пардон

-----
aLL rIGHTS rEVERSED!





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

Создано: 26 июля 2012 23:50 · Поправил: -=AkaBOSS=-
· Личное сообщение · #9

OnLyOnE пишет:
Откуда -> куда.. там все видно..

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

попробовал перевести этот код на более высокий уровень:

Code:
  1. int ecx = 0;
  2. int prev_ebx;
  3. int ebp = 0x78;
  4. byte eax[];
  5. int slovar[]; //esi
  6. byte buffer[]; //edi
  7.  
  8.  
  9.  
  10. while (ebp >= 0)
  11. {
  12.          if (slovar[ecx] > 0)
  13.          {
  14.                  ebx = ecx;
  15.                  while (slovar[ebx] >= 0)
  16.                  {
  17.                         buffer[ebp--] = eax[ebx];
  18.                         prev_ebx = ebx;
  19.                         ebx = slovar[prev_ebx];
  20.                         slovar[prev_ebx] = -1;
  21.                  }
  22.          }
  23.          ecx++;
  24. }


/ADD
OKOB пишет:
Внутрений цикл неверен.

и то правда
увлёкся оптимизацией, забыл про цикл




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 26 июля 2012 23:56 · Поправил: OKOB
· Личное сообщение · #10

-=AkaBOSS=-
Внутрений цикл неверен.

DWORD Dictionary_esi[];
BYTE inBuf_eax[];
BYTE outBuf_edi[];

ecx=0;
do {
if(Dictionary_esi[ecx] >= 0) {
ebx=ecx;
do {
outBuf_edi[ebp--] = inBuf[ebx];
ebx1 = Dictionary_esi[ebx];
Dictionary_esi[ebx] = -1;
ebx = ebx1;
}while(Dictionary_esi[ebx] >= 0)
}
// L012:
ecx++;
}while(ebp >= 0);

-----
127.0.0.1, sweet 127.0.0.1


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


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 27 июля 2012 00:15
· Личное сообщение · #11

Так.. вот скомпиленный кусок кода для Olly.. без дебагера естественно "упадет".
Там весь алго...


45a3_26.07.2012_EXELAB.rU.tgz - test.exe

-----
aLL rIGHTS rEVERSED!





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

Создано: 27 июля 2012 01:01 · Поправил: -=AkaBOSS=-
· Личное сообщение · #12

ну, я понял только то, что словарь генерируется на основе количества установленных/сброшенных бит ключа и их расположении в ключе

процедура генерации словаря выглядит примерно так:

Code:
  1. byte eax[];
  2. int slovar[]; // в этом цикле он как раз и заполняется
  3. int edi[]; // по сути, это не массив, а счётчик
  4. ; в нулевом элементе - считаются обработанные нулевые биты
  5. ; в 0x80 элементе - считаются обработанные установленные биты
  6. ; изначально там записано количество неустановленных бит в ключе
  7.  
  8. for (edx = 0; edx < 0x78; edx++)
  9. {
  10.          ebx = eax[edx];
  11.          ecx = edi[ebx];
  12.          slovar[edx] = ecx;
  13.          edi[ebx] = ++ecx;
  14. }


НО.
В выложенном примере опять-таки отсутствует сама процедура совмещения алфавита с ключом.
Более того - на последнем этапе словарь затирается!

Неясно, как с помощью этих данных преобразовать это:
10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8
в это:
18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08

OnlyOne, рекомендую проверить рип кода из программы. Мне кажется, что-то важное было пропущено.

К тому же, могу предположить, что полноценно обратить алгоритм не удастся,
так как словарь вычисляется на основе шифруемого бинарного массива.
Поэтому нужно вырипать алго полностью, и налабать брутфорсер.




Ранг: 52.0 (постоянный), 146thx
Активность: 0.030.08
Статус: Участник

Создано: 27 июля 2012 09:42
· Личное сообщение · #13

Вобще-то это ооочень похоже на хаффмана...
сначала идет подсчет всех символов... но в данном случае мы имеем только 0x00 и 0x80...

Code:
  1. #define BLOCK_LEN_BITS 120
  2. #define BLOCK_LEN_BYTES (BLOCK_LEN_BITS/8)
  3.  
  4. //---------------------------------------------------------------------------
  5. void GenKey(unsigned char *src, int *pKey)
  6. {
  7.     int i, j, t;
  8.     int arr[256];
  9.  
  10.     memset(arr, 0, sizeof(arr));
  11.     for (= 0; i < BLOCK_LEN_BITS; i++) arr[src[i]] += 1;
  12.  
  13.     for (= 0, j = 0; i < 256; i++)
  14.     {
  15.         t = arr[i];
  16.         arr[i] = j;
  17.         j += t;
  18.     }
  19.  
  20.     for (= 0; i < BLOCK_LEN_BITS; i++) pKey[i] = arr[src[i]]++;
  21. }
  22.  
  23. //---------------------------------------------------------------------------
  24. void Decrypt(const void *pIn, void *pOut)
  25. {
  26.     int i, j, k, t;
  27.  
  28.     int key[BLOCK_LEN_BITS];
  29.     unsigned char srcBits[BLOCK_LEN_BITS];
  30.     unsigned char dstBits[BLOCK_LEN_BITS];
  31.  
  32.     unsigned char *src = (unsigned char*)pIn;
  33.     unsigned char *dst = (unsigned char*)pOut;
  34.  
  35.     memset(key, 0, sizeof(key));
  36.     memset(srcBits, 0, sizeof(srcBits));
  37.     memset(dstBits, 0, sizeof(dstBits));
  38.     memset(dst, 0, BLOCK_LEN_BYTES);
  39.  
  40.     for (= 0; i < BLOCK_LEN_BITS; i++) srcBits[i] = (src[i>>3] << (i&7)) & 0x80;
  41.  
  42.     GenKey(srcBits, key);
  43.  
  44.     k = 0;
  45.     i = BLOCK_LEN_BITS;
  46.     do
  47.     {
  48.         if (key[k] >= 0)
  49.         {
  50.             j = k;
  51.             do
  52.             {
  53.                 i--;
  54.                 dstBits[i] = srcBits[j];
  55.                 t = key[j];
  56.                 key[j] = -1;
  57.                 j = t;
  58.             } while (key[j] >= 0);
  59.         }
  60.         k++;
  61.     } while (i);
  62.  
  63.     for (= 0; i < BLOCK_LEN_BITS; i++) dst[i>>3] |= (dstBits[i] >> (i&7));
  64. }


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


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 27 июля 2012 19:05 · Поправил: OnLyOnE
· Личное сообщение · #14

-=AkaBOSS=-
В общем выдрал полностью всю функцию... там весь код с начала до конца.. в функцию передается два параметра
1. 16 байт [10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8]
2. Буфер-приемник, в который куда кладутся байты [ 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 ]

Прикрепляю файл с функцией.

Задача - обратить функцию, т.е. чтобы на вход подавалось [ 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 ] а на выходе [10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8]

P.S. Есть любители крякмисов вот вам реальный крякмис.. по крайней мере задача не тривиальная..

5eac_27.07.2012_EXELAB.rU.tgz - test2.exe

-----
aLL rIGHTS rEVERSED!





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

Создано: 27 июля 2012 19:21 · Поправил: reversecode
· Личное сообщение · #15

ну так хаффман, сказали же уже

ps F5 в рейсе мог бы и сам нажать




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 27 июля 2012 19:36
· Личное сообщение · #16

reversecode пишет:
ну так хаффман, сказали же уже

UniSoft пишет:
Вобще-то это ооочень похоже на хаффмана...


Не факт.. только предположение.

-----
aLL rIGHTS rEVERSED!





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

Создано: 27 июля 2012 19:40 · Поправил: reversecode
· Личное сообщение · #17

факт, два цикла >>3 & 3, в начале и конце и по средине еще два, хаффман!
нажмиже ты F5 рейса! не стесняйся! и сравни с тем что предложил UniSoft

OnLyOnE
куда уж больше чем похоже если даже таблица такая же на 120 бит #define BLOCK_LEN_BITS 120




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 27 июля 2012 21:41 · Поправил: OnLyOnE
· Личное сообщение · #18

UniSoft
Скинь пожалуйста код Encrypt-а...
reversecode
Да это оно
Точнее похоже... НО по алго Хоффмана вместе с кодированными байтами должна передаваться таблица частот (словарь).. здесь же словарь формируется на основе входящих байт разложенных на биты..
т.е. шифрование или расшифровка односторонняя ... вот и вопрос как обратить?

-----
aLL rIGHTS rEVERSED!





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

Создано: 28 июля 2012 01:16 · Поправил: mak
· Личное сообщение · #19

Можно посмотреть доки по ручной сборке SBox, не смотря на хафмана, судя по этапам описанным тобой, то шифр подстановки используется как Сбокс и Пермутэйшн бокс, в свою очередь в теории пермутационные блоки обращаются не все и могут выглядеть разным образом. Подробнее можно нагуглить.

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

П.С. Код не смотрел и за хафмана не цеплялся, принял как модификацию, если так, то подробные шаги уже описал, как бы делал я сам. В целом Хафман уже инфо и анализ, далее уже проще написать солвер.

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





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 28 июля 2012 02:42
· Личное сообщение · #20

Какой Хаффман? У нас всего два символа 00 и 80. Подсчет частоты как в Хаффмане, тут лишь определение границ счетчика при построении словаря. 0...число нулей-1 для нулей и число нулей...число бит-1 для единиц. В Хаффмане после построения дерева (словаря) кодирование переменной длины. Тут такого и в помине нет.

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 28 июля 2012 02:45 · Поправил: OnLyOnE
· Личное сообщение · #21

Охохо
Как у нас все любят давать ЦУ но реальной помощи хрен дождешься ...
Конкретная помощь - это решение задачи. Если б я ее решил или знал бы как решить.. я не создал бы топ.
Пока в результате своих изысканий понял, что модифицировать необходимо именно цикл создания
"словаря".. ибо все перестановки идут именно по нему.. но пока не могу придумать как это сделать..

P.S. Вот интересно... у нас любят ломать всякие крякмисы написанные чисто для выпендрежа ... а решить данную задачу никого нет.
Прихожу к мнению, что просто не по зубам..

-----
aLL rIGHTS rEVERSED!





Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 29 июля 2012 10:32 · Поправил: ZaZa
· Личное сообщение · #22

OnLyOnE
А есть еще связки "входные-выходные данные" из оригинальной программы?
Откуда берутся входные данные и куда пойдут выходные?
Для чего вообще реверс алгоритма? Keygen, не?

Я тут решил немного, так скажем, побрутить, присмотреться к тому, как генерируется выходные данные, так вот:
Code:
  1. INPUT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  2. OUTPUT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  3.  
  4. INPUT: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  5. OUTPUT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80
  6.  
  7. INPUT: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  8. OUTPUT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40
  9.  
  10. INPUT: 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  11. OUTPUT: 00 00 00 00 00 00 00 80 00 00 00 00 00 00 40
  12.  
  13. INPUT: 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  14. OUTPUT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20
  15.  
  16. INPUT: 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  17. OUTPUT: 00 00 00 00 00 00 00 80 00 00 00 00 00 00 20
  18.  
  19. INPUT: 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  20. OUTPUT: 00 00 00 00 00 00 00 40 00 00 00 00 00 00 20
  21.  
  22. INPUT: 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  23. OUTPUT: 00 00 00 00 02 00 00 00 00 08 00 00 00 00 20
  24.  
  25. INPUT: 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  26. OUTPUT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10
  27.  
  28. INPUT: 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  29. OUTPUT: 00 00 00 00 00 00 00 80 00 00 00 00 00 00 10
  30.  
  31. INPUT: 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  32. OUTPUT: 00 00 00 00 00 00 00 20 00 00 00 00 00 00 10
  33.  
  34. INPUT: 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  35. OUTPUT: 00 00 00 00 01 00 00 00 00 04 00 00 00 00 10
  36.  
  37. INPUT: 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  38. OUTPUT: 00 00 00 00 00 00 00 40 00 00 00 00 00 00 10
  39.  
  40. INPUT: 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  41. OUTPUT: 00 00 00 00 02 00 00 00 00 08 00 00 00 00 10
  42.  
  43. INPUT: 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  44. OUTPUT: 00 00 00 00 02 00 00 00 00 04 00 00 00 00 10
  45.  
  46. INPUT: 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  47. OUTPUT: 00 00 00 08 00 00 00 40 00 00 02 00 00 00 10
  48.  
  49. INPUT: 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  50. OUTPUT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08
  51.  
  52. INPUT: 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  53. OUTPUT: 00 00 00 00 00 00 00 80 00 00 00 00 00 00 08
  54.  
  55. INPUT: 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  56. OUTPUT: 00 00 00 00 00 00 00 10 00 00 00 00 00 00 08
  57.  
  58. INPUT: 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  59. OUTPUT: 00 00 00 00 00 80 00 00 00 02 00 00 00 00 08
  60.  
  61. INPUT: 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  62. OUTPUT: 00 00 00 00 00 00 00 40 00 00 00 00 00 00 08
  63.  
  64. INPUT: 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  65. OUTPUT: 00 00 00 00 02 00 00 00 00 08 00 00 00 00 08
  66.  
  67. INPUT: 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  68. OUTPUT: 00 00 00 00 01 00 00 00 00 02 00 00 00 00 08
  69.  
  70. INPUT: 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  71. OUTPUT: 00 00 00 08 00 00 00 40 00 00 02 00 00 00 08
  72.  
  73. INPUT: 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  74. OUTPUT: 00 00 00 00 00 00 00 20 00 00 00 00 00 00 08
  75.  
  76. INPUT: 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  77. OUTPUT: 00 00 00 00 01 00 00 00 00 04 00 00 00 00 08
  78.  
  79. INPUT: 1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  80. OUTPUT: 00 00 00 00 02 00 00 00 00 02 00 00 00 00 08
  81.  
  82. INPUT: 1B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  83. OUTPUT: 00 00 00 08 00 00 00 40 00 00 01 00 00 00 08
  84.  
  85. INPUT: 1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  86. OUTPUT: 00 00 00 00 02 00 00 00 00 04 00 00 00 00 08
  87.  
  88. INPUT: 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  89. OUTPUT: 00 00 00 08 00 00 00 20 00 00 01 00 00 00 08
  90.  
  91. INPUT: 1E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  92. OUTPUT: 00 00 00 04 00 00 00 20 00 00 01 00 00 00 08
  93.  
  94. INPUT: 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  95. OUTPUT: 00 00 01 00 00 02 00 00 02 00 00 04 00 00 08
  96.  
  97. INPUT: 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  98. OUTPUT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04
  99.  
  100. INPUT: 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  101. OUTPUT: 00 00 00 00 00 00 00 80 00 00 00 00 00 00 04
  102.  
  103. INPUT: 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  104. OUTPUT: 00 00 00 00 00 00 00 08 00 00 00 00 00 00 04
  105.  
  106. INPUT: 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  107. OUTPUT: 00 00 00 00 00 40 00 00 00 01 00 00 00 00 04
  108.  
  109. INPUT: 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  110. OUTPUT: 00 00 00 00 00 00 00 40 00 00 00 00 00 00 04
  111.  
  112. INPUT: 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  113. OUTPUT: 00 00 00 00 02 00 00 00 00 08 00 00 00 00 04
  114.  
  115. INPUT: 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  116. OUTPUT: 00 00 00 00 00 80 00 00 00 01 00 00 00 00 04
  117.  
  118. INPUT: 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  119. OUTPUT: 00 00 00 08 00 00 00 40 00 00 02 00 00 00 04
  120.  
  121. INPUT: 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  122. OUTPUT: 00 00 00 00 00 00 00 10 00 00 00 00 00 00 04
  123.  
  124. INPUT: 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  125. OUTPUT: 00 00 00 00 00 80 00 00 00 02 00 00 00 00 04
  126.  
  127. INPUT: 2A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  128. OUTPUT: 00 00 00 00 02 00 00 00 00 01 00 00 00 00 04
  129.  
  130. INPUT: 2B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  131. OUTPUT: 00 00 00 08 00 00 00 40 00 00 00 80 00 00 04
  132.  
  133. INPUT: 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  134. OUTPUT: 00 00 00 00 02 00 00 00 00 04 00 00 00 00 04
  135.  
  136. INPUT: 2D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  137. OUTPUT: 00 00 00 08 00 00 00 10 00 00 00 80 00 00 04
  138.  
  139. INPUT: 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  140. OUTPUT: 00 00 00 02 00 00 00 10 00 00 00 80 00 00 04
  141.  
  142. INPUT: 2F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  143. OUTPUT: 00 00 00 80 00 01 00 00 01 00 00 02 00 00 04
  144.  
  145. INPUT: 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  146. OUTPUT: 00 00 00 00 00 00 00 20 00 00 00 00 00 00 04
  147.  
  148. INPUT: 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  149. OUTPUT: 00 00 00 00 01 00 00 00 00 04 00 00 00 00 04
  150.  
  151. INPUT: 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  152. OUTPUT: 00 00 00 00 01 00 00 00 00 01 00 00 00 00 04
  153.  
  154. INPUT: 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  155. OUTPUT: 00 00 00 08 00 00 00 40 00 00 01 00 00 00 04
  156.  
  157. INPUT: 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  158. OUTPUT: 00 00 00 00 02 00 00 00 00 02 00 00 00 00 04
  159.  
  160. INPUT: 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  161. OUTPUT: 00 00 00 08 00 00 00 20 00 00 01 00 00 00 04
  162.  
  163. INPUT: 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  164. OUTPUT: 00 00 00 04 00 00 00 20 00 00 01 00 00 00 04
  165.  
  166. INPUT: 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  167. OUTPUT: 00 00 01 00 00 02 00 00 01 00 00 02 00 00 04
  168.  
  169. INPUT: 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  170. OUTPUT: 00 00 00 00 01 00 00 00 00 02 00 00 00 00 04
  171.  
  172. INPUT: 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  173. OUTPUT: 00 00 00 08 00 00 00 20 00 00 00 80 00 00 04
  174.  
  175. INPUT: 3A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  176. OUTPUT: 00 00 00 04 00 00 00 10 00 00 00 80 00 00 04
  177.  
  178. INPUT: 3B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  179. OUTPUT: 00 00 01 00 00 02 00 00 02 00 00 04 00 00 04
  180.  
  181. INPUT: 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  182. OUTPUT: 00 00 00 04 00 00 00 20 00 00 00 80 00 00 04
  183.  
  184. INPUT: 3D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  185. OUTPUT: 00 00 01 00 00 02 00 00 02 00 00 02 00 00 04
  186.  
  187. INPUT: 3E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  188. OUTPUT: 00 00 01 00 00 01 00 00 02 00 00 02 00 00 04
  189.  
  190. INPUT: 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  191. OUTPUT: 00 00 10 00 01 00 00 20 00 02 00 00 20 00 04
  192.  
  193. INPUT: 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  194. OUTPUT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02
  195.  
  196. INPUT: 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  197. OUTPUT: 00 00 00 00 00 00 00 80 00 00 00 00 00 00 02
  198.  
  199. INPUT: 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  200. OUTPUT: 00 00 00 00 00 00 00 04 00 00 00 00 00 00 02
  201.  
  202. INPUT: 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  203. OUTPUT: 00 00 00 00 00 20 00 00 00 00 80 00 00 00 02
  204.  
  205. INPUT: 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  206. OUTPUT: 00 00 00 00 00 00 00 40 00 00 00 00 00 00 02
  207.  
  208. INPUT: 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  209. OUTPUT: 00 00 00 00 02 00 00 00 00 08 00 00 00 00 02
  210.  
  211. INPUT: 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  212. OUTPUT: 00 00 00 00 00 40 00 00 00 00 80 00 00 00 02
  213.  
  214. INPUT: 47 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  215. OUTPUT: 00 00 00 08 00 00 00 40 00 00 02 00 00 00 02
  216.  
  217. INPUT: 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  218. OUTPUT: 00 00 00 00 00 00 00 08 00 00 00 00 00 00 02
  219.  
  220. INPUT: 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  221. OUTPUT: 00 00 00 00 00 40 00 00 00 01 00 00 00 00 02
  222.  
  223. INPUT: 4A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  224. OUTPUT: 00 00 00 00 02 00 00 00 00 00 80 00 00 00 02
  225.  
  226. INPUT: 4B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  227. OUTPUT: 00 00 00 08 00 00 00 40 00 00 00 40 00 00 02
  228.  
  229. INPUT: 4C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  230. OUTPUT: 00 00 00 00 02 00 00 00 00 04 00 00 00 00 02
  231.  
  232. INPUT: 4D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  233. OUTPUT: 00 00 00 08 00 00 00 08 00 00 00 40 00 00 02
  234.  
  235. INPUT: 4E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  236. OUTPUT: 00 00 00 01 00 00 00 08 00 00 00 40 00 00 02
  237.  
  238. INPUT: 4F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  239. OUTPUT: 00 00 00 40 00 00 80 00 00 80 00 01 00 00 02
  240.  
  241. INPUT: 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  242. OUTPUT: 00 00 00 00 00 00 00 20 00 00 00 00 00 00 02
  243.  
  244. INPUT: 51 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  245. OUTPUT: 00 00 00 00 01 00 00 00 00 04 00 00 00 00 02
  246.  
  247. INPUT: 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  248. OUTPUT: 00 00 00 00 00 80 00 00 00 00 80 00 00 00 02
  249.  
  250. INPUT: 53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  251. OUTPUT: 00 00 00 08 00 00 00 40 00 00 01 00 00 00 02
  252.  
  253. INPUT: 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  254. OUTPUT: 00 00 00 00 02 00 00 00 00 01 00 00 00 00 02
  255.  
  256. INPUT: 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  257. OUTPUT: 00 00 00 08 00 00 00 20 00 00 01 00 00 00 02
  258.  
  259. INPUT: 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  260. OUTPUT: 00 00 00 04 00 00 00 20 00 00 01 00 00 00 02
  261.  
  262. INPUT: 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  263. OUTPUT: 00 00 01 00 00 02 00 00 00 80 00 01 00 00 02
  264.  
  265. INPUT: 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  266. OUTPUT: 00 00 00 00 00 80 00 00 00 01 00 00 00 00 02
  267.  
  268. INPUT: 59 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  269. OUTPUT: 00 00 00 08 00 00 00 10 00 00 00 40 00 00 02
  270.  
  271. INPUT: 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  272. OUTPUT: 00 00 00 02 00 00 00 08 00 00 00 40 00 00 02
  273.  
  274. INPUT: 5B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  275. OUTPUT: 00 00 01 00 00 02 00 00 02 00 00 04 00 00 02

Может кто увидит, чего интересного ))

-----
One death is a tragedy, one million is a statistic.




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 29 июля 2012 11:16
· Личное сообщение · #23

Вобщем может ктото будет ковырять алго дальше, попробуйте эксперемент. подать функе массив из сплошных единиц ну или (80) в нашем случае. Получаем последовательный словарь. ИМХО тут алго построен на принципе перемешивания данных по условию входной битной последовательности. Думаю обратим

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 29 июля 2012 15:32 · Поправил: OKOB
· Личное сообщение · #24

ZaZa пишет:
Может кто увидит, чего интересного ))


И зачем такой прямой брут, если есть исходник входного алго по которому все ясно.

VodoleY пишет:
Думаю обратим

Если и обратим, то очень не тривиально. От входного набора остается только общее количество нулей и единиц.

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 29 июля 2012 16:23 · Поправил: ZaZa
· Личное сообщение · #25

OKOB пишет:
И зачем такой прямой брут, если есть исходник входного алго по которому все ясно.


Согласен, но иногда можно просто увидеть перестановку, сравнив визуально... Тем более я ж не запустил брут на полную...

OKOB пишет:
Если и обратим, то очень не тривиально.

И с этим согласен полностью... Если брать алгоритм и просто пробовать его обратить (последний важный цикл):
Code:
  1. 00401133  |>833C8E 00       /CMP DWORD PTR DS:[ESI+ECX*4], 0         ; ---- LOOP 1 ----- ESI[ECX*4] >= 0 ???
  2. 00401137  |.7C 22           |JL SHORT 0040115B
  3. 00401139  |.8BD9            |MOV EBX, ECX                            ; ---- LOOP 2 ----- EBX = ECX
  4. 0040113B  |>0FB61403        |/MOVZX EDX, BYTE PTR DS:[EBX+EAX]       ; EDX = EAX[EBX]
  5. 0040113F  |.88543D 00       ||MOV BYTE PTR SS:[EBP+EDI], DL          ; OUTPUT[EBP] = EDX
  6. 00401143  |.4D              ||DEC EBP                                ; EBP -= 1
  7. 00401144  |.8D149D 00000000 ||LEA EDX, DWORD PTR DS:[EBX*4]          ; EDX = EBX * 4
  8. 0040114B  |.8B1C16          ||MOV EBX, DWORD PTR DS:[ESI+EDX]        ; EBX = ESI[EDX]
  9. 0040114E  |.C70416 FFFFFFFF ||MOV DWORD PTR DS:[ESI+EDX], -1         ; ESI[EDX] = 0xFFFFFFFF
  10. 00401155  |.833C9E 00       ||CMP DWORD PTR DS:[ESI+EBX*4], 0        ; ESI[EBX*4] > 0 ???
  11. 00401159  |.7D E0           |\JGE SHORT 0040113B                     ; -----REPEAT LOOP 2-----
  12. 0040115B  |>41              |INC ECX                                 ; ECX += 1
  13. 0040115C  |.85ED            |TEST EBP, EBP                           ; EBP >= 0 ???
  14. 0040115E  |.7D D3           \JGE SHORT 00401133                      ; -----REPEAT LOOP 1-----

то не хватает многих входных данных для реверса: EBX, ECX, EDX... Все они зависят от того, какие данные поданы на вход!
Тем более, словарь (ESI) на выходе приобретает вид одних 0xFF, то есть затирается... Что и куда записывать при реверсе алгоритма - непонятно...
В аттаче прикладываю значения регистров EBX, ECX, EDX при некоторых входных данных... Зависимость присутствует, но не могу догнать, какая...


c45b_30.07.2012_EXELAB.rU.tgz - BRUT.txt

-----
One death is a tragedy, one million is a statistic.




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 30 июля 2012 09:08 · Поправил: VodoleY
· Личное сообщение · #26

OKOB пишет:
Если и обратим, то очень не тривиально. От входного набора остается только общее количество нулей и единиц.

я могу сказать одно. решение в однозначном виде есть. для меньшего диапазона, но оно существует. я бы сказал что в нем используеца алгоритм сартировки с кастомной функой сравнения, которая принимает решения переставлять местами числа в словоре или нет. (величина чисел при этом значения не имеет, а управление происходит входным битовым потоком)
З.Ы. Обратите внимание на словарь указанный онливанычем в шапке. 2 массива стартующие с 1,2,3.. и 4D,4E,4F... идущие последовательно и вшиты один в другой согласно битовой маске.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 30 июля 2012 09:27 · Поправил: ZaZa
· Личное сообщение · #27

VodoleY пишет:
Обратите внимание на словарь указанный онливанычем в шапке. 2 массива стартующие с 1,2,3.. и 4D,4E,4F... идущие последовательно и вшиты один в другой согласно битовой маске.

Причем, 4D - это количество "0" в битовом представлении входного массива данных, ну или разница 0x78 и количества "1"...
Code:
  1. Если задать в качестве входного массива: 
  2. 00402010   01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F     ....
  3.  
  4. Битовая маска входного массива:
  5. 0012F8E4   00 00 00 00 00 00 00 80 00 00 00 00 00 00 80 00  .......Ђ......Ђ.
  6. 0012F8F4   00 00 00 00 00 00 80 80 00 00 00 00 00 80 00 00  ......ЂЂ.....Ђ..
  7. 0012F904   00 00 00 00 00 80 00 80 00 00 00 00 00 80 80 00  .....Ђ.Ђ.....ЂЂ.
  8. 0012F914   00 00 00 00 00 80 80 80 00 00 00 00 80 00 00 00  .....ЂЂЂ....Ђ...
  9. 0012F924   00 00 00 00 80 00 00 80 00 00 00 00 80 00 80 00  ....Ђ..Ђ....Ђ.Ђ.
  10. 0012F934   00 00 00 00 80 00 80 80 00 00 00 00 80 80 00 00  ....Ђ.ЂЂ....ЂЂ..
  11. 0012F944   00 00 00 00 80 80 00 80 00 00 00 00 80 80 80 00  ....ЂЂ.Ђ....ЂЂЂ.
  12. 0012F954   00 00 00 00 80 80 80 80                          ....ЂЂЂЂ
  13. Количество единиц: 0x20
  14. Количество нулей: 0x58
  15.  
  16. То, словарь будет:
  17. 0012FDD4   00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00  .............
  18. 0012FDE4   04 00 00 00 05 00 00 00 06 00 00 00 58 00 00 00  .........X...
  19. 0012FDF4   07 00 00 00 08 00 00 00 09 00 00 00 0A 00 00 00  ..............
  20. 0012FE04   0B 00 00 00 0C 00 00 00 59 00 00 00 0D 00 00 00  .......Y.......
  21. 0012FE14   0E 00 00 00 0F 00 00 00 10 00 00 00 11 00 00 00  ............
  22. 0012FE24   12 00 00 00 13 00 00 00 5A 00 00 00 5B 00 00 00  ......Z...[...
  23. 0012FE34   14 00 00 00 15 00 00 00 16 00 00 00 17 00 00 00  ............
  24. 0012FE44   18 00 00 00 5C 00 00 00 19 00 00 00 1A 00 00 00  ...\.........
  25. 0012FE54   1B 00 00 00 1C 00 00 00 1D 00 00 00 1E 00 00 00  ............
  26. 0012FE64   1F 00 00 00 5D 00 00 00 20 00 00 00 5E 00 00 00  ...]... ...^...
  27. 0012FE74   21 00 00 00 22 00 00 00 23 00 00 00 24 00 00 00  !..."...#...$...
  28. 0012FE84   25 00 00 00 5F 00 00 00 60 00 00 00 26 00 00 00  %..._...`...&...
  29. 0012FE94   27 00 00 00 28 00 00 00 29 00 00 00 2A 00 00 00  '...(...)...*...
  30. 0012FEA4   2B 00 00 00 61 00 00 00 62 00 00 00 63 00 00 00  +...a...b...c...
  31. 0012FEB4   2C 00 00 00 2D 00 00 00 2E 00 00 00 2F 00 00 00  ,...-......./...
  32. 0012FEC4   64 00 00 00 30 00 00 00 31 00 00 00 32 00 00 00  d...0...1...2...
  33. 0012FED4   33 00 00 00 34 00 00 00 35 00 00 00 36 00 00 00  3...4...5...6...
  34. 0012FEE4   65 00 00 00 37 00 00 00 38 00 00 00 66 00 00 00  e...7...8...f...
  35. 0012FEF4   39 00 00 00 3A 00 00 00 3B 00 00 00 3C 00 00 00  9...:...;...<...
  36. 0012FF04   67 00 00 00 3D 00 00 00 68 00 00 00 3E 00 00 00  g...=...h...>...
  37. 0012FF14   3F 00 00 00 40 00 00 00 41 00 00 00 42 00 00 00  ?...@...A...B...
  38. 0012FF24   69 00 00 00 43 00 00 00 6A 00 00 00 6B 00 00 00  i...C...j...k...
  39. 0012FF34   44 00 00 00 45 00 00 00 46 00 00 00 47 00 00 00  D...E...F...G...
  40. 0012FF44   6C 00 00 00 6D 00 00 00 48 00 00 00 49 00 00 00  l...m...H...I...
  41. 0012FF54   4A 00 00 00 4B 00 00 00 4C 00 00 00 4D 00 00 00  J...K...L...M...
  42. 0012FF64   6E 00 00 00 6F 00 00 00 4E 00 00 00 70 00 00 00  n...o...N...p...
  43. 0012FF74   4F 00 00 00 50 00 00 00 51 00 00 00 52 00 00 00  O...P...Q...R...
  44. 0012FF84   71 00 00 00 72 00 00 00 73 00 00 00 53 00 00 00  q...r...s...S...
  45. 0012FF94   54 00 00 00 55 00 00 00 56 00 00 00 57 00 00 00  T...U...V...W...
  46. 0012FFA4   74 00 00 00 75 00 00 00 76 00 00 00 77 00 00 00  t...u...v...w...


-----
One death is a tragedy, one million is a statistic.





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 30 июля 2012 09:51
· Личное сообщение · #28

VodoleY пишет:
Обратите внимание на словарь


Словарь - это пронумерованные во входном потоки биты, сначала нумеруются нули 00h (0...4С), а потом единицы 80h (4D..77).

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 30 июля 2012 11:57 · Поправил: Veliant
· Личное сообщение · #29

OKOB пишет:
Словарь - это пронумерованные во входном потоки биты, сначала нумеруются нули 00h (0...4С), а потом единицы 80h (4D..77).

Ну на глаз это хорошо видно, однако обратной операции в лоб не найдешь. Может через некоторое число перестановок оно снова вернется к исходному виду? Только даже если так и случится, количество итераций цикла будет зависеть от кол-ва единиц




Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 30 июля 2012 20:53 · Поправил: ZaZa
· Личное сообщение · #30

Таак... А если отойти немного от реверса алгоритма и ударить, так сказать, в лоб!
Я имею ввиду брут... Нам известны выходные данные. При переводе его в бинарный вид, мы получим количество единиц (0x80). То есть нам останется сбрутить входные данные именно с тем количеством единиц (0x80), которые есть на выходе, так как это шифр перестановки - количество единиц (0x80) не меняется!

Не буду пока пытаться найти способ сократить брут, но займусь подсчетом вариаций (поправьте, если я не прав). Подсчет ведется по выходным данным, предоставившим OnLyOnE:
Code:
  1. [ 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 ]
  2.  
  3. Биты:
  4. 0033C0D0  00 00 00 80 80 00 00 00 00 00 00 00 00 80 80 00  ...ЂЂ........ЂЂ.
  5. 0033C0E0  00 00 80 00 80 00 00 00 80 80 80 00 00 80 00 80  ..Ђ.Ђ...ЂЂЂ..Ђ.Ђ
  6. 0033C0F0  00 80 80 80 80 00 00 80 80 80 80 80 00 00 80 00  .ЂЂЂЂ..ЂЂЂЂЂ..Ђ.
  7. 0033C100  80 80 80 80 80 00 00 80 80 00 00 80 00 80 80 00  ЂЂЂЂЂ..ЂЂ..Ђ.ЂЂ.
  8. 0033C110  00 80 80 00 00 00 80 00 00 00 00 00 00 00 80 00  .ЂЂ...Ђ.......Ђ.
  9. 0033C120  80 00 80 80 00 00 80 80 00 00 00 00 00 00 80 80  Ђ.ЂЂ..ЂЂ......ЂЂ
  10. 0033C130  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  11. 0033C140  00 00 00 00 80 00 00 00                          ....Ђ...

имеется: 120 бит, из них 43 - это единицы (0x80), тогда формула будет такой:
С = 120! / (43!*(120-43)!) = 762660291046620048412114231770960
Мда... дофигища вышло...

Тогда все-таки придется искать, как сократить брут... Есть идеи? И вообще, есть ли смысл так извращаться? Просто я ничего другого тут не вижу, кроме как брутить, ведь неизвестно абсолютно, на каких местах располагаются единички (0x80) во входных данных (да и получить эти позиции нереально)...

-----
One death is a tragedy, one million is a statistic.



. 1 . 2 . >>
 eXeL@B —› Основной форум —› Шифр перестановкой
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати