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

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


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

Создано: 21 августа 2011 12:21 · Поправил: OnLyOnE
· Личное сообщение · #1

Исследую программку на предмет кейгена (как обычно )
Рипанул функцию шифровки, почистил от мусора...
Теперь требуется ее обратить (реверснуть) ..
И вот тут я словил тупняк . Функция вроде не велика но мозг отказывается работать...
Прошу помощи в реверсе ее...

Code:
  1. CryptFunc           proto :dword,:dword,:dword
  2.  
  3.  
  4. invoke   CryptFunc,chr$("00000000000000000000"),0,20 ; Это вызов функции
  5.                                                                                               ; На входе строка длиной 20 символов
  6.                                                                                               ; Константа равная 0
  7.                                                                                               ; Количество циклов
  8.  
  9. CryptFunc         proc    String,Const,Count
  10.  
  11.                  mov edi,20
  12.                  mov esi,Count
  13.                  @@:
  14.                  mov eax,Const
  15.                  add eax,3
  16.                  cdq
  17.                  idiv edi
  18.                  mov eax,String
  19.                  movzx eax,byte ptr[eax+edx]
  20.                  add al,0D0h
  21.                  push eax
  22.                  mov eax,Const
  23.                  add eax,5
  24.                  cdq
  25.                  idiv edi
  26.                  mov eax,String
  27.                  movzx eax,byte ptr[eax+edx]
  28.                  add al,0D0h
  29.                  pop edx
  30.                  add edx,eax
  31.                  push edx
  32.                  mov eax,chr$("94067295840683749501")
  33.                  push eax
  34.                  mov eax,Const
  35.                  add eax,7
  36.                  cdq
  37.                  idiv edi
  38.                  pop eax
  39.                  movzx eax,byte ptr[eax+edx]
  40.                  add al,0D0h
  41.                  mov edx,eax
  42.                  pop eax
  43.                  add eax,edx
  44.                  mov ecx,10
  45.                  cdq
  46.                  idiv ecx
  47.                  mov eax,edx
  48.                  add al,30h
  49.                  push eax
  50.                  mov eax,String
  51.                  push eax
  52.                  mov eax,Const
  53.                  cdq
  54.                  idiv edi
  55.                  pop eax
  56.                  pop ecx
  57.                  mov byte ptr[eax+edx],cl
  58.                  inc Const
  59.                  dec esi
  60.                  jne @B
  61.                  ret
  62.  
  63. CryptFunc         endp


После отработки функции строка 00000000000000000000 преобразуеться в 58406837495019454609
Так вот требуется преобразовать функцию так чтобы получить из 58406837495019454609 -> 00000000000000000000
Собственно как-то так...
Заранее спасибо..

P.S. Берет меня сомнение .. а вообще она обратима?

-----
aLL rIGHTS rEVERSED!





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 21 августа 2011 14:13
· Личное сообщение · #2

Вполне реально. Чуть позже реверсну, щас убегаю.

-----
Yann Tiersen best and do not fuck




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

Создано: 21 августа 2011 14:43
· Личное сообщение · #3

либо я с асмом не дружу но
jne @B
не прыгнет на @@:

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





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

Создано: 21 августа 2011 14:55
· Личное сообщение · #4

VodoleY пишет:
либо я с асмом не дружу но
jne @B
не прыгнет на @@:


Насмешил...

-----
aLL rIGHTS rEVERSED!




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 21 августа 2011 14:58 · Поправил: vden
· Личное сообщение · #5

на паскале этот асмовый кусок выглядит так:
Code:
  1. procedure CryptFunc(_String: PByte; _Const: DWORD; _Count: DWORD);
  2. const
  3.   KEY: array [0 .. 19] of byte = (9, 4, 0, 6, 7, 2, 9, 5, 8, 4, 0, 6, 8, 3, 7, 4, 9, 5, 0, 1);
  4. var
  5.   i: integer;
  6. begin
  7.   for i := 0 to _Count - 1 do
  8.     _String[(_Const + i) mod 20] :=
  9.       (
  10.       _String[(_Const + i + 3) mod 20] - 48 +
  11.       _String[(_Const + i + 5) mod 20] - 48 +
  12.       KEY[(_Const + i + 7) mod 20]
  13.       )
  14.       mod 10 + 48;
  15. end;


add: если не ошибаюсь, то алгоритм обратим не полностью.



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

Создано: 21 августа 2011 15:36
· Личное сообщение · #6

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



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

Создано: 21 августа 2011 15:52
· Личное сообщение · #7

Skino нафик тут хексрей. тут мозг надо а vden наглючил

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





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 21 августа 2011 18:12 · Поправил: PE_Kill
· Личное сообщение · #8

vden прав, обратный результат получить нельзя, т.к. на последней итерации есть только сумма 3х символов, разложить ее можно только на 2 части, т.к. мы знаем только 1 из 3 символов, сумма оставшихся двух не дает разделить ее на 2 заведомо известные части. Т.е. это хешь, а не шифр. При этом проанализировав каждую итерацию видно что имеет место быть коллизиям, а т.к. вариантов для суммирования всего 28 и при этом есть деление на 10, что сужает количество вариантов можно реализовать алгоритм поиска коллизий, которые дадут тот же хешь. Возможно что при финальном анализе останется лишь одна коллизия, которая и будет исходной строкой. Мне даже интересно стало.

