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

 eXeL@B —› Крэки, обсуждения —› Permutation Сipher
Посл.ответ Сообщение


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

Создано: 02 февраля 2020 20:03
· Личное сообщение · #1

Привет всем
Копаю одну прогаммулину, на предмет закейгенить.
На одном из этапов разбора алго вылез перестановочный шифр.
Похоже что что-то стандартное, но я не уверен.
Может кто, чисто визуально, сталкивался с подобным?
Чтобы идентифицировать его, или сгенерить таблицу обратной перестановки (при условии, что функция Decrypt == Encrypt)
Code:
  1. .data
  2. ShiftTable \
  3. db 9,4,7,15,13,10,3,11,1,2,12,8,6,14,5,0
  4. db 9,11,5,4,8,15,1,14,7,0,3,2,10,6,13,12
  5. db 12,14,1,4,9,15,10,11,13,6,0,8,7,2,5,3
  6. db 11,2,5,14,13,3,9,0,1,15,7,12,10,6,4,8
  7. db 6,2,4,5,11,8,12,14,13,15,7,1,10,0,3,9
  8. db 5,4,14,12,7,6,13,10,15,2,9,1,0,11,8,3
  9. db 12,7,8,15,11,0,5,9,13,10,6,14,2,4,3,1
  10. db 3,10,14,8,1,11,5,4,2,15,13,12,6,7,9,0
  11. db 12,13,1,15,8,14,5,11,3,10,9,0,7,2,4,6
  12. db 13,10,7,14,1,6,11,8,15,12,5,2,3,0,4,9
  13. db 3,14,7,5,11,15,8,12,1,10,4,13,0,6,9,2
  14. db 11,6,9,4,1,8,10,13,7,14,0,12,15,2,3,5
  15. db 12,7,8,13,3,11,0,14,6,15,9,4,10,1,5,2
  16. db 12,6,13,9,11,0,1,2,15,7,3,4,10,14,8,5
  17. db 3,6,1,5,11,12,8,0,15,14,9,4,7,10,13,2
  18. db 10,7,11,15,2,8,0,13,14,12,1,6,9,3,5,4
  19. db 10,11,13,4,3,8,5,9,1,0,15,12,7,14,2,6
  20. db 11,4,13,15,1,6,3,14,7,10,12,8,9,2,5,0
  21. db 9,6,7,0,1,10,13,2,3,14,15,12,5,11,4,8
  22. db 13,14,5,6,1,9,8,12,2,15,3,7,11,4,0,10
  23. db 9,15,4,0,1,6,10,14,2,3,7,13,5,11,8,12
  24. db 3,14,1,10,2,12,8,4,11,7,13,0,15,6,9,5
  25. db 7,2,12,6,10,8,11,0,15,4,3,14,9,1,13,5
  26. db 12,4,5,9,10,2,8,13,3,15,1,14,6,7,11,0
  27. db 10,8,14,13,9,15,3,0,4,6,1,12,7,11,2,5
  28. db 3,12,4,10,2,15,13,14,7,0,5,8,1,6,11,9
  29. db 10,12,1,0,9,14,13,11,3,7,15,8,5,2,4,6
  30. db 14,10,1,8,7,6,5,12,2,15,0,13,3,11,4,9
  31. db 3,8,14,0,7,9,15,12,1,6,13,2,5,10,11,4
  32. db 3,10,12,4,13,11,9,14,15,6,1,7,2,0,5,8
  33.  
  34. .code
  35. Decrypt proc
  36.  
  37.          sub esp,0Ch
  38.          push ebx
  39.          push ebp
  40.          push esi
  41.          mov ebp, 1Dh
  42.          push edi
  43.          mov edi, ecx
  44.          mov dword ptr ss:[esp+14h], ebp
  45.          mov eax, 1D0h
  46.  
  47. @L00000001:
  48.          mov esi, ebp
  49.          mov ecx, ebp
  50.          and esi, 7h
  51.          mov edx, 3h
  52.          shr ecx, 3h
  53.          shl esi, 2h
  54.          mov dword ptr ss:[esp+18h], ecx
  55.          sub edx, ecx
  56.          mov ebx, 0Fh
  57.          mov ecx, esi
  58.          mov edx, dword ptr ds:[edi+edx*4h]
  59.          shl ebx, cl
  60.          and edx, ebx
  61.          shr edx, cl
  62.          cmp eax, 1D0h
  63.          mov byte ptr ss:[esp+10h], dl
  64.          mov edx, 1Dh
  65.          jge short @L00000003
  66.  
  67. @L00000002:
  68.          mov ebx, edx
  69.          mov ecx, edx
  70.          shr ebx, 3h
  71.          mov ebp, 3h
  72.          and ecx, 7h
  73.          sub ebp, ebx
  74.          mov ebx, 0Fh
  75.          shl ecx, 2h
  76.          mov ebp, dword ptr ds:[edi+ebp*4h]
  77.          shl ebx, cl
  78.          and ebp, ebx
  79.          xor ebx, ebx
  80.          shr ebp, cl
  81.          mov ecx, dword ptr ss:[esp+10h]
  82.          and ecx, 0FFh
  83.          mov bl, byte ptr ds:[ecx+eax*1h+ShiftTable]
  84.          and ebp, 0FFh
  85.          xor ebp, ebx
  86.          dec edx
  87.          mov cl, byte ptr ds:[eax+ebp*1h+ShiftTable]
  88.          mov ebp, dword ptr ss:[esp+14h]
  89.          cmp edx, ebp
  90.          mov byte ptr ss:[esp+10h], cl
  91.          jg short @L00000002
  92.  
  93. @L00000003:
  94.          lea edx, ss:[ebp-1h]
  95.          test edx, edx
  96.          mov dword ptr ss:[esp+14h], edx
  97.          jl short @L00000005
  98.  
  99. @L00000004:
  100.          mov ebx, edx
  101.          mov ecx, edx
  102.          shr ebx, 3h
  103.          mov ebp, 3h
  104.          and ecx, 7h
  105.          sub ebp, ebx
  106.          mov ebx, 0Fh
  107.          shl ecx, 2h
  108.          mov ebp, dword ptr ds:[edi+ebp*4h]
  109.          shl ebx, cl
  110.          and ebp, ebx
  111.          xor ebx, ebx
  112.          shr ebp, cl
  113.          mov ecx, dword ptr ss:[esp+10h]
  114.          and ecx, 0FFh
  115.          mov bl, byte ptr ds:[ecx+eax*1h+ShiftTable]
  116.          and ebp, 0FFh
  117.          xor ebp, ebx
  118.          dec edx
  119.          mov cl, byte ptr ds:[eax+ebp*1h+ShiftTable]
  120.          mov byte ptr ss:[esp+10h], cl
  121.          jns short @L00000004
  122.          mov edx, dword ptr ss:[esp+14h]
  123.  
  124. @L00000005:
  125.          mov ecx, dword ptr ss:[esp+18h]
  126.          mov ebp, 3h
  127.          sub ebp, ecx
  128.          mov ecx, dword ptr ss:[esp+10h]
  129.          and ecx, 0FFh
  130.          mov bl, byte ptr ds:[ecx+eax*1h+ShiftTable]
  131.          mov ecx, esi
  132.          and ebx, 0Fh
  133.          shl ebx, cl
  134.          mov ecx, 0Fh
  135.          mov dword ptr ss:[esp+18h], ecx
  136.          mov ecx, esi
  137.          mov esi, dword ptr ss:[esp+18h]
  138.          shl esi, cl
  139.          mov ecx, dword ptr ds:[edi+ebp*4h]
  140.          not esi
  141.          and esi, ecx
  142.          or ebx, esi
  143.          sub eax, 10h
  144.          mov dword ptr ds:[edi+ebp*4h], ebx
  145.          mov ebp, edx
  146.          mov dword ptr ss:[esp+14h], ebp
  147.          jns @L00000001
  148.          pop edi
  149.          pop esi
  150.          pop ebp
  151.          pop ebx
  152.          add esp,0Ch
  153.          ret
  154.  
  155. Decrypt endp


