Сейчас на форуме: Rio, johnniewalker, vsv1 (+6 невидимых) |
![]() |
eXeL@B —› Крэки, обсуждения —› Помощь в реверсе алго |
Посл.ответ | Сообщение |
|
Создано: 21 августа 2011 12:21 · Поправил: OnLyOnE · Личное сообщение · #1 Исследую программку на предмет кейгена (как обычно ![]() Рипанул функцию шифровки, почистил от мусора... Теперь требуется ее обратить (реверснуть) .. И вот тут я словил тупняк ![]() Прошу помощи в реверсе ее... Code:
После отработки функции строка 00000000000000000000 преобразуеться в 58406837495019454609 Так вот требуется преобразовать функцию так чтобы получить из 58406837495019454609 -> 00000000000000000000 Собственно как-то так... Заранее спасибо.. ![]() P.S. Берет меня сомнение .. а вообще она обратима? ![]() ----- aLL rIGHTS rEVERSED! ![]() |
|
Создано: 21 августа 2011 14:13 · Личное сообщение · #2 |
|
Создано: 21 августа 2011 14:43 · Личное сообщение · #3 |
|
Создано: 21 августа 2011 14:55 · Личное сообщение · #4 |
|
Создано: 21 августа 2011 14:58 · Поправил: vden · Личное сообщение · #5 на паскале этот асмовый кусок выглядит так: Code:
add: если не ошибаюсь, то алгоритм обратим не полностью. ![]() |
|
Создано: 21 августа 2011 15:36 · Личное сообщение · #6 |
|
Создано: 21 августа 2011 15:52 · Личное сообщение · #7 |
|
Создано: 21 августа 2011 18:12 · Поправил: PE_Kill · Личное сообщение · #8 vden прав, обратный результат получить нельзя, т.к. на последней итерации есть только сумма 3х символов, разложить ее можно только на 2 части, т.к. мы знаем только 1 из 3 символов, сумма оставшихся двух не дает разделить ее на 2 заведомо известные части. Т.е. это хешь, а не шифр. При этом проанализировав каждую итерацию видно что имеет место быть коллизиям, а т.к. вариантов для суммирования всего 28 и при этом есть деление на 10, что сужает количество вариантов можно реализовать алгоритм поиска коллизий, которые дадут тот же хешь. Возможно что при финальном анализе останется лишь одна коллизия, которая и будет исходной строкой. Мне даже интересно стало. ADD Коллизии возможны при длине буфера не более 20. Иначе никак. ADD2 Переписал на Delphi: Code:
----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 21 августа 2011 19:31 · Поправил: OnLyOnE · Личное сообщение · #9 |
|
Создано: 21 августа 2011 21:06 · Поправил: PE_Kill · Личное сообщение · #10 |
|
Создано: 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! ![]() |
|
Создано: 21 августа 2011 22:29 · Поправил: PE_Kill · Личное сообщение · #12 Я хз. По моему всё обратимо. Смотри: Code:
Допустим нам надо найти что было в 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 ![]() |
|
Создано: 22 августа 2011 01:01 · Личное сообщение · #13 Навскидку, для первого поста, обратное алго выглядит так. В экселе проверил, вроде работает ) # - позиция y - константа a - хэш x - неизвестное, строка которую требуется получить Code:
![]() |
|
Создано: 22 августа 2011 01:17 · Поправил: LazyCat · Личное сообщение · #14 Разрешите вставить и своих пять копеек ![]() Code:
Для Count=20 все обратимо элементарно, только надо учитывать, что CryptFunc затирает первые 3 элемента массива и, значит, они могут быть любые ! Поэтому для других Count постановка задачи некорректна ! ![]() |
|
Создано: 22 августа 2011 04:02 · Личное сообщение · #15 |
|
Создано: 22 августа 2011 08:41 · Личное сообщение · #16 MiniMax - plus v3.2.21.0 На руборде лежит кривой кряк от WELL В принципе я ее заломал, НО хотел сделать кейген ----- aLL rIGHTS rEVERSED! ![]() |
|
Создано: 22 августа 2011 14:43 · Личное сообщение · #17 Если быть полностью точным, то весь код должен выглядеть так (функции я переименовал) Code:
Все корректно работает при любых Const & Count, но, как я уже писал, 3 байта теряются. Их позицию в буфере можно узнать по переменной pos_error ![]() ![]() |
![]() |
eXeL@B —› Крэки, обсуждения —› Помощь в реверсе алго |