ADD Коллизии возможны при длине буфера не более 20. Иначе никак.

ADD2 Переписал на Delphi:
Code:
  1. procedure GetHash(pBuff: PAnsiChar; CharStart, CharEnd: DWord);
  2. const
  3.   szAlf: array [0..19] of AnsiChar = (
  4.     '9','4','0','6','7','2','9','5','8','4',
  5.     '0','6','8','3','7','4','9','5','0','1'
  6.   );
  7. var
  8.   i : Integer;
  9.   CharSumm : DWord;
  10. begin
  11.   for i := CharStart to CharEnd - 1 do
  12.   begin
  13.     CharSumm := Ord(pBuff[((+ 3) mod 20)]) - Ord('0') +
  14.                 Ord(pBuff[((+ 5) mod 20)]) - Ord('0') +
  15.                 Ord(szAlf[((+ 7) mod 20)]) - Ord('0');
  16.     pBuff[i] := AnsiChar((CharSumm mod 10) + Ord('0'));
  17.   end;
  18. end;


-----
Yann Tiersen best and do not fuck


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


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

Создано: 21 августа 2011 19:31 · Поправил: OnLyOnE
· Личное сообщение · #9

В общем я тут тоже копал и пришел к аналогичному выводу, что это вариант хеширования...
В таком случае, как же генерится реальный ключ?
И как выйти на коллизии в моем случае?

-----
aLL rIGHTS rEVERSED!





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 21 августа 2011 21:06 · Поправил: PE_Kill
· Личное сообщение · #10

Походу я тут был бред. Надо подумать...

-----
Yann Tiersen best and do not fuck





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

Создано: 21 августа 2011 21:18 · Поправил: OnLyOnE
· Личное сообщение · #11

В моем случае число раундов разное в зависимости от конкретного вызова данной функции.. т.е.

Const1 equ 00000000h
Count1 equ 00012DC5h ; ( Вариант 1)

Const2 equ 00012DC5h
Count2 equ 0001957Fh ; ( Вариант 2)

Const3 equ 00014D69h
Count3 equ 0000E1EBh ;( Вариант 3)

Const4 equ 00022F54h
Count4 equ 000093F0h ;( Вариант 4)

Первоначально я дал упрощенный вариант Const и Count, а это уже конкретные данные.

В общем как я понял строка 94067295840683749501 типа ключа для шифрования... может просто забрутить ключ для расшифровки?

-----
aLL rIGHTS rEVERSED!





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 21 августа 2011 22:29 · Поправил: PE_Kill
· Личное сообщение · #12

Я хз. По моему всё обратимо. Смотри:
Code:
  1. Round0 - C1: 3, C2: 5, Hash:        50000000000000000000
  2. Round1 - C1: 4, C2: 6, Hash:        58000000000000000000
  3. Round2 - C1: 5, C2: 7, Hash:        58400000000000000000
  4. Round3 - C1: 6, C2: 8, Hash:        58400000000000000000
  5. Round4 - C1: 7, C2: 9, Hash:        58406000000000000000
  6. Round5 - C1: 8, C2: 10, Hash:       58406800000000000000
  7. Round6 - C1: 9, C2: 11, Hash:       58406830000000000000
  8. Round7 - C1: 10, C2: 12, Hash:      58406837000000000000
  9. Round8 - C1: 11, C2: 13, Hash:      58406837400000000000
  10. Round9 - C1: 12, C2: 14, Hash:      58406837490000000000
  11. Round10 - C1: 13, C2: 15, Hash: 58406837495000000000
  12. Round11 - C1: 14, C2: 16, Hash: 58406837495000000000
  13. Round12 - C1: 15, C2: 17, Hash: 58406837495010000000
  14. Round13 - C1: 16, C2: 18, Hash: 58406837495019000000
  15. Round14 - C1: 17, C2: 19, Hash: 58406837495019400000
  16. Round15 - C1: 18, C2: 0, Hash:      58406837495019450000
  17. Round16 - C1: 19, C2: 1, Hash:      58406837495019454000
  18. Round17 - C1: 0, C2: 2, Hash:       58406837495019454600
  19. Round18 - C1: 1, C2: 3, Hash:       58406837495019454600
  20. Round19 - C1: 2, C2: 4, Hash:       58406837495019454609

Допустим нам надо найти что было в C19 на раунде 19. C19 использовалось последний раз в раунде 16, причем юзались C19 и C2. C2 на тот момент была уже посчитана, неизвестна только C19, при этом известна C16. Отсюда:

C16 = ((C19 - 0x30) + (C2 - 0x30) + (Alf[3] - 0x30) mod 10) + 0x30

C16 = '4' - '0' = 4;
C2 = '8' - '0' = 8;
Alf[3] = '6' - '0' = 6;