вызов функции
lea ecx, offset Key
call Decrypt

Заранее спасибо за подсказку



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

Создано: 02 февраля 2020 20:36
· Личное сообщение · #2

Если это перестановочный шифр, то преобразование не взаимно однозначно, а значит, обратить невозможно. Или это не перестановочный шифр




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

Создано: 02 февраля 2020 20:48
· Личное сообщение · #3

Не знаю чем поможет, просто фан факт --> Link <--, внимание на TranslateTable[480] - в точности оно.

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


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


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

Создано: 02 февраля 2020 20:48
· Личное сообщение · #4

_MBK_
Длина ключа 16 байт всегда.
ShiftTable массив 16х30, т.е. на каждый байт используется 32 байта из массива, снизу вверх.
Каждая позиция от 0 до 15 (0-F) это пол байта, если так можно выразится.
_MBK_ пишет:
обратить невозможно

Значит только брут?




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

Создано: 02 февраля 2020 21:01
· Личное сообщение · #5

Для простоты ..

Code:
  1. Private Function Decrypt(ByVal a1 As Integer) As Long
  2.   Dim v1 As UInteger ' ebp
  3.   Dim v2 As Integer ' edi
  4.   Dim v3 As Integer ' esp
  5.   Dim result As Long ' rax
  6.   Dim v5 As SByte ' si
  7.   Dim v6 As Integer ' esp
  8.   Dim v7 As Integer ' edx
  9.   Dim v8 As Integer ' esp
  10.   Dim v9 As Integer ' ecx
  11.   Dim v10 As UInteger ' ebp
  12.   Dim v11 As Integer ' edx
  13.   Dim v12 As Integer ' esp
  14.   Dim v13 As Integer ' esp
  15.   Dim v14 As Integer ' ecx
  16.   Dim v15 As UInteger ' ebp
  17.   Dim v16 As Integer ' esp
  18.   Dim v17 As Integer ' esp
  19.   Dim v18 As Integer ' ebp
  20.   Dim v19 As Integer ' ecx
  21.   Dim v20 As Integer ' ebx
  22.   Dim v21 As Integer ' esi
  23.  
  24.   v1 = 29
  25.   v2 = a1
  26.   CType((UInteger)(v3 + 20), _DWORD) = 29
  27.   LODWORD(result) = 464
  28.   Do
  29.          v5 = 4 * (v1 And 7)
  30.          CType((UInteger)(v6 + 24), _DWORD) = v1 >> 3
  31.          CType((UInteger)(v6 + 16), _BYTE) = (CUInt(15 << (4 * (v1 And 7))) And CType(v2 + 4 * (3 - (v1 >> 3)), _DWORD)) >> (4 * (v1 And 7))
  32.          v7 = 29
  33.          If CInt(result) < 464 Then
  34.            Do
  35.                  v9 = CType((UInteger)(v8 + 16), _DWORD) And &HFF
  36.                  v10 = CByte((UInteger)(CType(byte, _DWORD)_403000 + v9 + result)) Xor ((CUInt(15 << (4 * (v7 And 7))) And CType(v2 + 4 * (3 - (CUInt(v7) >> 3)), _DWORD)) >> (4 * (v7 And 7))) And &HFF
  37.                  v7 -= 1
  38.                  LOBYTE(v9) = CType((UInteger) And byte_403000 + CType(result, _DWORD) + v10, _BYTE)
  39.                  v1 = CType((UInteger)(v8 + 20), _DWORD)
  40.                  CType((UInteger)(v8 + 16), _BYTE) = v9
  41.            Loop While v7 > CInt(v1)
  42.          End If
  43.          v11 = v1 - 1
  44.          CType((UInteger)(v12 + 20), _DWORD) = v1 - 1
  45.          If CInt(v1 - 1) >= 0 Then
  46.            Do
  47.                  v14 = CType((UInteger)(v13 + 16), _DWORD) And &HFF
  48.                  v15 = CByte((UInteger)(CType(byte, _DWORD)_403000 + v14 + result)) Xor ((CUInt(15 << (4 * (v11 And 7))) And CType(v2 + 4 * (3 - (CUInt(v11) >> 3)), _DWORD)) >> (4 * (v11 And 7))) And &HFF
  49.                  v11 -= 1
  50.                  CType((UInteger)(v13 + 16), _BYTE) = CType((UInteger) And byte_403000 + CType(result, _DWORD) + v15, _BYTE)
  51.            Loop While v11 >= 0
  52.            v11 = CType((UInteger)(v16 + 20), _DWORD)
  53.          End If
  54.          v18 = 3 - CType((UInteger)(v17 + 24), _DWORD)
  55.          v19 = CType((UInteger)(v17 + 16), _DWORD) And &HFF
  56.          v20 = (CType((UInteger)(CType(byte, _DWORD)_403000 + v19 + result), _BYTE) And &HF) << v5
  57.          CType((UInteger)(v17 + 24), _DWORD) = 15
  58.          v21 = CType((UInteger)(v2 + 4 * v18), _DWORD) And Not (CType((UInteger)(v17 + 24), _DWORD) << v5)
  59.          result = CUInt(result - 16)
  60.          CType((UInteger)(v2 + 4 * v18), _DWORD) = v21 Or v20
  61.          v1 = v11
  62.          CType((UInteger)(v17 + 20), _DWORD) = v11
  63.   Loop While CInt(result) >= 0
  64.   Return result
  65. End Function


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





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

Создано: 02 февраля 2020 21:10
· Личное сообщение · #6

f13nd пишет:
Не знаю чем поможет, просто фан факт --> Link <--, внимание на TranslateTable[480] - в точности оно.


это где-то оно, константы по коду те-же
if(i < 464) <<<< >>>> mov eax, 1D0h
for(int j = 29 <<<< >>>> mov edx, 1Dh

еще с такой же таблицей и опять декодированием CDKey
https://github.com/Novynn/Relentless/blob/master/core/client/bncskeyhandler.h
https://github.com/Novynn/Relentless/blob/master/core/client/bncskeyhandler.cpp

if (i < 464) {
for (j = 29; (unsigned int) j > var8; j--) {

-----
127.0.0.1, sweet 127.0.0.1


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


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

Создано: 02 февраля 2020 21:18
· Личное сообщение · #7

OKOB пишет:
еще с такой же таблицей и опять декодированием CDKey

Там тоже написано, что это варкрафт 3.

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





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

Создано: 02 февраля 2020 21:35 · Поправил: BlackCode
· Личное сообщение · #8

f13nd
OKOB
Огромное спасибо! Это оно)
Тему закрою)


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