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

 eXeL@B —› Вопросы новичков —› Реверсинг CRC
Посл.ответ Сообщение

Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2015 08:03
· Личное сообщение · #1

Всем привет!

Столкнулся с защитой, основанной на CRC. Смысл состоит в том, что есть участок кода (Block1), который зашифрован и есть CRC этого участка.

Программа делает некоторые преобразования с введенным серийным кодом (Key1), затем происходит xor зашифрованного участка кода (Block1) с полученным результатом от серийника (Key1). После этого вычисляется CRC измененного участка кода и сверяется с CRC, который должен быть. Если CRC равны, то управление передается расшифрованному участку кода.

Вопрос: как получить последовательность байт, которая будет соответствовать данному CRC?
У меня только одна идея: использовать брутфорс.

Подскажите, пожалуйста, как расковырять данный алгоритм? Уже снится hex
Заранее спасибо!




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

Создано: 15 июля 2015 08:16
· Личное сообщение · #2

Mefist0 пишет:
Программа делает некоторые преобразования с введенным серийным кодом

там и копайте



Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2015 08:24
· Личное сообщение · #3

reversecode пишет:
там и копайте


Можно поподробнее, пожалуйста? Как это приблизит меня к оригинальным байтам, которые должны быть в Block1?
В любом случае, как я понимаю, я должен знать к какому результату должен привести XOR измененнного серийника с массивом байт.



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

Создано: 15 июля 2015 08:37
· Личное сообщение · #4

Mefist0 пишет:
происходит xor зашифрованного участка кода (Block1) с полученным результатом от серийника (Key1)

Без валидного серийника - никуда. И CRC тут не при чем, используется для проверки расшифровки.



Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2015 08:55
· Личное сообщение · #5

Vnv пишет:
Без валидного серийника - никуда. И CRC тут не при чем, используется для проверки расшифровки.


Согласен. Но как определить, что он валидный? Единственная привязка тут только к CRC расшифрованного блока. Проверки самого серийника нет.



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

Создано: 15 июля 2015 09:03 · Поправил: Vnv
· Личное сообщение · #6

Была у меня одна программка, с серийником делались преобразования и Jmp по результату. Пришлось только брутом результат находить. Здесь похожая ситуация. Если есть предыдущие версии софта, можно попробовать подсмотреть там нужный блок, если он не ксорился. Без кода сказать больше нечего.



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

Создано: 15 июля 2015 09:11
· Личное сообщение · #7

Во-первых, линк на прогу не помешал бы!
Во-вторых, какова длинна участка?




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 15 июля 2015 10:36
· Личное сообщение · #8

Если это отдельная функция то можно по прологу найти часть значения которым ксорится

-----
Лучше быть одиноким, но свободным © $me


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

Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2015 11:16
· Личное сообщение · #9

По поводу самой программы: я ее выложу позже, если сам не разберусь и не сойду с ума

Распишу немного подробнее про серийник.
В программе есть массив констант (Array1). Вводим серийник и этот массив констант каким-то образом преобразуется с серийником (для меня это пока что черный ящик). На выходе получаем новый массив констант (Array2).
Затем считаем CRC от Array2 (получаем CRC_2). Делаем
XOR dword ptr [Array2], CRC_2 - то есть первый dword в Array2 теперь изменен.
Затем в цикле делаем XOR Array_code, dword ptr [Array2] - здесь Array_code - это массив зашифрованных байт. Длина массива порядка 200 байт.
Далее считаем CRC от поксоренного Array_code (получаем CRC_code) и сравниваем его со значением в программе. Если равны, то выполняется код Array_code.

Надеюсь, понятно расписал.

Спасибо за ответы!



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

Создано: 15 июля 2015 12:26
· Личное сообщение · #10

Mefist0 пишет:
В программе есть массив констант (Array1). Вводим серийник и этот массив констант каким-то образом преобразуется с серийником (для меня это пока что черный ящик). На выходе получаем новый массив констант (Array2).

Может это какой нибудь RSA??!
Я полагаю, надо обратить внимание на две вещи:
1. Исполняемый массив кода это константа в любом случае.
2. По идее, разбор черного ящика ответит на вопрос, целесообразен брутфорс или нет




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 15 июля 2015 12:38 · Поправил: ClockMan
· Личное сообщение · #11

hello пишет:
По идее, разбор черного ящика ответит на вопрос, целесообразен брутфорс или нет

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

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2015 12:46
· Личное сообщение · #12

hello пишет:
Может это какой нибудь RSA??!


Сомневаюсь, но все возможно. По крайней мере плагин для PEiD Krypto Analyzer ничего не показывает.
Да и в целом визуально код мало похож на какой-то криптоалгоритм. Вот расчет CRC видно без анализатора невооруженным глазом.

hello пишет:
По идее, разбор черного ящика ответит на вопрос, целесообразен брутфорс или нет


Согласен. Попробую разобрать алгортим этого "черного ящика", но все равно не пойму, как это поможет определить тот код, который должен получиться в итоге.
То есть я вижу сейчас это так:
TargetArray = Array2 XOR Array_code, где по сути две неизвестные: Array2 и TargetArray. Хотя мы и получаем Array2, но какой он точно должен быть - неизвестно.




Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

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

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

-----
Array[Login..Logout] of Life





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

Создано: 15 июля 2015 13:50 · Поправил: -=AkaBOSS=-
· Личное сообщение · #14

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

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

Mefist0 пишет:
XOR dword ptr [Array2], CRC_2 - то есть первый dword в Array2 теперь изменен.