Отсюда
4 = ((C19 - 0x30) + 8 + 6) mod 10
Упростим
4 = ((C19 - 0x30) + 14) mod 10

Теперь минибрут:
for C19:= 0 to 9 do
if (C19 + 14) mod 10 = 4 then Show('Aleluya! C19 = '+AnsiChar(C19 + Ord('0')))

Итого C19 = '0';

-----
Yann Tiersen best and do not fuck




Ранг: 38.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 22 августа 2011 01:01
· Личное сообщение · #13

Навскидку, для первого поста, обратное алго выглядит так. В экселе проверил, вроде работает )
# - позиция
y - константа
a - хэш
x - неизвестное, строка которую требуется получить

Code:
  1. #        y      a    x                    
  2.                                           
  3. 0        9      5         x3+x5+y7=a0               
  4. 1        4      8         x4+x6+y8=a1               
  5. 2        0      4         x5+x7+y9=a2               
  6. 3        6      0         x6+x8+y10=a3             
  7. 4        7      6         x7+x9+y11=a4             
  8. 5        2      8         x8+x10+y12=a5           
  9. 6        9      3         x9+x11+y13=a6           
  10. 7        5      7         x10+x12+y14=a7         
  11. 8        8      4         x11+x13+y15=a8         
  12. 9        4      9         x12+x14+y16=a9         
  13. 10       0     5      x13+x15+y17=a10     
  14. 11       6     0      x14+x16+y18=a11     
  15. 12       8     1      x15+x17+y19=a12     
  16. 13       3     9      x16+x18+y0=a13       
  17. 14       7     4      x17+x19+y1=a14       
  18. 15       4     5      x18+a0+y2=a15     
  19. 16       9     4      x19+a1+y3=a16         
  20. 17       5     6              a0+a2+y4=a17         
  21. 18       0     0              a1+a3+y5=a18         
  22. 19       1     9              a2+a4+y6=a19         
  23.  
  24. причем выражение должно удовлетворять требованиям
  25. например, для нахождения х19
  26.  x19=a16-a1-a3    if a1+a3>9 then a16:=a16+10




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

Создано: 22 августа 2011 01:17 · Поправил: LazyCat
· Личное сообщение · #14

Разрешите вставить и своих пять копеек

Code:
  1. char Key[20] = {9,4,0,6,7,2,9,5,8,4,0,6,8,3,7,4,9,5,0,1};
  2.  
  3. CryptFunc(char *String, int Const, int Count) {
  4.   for(= 0; i < Count; i++)
  5.     String[(i+Const)%20] = (String[(i+Const+3)%20] + String[(i+Const+5)%20] + Key[(i+Const+7)%20] - 0x60)%10 + '0';
  6. }
  7.  
  8. DecryptFunc(char *String, int Const, int Count) {
  9.   for(= 0; i < 17; i++)
  10.     String[19-i] = (String[16-i] - String[(21-i)%20] - Key[(23-i)%20] + 20)%10 + '0';
  11. }

Для Count=20 все обратимо элементарно, только надо учитывать, что CryptFunc затирает первые 3 элемента массива и, значит, они могут быть любые ! Поэтому для других Count постановка задачи некорректна !




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 22 августа 2011 04:02
· Личное сообщение · #15

OnLyOnE что за софт?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





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

Создано: 22 августа 2011 08:41
· Личное сообщение · #16

MiniMax - plus v3.2.21.0
На руборде лежит кривой кряк от WELL
В принципе я ее заломал, НО хотел сделать кейген
--> Link <--

-----
aLL rIGHTS rEVERSED!




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

Создано: 22 августа 2011 14:43
· Личное сообщение · #17

Если быть полностью точным, то весь код должен выглядеть так (функции я переименовал)
Code:
  1. char Key[] = {9,4,0,6,7,2,9,5,8,4,0,6,8,3,7,4,9,5,0,1};
  2.  
  3. void CryptFunc(char *String, int Const, int Count) {
  4.     for(int i = 0; i < Count; i++)
  5.          String[(Const+Count+19-i)%20] = (String[(Const+Count+16-i)%20] - String[(Const+Count+1-i)%20] - Key[(Const+Count+3-i)%20] + 20)%10 + '0';
  6. }
  7.  
  8. void DecryptFunc(char *String, int Const, int Count) {
  9.     for(int i = 0; i < Count; i++)
  10.          String[(Const+i)%20] = (String[(Const+3+i)%20] + String[(Const+5+i)%20] + Key[(Const+7+i)%20] - 0x60)%10 + '0';
  11. }
  12.  
  13. void main() {
  14.     int Const = 0;
  15.     int Count = 20;
  16.     int pos_error = (Const+Count+17)%20;
  17.     CryptFunc(Buffer, Const, Count);
  18.     DecryptFunc(Buffer, Const, Count);
  19. }

Все корректно работает при любых Const & Count, но, как я уже писал, 3 байта теряются. Их позицию в буфере можно узнать по переменной pos_error


 eXeL@B —› Крэки, обсуждения —› Помощь в реверсе алго
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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