Делаю предположение что Array2 - блок из 256 двордов, тоесть 1024 байт

Mefist0 пишет:
здесь Array_code - это массив зашифрованных байт. Длина массива порядка 200 байт.

Тоесть, сообщение заметно короче ключа, а стало быть, на глаз его фиг вскроешь.
Если бы там было еще хоть 2-3 блока, зашифрованных тем же ключом, был бы вариант анализировать данные с целью вытащить ключ.

//ADD
Mefist0 пишет:
Нет. Длина Array1 = Array2 = 037h (55 dec).

хм.. странная цифра какая-то

Mefist0 пишет:
Хотелось бы просто совета в каком направлении продолжить реверсинг

Расковырять наложение серийника на ключ расшифровки. Там будет яснее.
И, возможно, стоит поискать еще такие же зашифрованные блоки кода. Шифровать один блок чисто на проверке серийника - несерьёзно.
Как происходит передача управления зашифрованному коду? call? jmp?



Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2015 14:02
· Личное сообщение · #15

Kindly пишет:
Как еще топик не закрыли, ни кода, ни проги - одно гадание.

Не стоит так набрасываться. Я предоставил пока все, что могу. Терпение!

-=AkaBOSS=- пишет:
Делаю предположение что Array2 - блок из 256 двордов, тоесть 1024 байт

Нет. Длина Array1 = Array2 = 037h (55 dec).
Длина зашифрованного участка кода 200 байт.

Понимаю, что без кода сложно что-то сказать, но я хочу сам доковырять. Хотелось бы просто совета в каком направлении продолжить реверсинг. Завис на полпути по сути. И это раздражает



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

Создано: 15 июля 2015 14:18
· Личное сообщение · #16

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

Если это чья-то приватная прога (поднасрать другу или знакомому охота), то разбирайтесь сами и смысла в создании треда нет, а если это паблик говнище, которое Вам нужно для личных целей, то невыкладывание тела недопустимо.Может алгос вообще неверно получен.

-----
TEST YOUR MIGHT





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

Создано: 15 июля 2015 14:19
· Личное сообщение · #17

скажите, а вы когда болеете, диагноз вам доктор по телефону на основании ваших пересказываний ставит?



Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2015 15:03 · Поправил: Mefist0
· Личное сообщение · #18

Парни, все будет! Терпение

reversecode пишет:
скажите, а вы когда болеете, диагноз вам доктор по телефону на основании ваших пересказываний ставит?

Все зависит от характера болезни и квалификации доктора. В целом и на приеме у врача вы пересказываете свои ощущения и симптомы.

Вопрос был задан не ради создания треда. Как я считаю, вопрос конкретен. Я думал, что кто-нибудь уже сталкивался с чем-то похожим. По-большому счету я не ошибся и многие дали грамотные советы.
Да и ветка все-таки для для новичков ( не зря же написано "Вопросы новичков"). У всех случаются проблемы и ступоры с реверсингом. Поэтому будьте терпимее, пожалуйста!




Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

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

Mefist0 пишет:
Не стоит так набрасываться. Я предоставил пока все, что могу. Терпение!

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

-----
Array[Login..Logout] of Life





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

Создано: 15 июля 2015 16:46
· Личное сообщение · #20

Mefist0 пишет:
В целом и на приеме у врача вы пересказываете свои ощущения и симптомы.

Какой прием? Удаленно звоните и рассказывайте доктору свои ощущения. Передавайте их красочно, всей полнотой итд



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 15 июля 2015 17:08
· Личное сообщение · #21

Mefist0
Давайте линк для скачивания или закрывайте топик. Вы можете говорить одно, а на деле там окажется абсолютно другое.



Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2015 17:42
· Личное сообщение · #22

Это обычный крекми. Не сотрясайте воздух зря, воены
Пока что не могу скинуть файл, потому что все лежит на другом компе.

Тему не закрывать, оффтоп не разводить!



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

Создано: 15 июля 2015 21:09 · Поправил: dosprog
· Личное сообщение · #23

Mefist0 пишет:
Тему не закрывать, оффтоп не разводить!


Хорошо,
отложили все дела и с нетерпеньем ждём.



--Добавлено--
К следующему посту:

DenCoder пишет:
Полностью согласен с Боровом!

4-5 байтов отсилы, и то если стандартная RTL использовалась.
То же и с эпилогом.
Из 55 байтов даже 10 угаданных - это ерунда.






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

Создано: 15 июля 2015 22:21
· Личное сообщение · #24

BoRoV пишет:
Если это отдельная функция то можно по прологу найти часть значения которым ксорится

Полностью согласен с Боровом!

Пробуйте различные прологи/продолжения, ксором получите возможные преобразованные части ключей. Если длина ключа 55 байт, то через 55 же байт если не будет смысла в коде - не тот пролог/продолжение. Конец кода можно поподбирвать, очень возможно он должен заканчиваться на retn/retn n, а может push и jmp. Шифрованный блок 200 байт? Ключ 55 байт? Это даст 200 % 55 = 35 <- ещё по одному смещению байт 5-10 ключа можно подобрать... Дальше реверсите преобразования с введенным серийным кодом, получите серийник.

-----
IZ.RU


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

Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 16 июля 2015 07:30
· Личное сообщение · #25

-=AkaBOSS=- пишет:
Как происходит передача управления зашифрованному коду? call? jmp?

Передача управления происходит с помощью call

DenCoder и BoRoV, спасибо за подсказку. Попробую этот вариант.


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


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