• Привет !

    На форуме есть зеркало в ТОРе:rusfwz3cukdej7do.onion

    Обратная связь:info@ru-sfera.org

    Всего доброго !

Крякинг: Записки дилетанта (1 Viewer)

Кто просматривает этот контент: "Тема" (Всего пользователей: 0; Гостей: 1)

Как статья ?

  • Классно

    Голосов: 18 90.0%
  • Мог-бы и по лучше написать

    Голосов: 0 0.0%
  • Что-то слабовато

    Голосов: 0 0.0%
  • А зачем это ?

    Голосов: 1 5.0%
  • Ндя..., лучше-бы выкладовал ключи

    Голосов: 1 5.0%

  • Всего проголосовало
    20

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 376
Репутация
7 873
Telegram
Всем привет !

Что-то стало как-то уныло вообще, особенно на работе, поэтому для поднятия настроения решил продолжить наконец-то свои занятия по крякингу, вообще занимаюсь по мануалу «Введение в крякинг с нуля» [C] Рикардо Нарваха, пер. Aquila !

Вся проблема правда, что прочитав глав наверное десять что-то забросил месяца на два, но сейчас решил возобновить занятия…

Вот решил создать тему, что-бы было интересней заниматься, заодно и буду рассказывать о своих успехах на этом поприще (Если они будут эти успехи, Dmeh-Smeh-Smeh!!!) !

В частности в этой теме расскажу о «Поломанном» своём первом крякми, незнаю правда кому это интересно, но может будут какие-то советы или другие рассказы про крякми, если будет востребовано потом можно даже отдельный раздел создать ! ;)

Итак автор цикла статей использует дебаггер Oledbg, в описании вроде-даже написано что имеет интуитивно понятный интерфейс, но незнаю на сколько он понятный, я если честно вспотел там разбираться что да как, хотя в мануале всё подробно даже разжёвано, но у меня проблемы с памятью и в этоге всё забыл, так-же нехрена не помню эти команды ассемблера, поэтому основные простенькие выписал, кстати во вложение можно всё скачать, сам мануал + всё необходимое…

Итак в главе 13-ть, наконец-то дошёл до крякми, хоть и простецкий, автор вроде всё и разжовывал но последнее крякми, что-то нестал, типо задание нужно вытащить пароль из программы самому, кстати ничего сложного вообще не оказалось:

upload_2015-2-12_18-13-32.png


Рассказываю что я делал, даже этот простецкий крякми можно ломануть кучей способами, я расскажу два способа, третий прочитаете в мануале + наверняка ещё пару найдёте сами, WinkSmile !

Итак самый первый и простецкий способ даже не запуская программу, открываем его в оледбг и пугаемся, ogo-go:

upload_2015-2-12_18-14-56.png


В общем-то Олле очень умный дизассемблер, т.е. всё видно регистры, дамп-памяти, но самое-главное видно код ассемблера, видны переменные и параметры (правое окошко после кода).

А этого нам и хватит для анализа, по крайне-мере такого простенького крякми (В этом способе будем анализировать код + переменные без запуска программы вообще) ! sm582398247

Итак смотрим код, да-блин какое-то непонятное бла-бла-бла везде там, гы-гы-гы, но потом всё-же видим код двух окошек, т.е. то окошко которое выводится при правильном вводе пароля и то окошко которое выведется при неправильном:

upload_2015-2-12_18-14-43.png


Смотрим самую правую часть окна на скриншёте, олле всё нам рассказал и сдал крякми с потрахами, видим два окошка (их код я пометил двумя стрелочками на скриншёте), ога значит где-то должно-быть сравнение иначе как программа куда-то там зайдёт и тут олле опять нам всё рассказал, маленький триугольник как-раз показывает переходы (Это там, где ассемблерный код уже, на скриншёте выделен серым и так-же есть стрелочка которую я нарисовал для наглядности)…

А где-ж пароль-таки спросите все, тут открываем толстенную книгу ассемблера, желательно по толще, что-бы можно-было двинуть кому-нить по башке, и смотрим что-же за команда JNZ, да-блин я опять забыл:

JNZ переход совершается, если флаг Z неактивен, то есть если результат операции отличен от нуля.

Какой нахер флаг, мы-же прогу не запустили, далее поднимемся выше на строчку, какой-то OR– Это логическое «или», ТОЖЕ НАМ МАЛО ПОМОЖЕТ…

Поднимаемся ещё выше на строчку и видем интересный API:

CALL <JMP.%KERNEL32%.lstrcmspA> я эту команду отметил стрелочкой на скриншоте…

lstrcmspA – Это АПИ сравнивает строки, ога значит должно-быть две переменные, и если пароль забит в программе строкой и никак не генерируется, можно просмотреть его в олле, даже не запуская программу, ога пароль виден на скриншёте, чуть правее кода:

Олле мегаумная программа, сама всё показала и крякнула, вот список переменных которые использует lstrcmspA:

String2 = “cannabis” – Это и есть наш пароль;

String1=”” – То что мы введём, пусто но в следующем способе мы рассмотрим как это работает более детально…

КОРОЧЕ ТРЯСУЩИМЕСЯ РУКАМИ, ВВОДИМ «c-a-n-n-a-b-i-s», я аж чуть со стула не упал от радости:

upload_2015-2-12_18-15-10.png


Способ 2:

А теперь все наверное скажут (кто дочитал до этого места конечно):

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

Что-бы не разводить писанину, ибо устал, давайте поставим точку останова, на вызове API lstrcmspA:
CALL <JMP.%KERNEL32%.lstrcmspA>

upload_2015-2-12_18-15-21.png


Запустим крякми в олле, далее введём любые символы и нажмём на Check, всё прога должна зависнуть, далее смотрим стек и что-же мы видим:

upload_2015-2-12_18-15-37.png


String1 = "xcvvzxcvzsdv" – То что мы ввели;

String2 = "cannabis" – Наш пароль ! ;)

А вообще если вместо нашей APIсделать прыжок на адрес 00401251, например прям в олле заменить код на: JMP crackme. 00401251

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


В общем-то и всё, уж незнаю когда я доберусь до следующего более сложного крякми и доберусь-ли вообще, но вопрос нужно-ли продолжать дальше писать !


В данном случае оказалось писать гораздо сложнее, чем ломать сам крякми, надеюсь хоть прочитаете и интересно мнение как ?
 

Вложения

Последнее редактирование:

Антоха

Уважаемый пользователь
Форумчанин
Регистрация
26.12.2012
Сообщения
2 780
Репутация
4 774
надеюсь хоть прочитаете и интересно мнение как ?
Тоже начинал читать Нарваху.Согласен,что расписано всё от и до.И в этом "от и до" очень большой объём информации.Чтобы всё это удержалось в памяти и осмыслилось,нужно штудировть этот мануал каждый день.А так недельку если пропустил,то можно всё сначала начинать)В итоге у меня так и получилось....
Олег за статью-респект!Просто и ясно описаны все моменты.
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 376
Репутация
7 873
Telegram

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 376
Репутация
7 873
Telegram
Решил ещё один крякми, в этом крякми две части, это жёстко забитый серийник и динамически генерирующийся, я пока парюсь с жёстко забитыми, т.к. кейгены пока писать не умею, но если до этого дойду, то напишу в следующий статьях:

upload_2015-2-13_14-37-35.png


Решаем первое задание «HardCoded», тут немножко по сложнее, т.к. серийник сравнивается побайтно, т.е. если в прошлом крякми это делала специальная апи, то здесь автор сам написал такую программу, которая сравнивает всё побайтно в цикле…

Вообще рекомендую скачать версию олле 2.01 эта последняя версия, но там интерфейс малость поменялся, зато не будет ключить на x64, итак что-бы не разводить писанину, сразу приступим к решению:

upload_2015-2-13_14-37-58.png


Находим АПИ GetWindowTextA и ставим там точку останова, именно в этой апи идёт считывание что мы введём и как следствие что идёт после этой функи будет уже обработка, проверка на правильность и т.д.

К сожаленю что-бы поставить точку останова на процедуре, в 2.01 поменялось немногу, нужно выделить нужную АПИ далее правой кнопкой и Find refences

upload_2015-2-13_14-38-17.png


Далее там уже правой кнопкой и можно поставить точку останова:

upload_2015-2-13_14-38-33.png


Кстати видно что функа фызывается аж три раза, причём два раза с MaxCount =32 и один MaxCount=11, кстати 11 – это и есть длинна нашего пароля… :)

В общем запускаем крякми в олле, вводим всякую дребедень, нажимаем “CheckHardxoded”, всё программа зависла по точке останова, прям на нужном нам месте, гы-гы:

upload_2015-2-13_14-45-47.png


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

Нажимаем F7, НО после этого незабудим:

upload_2015-2-13_14-39-2.png


Далее опять F7.

Иначе олле нетуда залезет, а конкретно залезет в саму функу, нам это не нужно…

Короче нажимаем F7 и топаем по коду:

upload_2015-2-13_14-39-18.png


Что-бы не делать куча скринов выделю код, который нас интересует:

Код:
                              Comments
CALL <JMP.&USER32.GetWindowTextA>  ; \USER32.GetWindowTextA
LEA EAX,[401353]      ; ASCII "HardCoded"
LEA EBX,[403215]      ; ASCII "aS"

CMP BYTE PTR DS:[EAX],0
JE SHORT 0040138C
MOV CL,BYTE PTR DS:[EAX]
MOV DL,BYTE PTR DS:[EBX]
CMP CL,DL
JNE SHORT 004013D2
INC EAX
INC EBX
JMP SHORT 0040137B
Это по сути цикл, в начале в регистры заносится EAX и EBX, то-что у нас в памяти по адресам [401353] – это на кстати пароль, гы-гы, и [403215] – это то-что мы ввели, но это я думаю понятно, что происходит далее…

CMP BYTE PTR DS:[EAX],0 сравниваем, если регистр EAX=0, если да то JE SHORT 0040138C, переход на адрес 0040138C там и будет наша окошко, которое скажет что мы молодцы, гы-гы…

Если-же EAX не ноль то перехода не будет, а в специальные регистры CL и DL, заносится содержимое регистров EAX и EBX, причём если из описания, то регистр DL– это регистр данных, а CL-это счётчик, но вот заносится будут байты, а не всё значение целиком, это и есть побайтная проверка, в Олле это кстати видно хорошо (Смотреть в самом низу):

upload_2015-2-13_14-47-26.png


Используется цикл Loopи обращения к индексам, как-то так:

CMP CL,DL

JNE SHORT 004013D2

Если байты CL и DL не равны, то JNE SHORT 004013D2 то переходим по адресу 004013D2, там нас обругают что-мы валенки и несмогли решить крякми…

Далее если равно, то уменьшаем регистры EAX и EBX: INC EAX, INC EBX и переходим в начало цикла JMP SHORT 0040137B и так делаем пока EAX не станет нулём ! :)
 

Вложения

Последнее редактирование:

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 376
Репутация
7 873
Telegram
Забыл ещё добавить во вложение крякми, которое описано !

Сам олле можно скачать с офф. сайта:http://www.ollydbg.de/odbg201.zip
 

Вложения

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 376
Репутация
7 873
Telegram
Всем привет !

В главе 18-ть Рикардо задал упражнение CrueHead’а 2, этот крякми отличается тем-что пароль зашифрован методом XOR, причём сравниваются зашифрованные строки, цель вытащить пароль из программы…

Да-блин а в следующей главе решения нет, а-я так надеялся на его помощь :(

Придётся делать самому:

upload_2015-2-19_18-21-53.png



Итак открываем крякми в Олле и запускаем его, далее делаем точку останова на API: GetDlgItemTextA :

upload_2015-2-19_18-22-7.png



Далее вводим любой пароль:

upload_2015-2-19_18-22-23.png



Нажимаем ОК, всё прога зависла по прерыванию…

Теперь смотрим, что в стеке:

upload_2015-2-19_18-29-31.png



Посмотрим что в буфере, там должен-быть наш введённый пароль после выхода из API:

Смотрим дамп:

upload_2015-2-19_18-22-56.png



Как только выйдем из API так и есть в буфере наш пароль (Три байта): 31 32 33

upload_2015-2-19_18-23-10.png



Теперь поставим прерывание на обращение программы к этому месту и уже будем дальше смотреть что делается:

upload_2015-2-19_18-23-24.png



Сделали прерывание, далее нажимаем Run, далее будет пара остановок на каких-то АПИ винды, нам это ненужно поэтому нажимаем Run пока программа незайдёт в наш крякми:

upload_2015-2-19_18-23-38.png



Воо, и что-же тут происходит ?

Давайте разбираться… ;)

Да-ну что-то лень гы-гы, в конце цикла видим команду POP ESI, это помещение нашего введённого пароля (123) из стека в регистр ESI, а потом идёт переход на какую-то процедуру через CALL:


Кстати обратите внимание, на адрес который помещён в регистр ESI:

upload_2015-2-19_18-23-59.png



Это адрес памяти, где находится наш введённый пароль, рекомендую записать где-нить, ибо пригодится:0040217E


Далее переходим в наш CALL:

Код:
XOR EBX,EBX
XOR EDI,EDI
MOV CL,BYTE PTR DS:[EDI+4021A3]
MOV BL,BYTE PTR DS:[ESI]
TEST BL,BL
JE SHORT CRACKME2.004013B1
XOR BL,CL
MOV BYTE PTR DS:[ESI],BL
INC ESIINC EDI
JMP SHORT CRACKME2.0040139D

В этой процедуре будет шифроваться наш введённый пароль, интересно два куска кода:

MOV CL,BYTE PTR DS:[EDI+4021A3]

MOV BL,BYTEPTRDS:[ESI] – Это помещаем первый байт нашего введённого пароля в BL

XOR BL,CL – Шифруем BL с ключом CL.


Особенно, хотел-бы знать что-же такое помещается командой: MOVCL,BYTEPTRDS:[EDI+4021A3]

А почему-бы не глянуть в дампе памяти !?

Правой кнопкой на команде, «Follow In Dump»->”Memory adress”, видим 16-ть байт:

upload_2015-2-19_18-25-17.png




«Messing_in_bytes» , хм интересно, если будем анализировать код, то по логике мы берём первый байт введённого нами кода и командой ксорим с первым байтом этой штуки (XOR BL,CL).

Причём сделано хитро, байты ксорятся каждый с каждым, т.е.

“1” ксорится с «М»

«2» с «е» и т.д.

Поэтому логично предположить, что наш пароль будет 16-ть байт это во первых, а во вторых «Messing_in_bytes» это наш ключ и если мы найдём зашифрованный пароль в программе, то сможем его расшифровать, т.к. XOR это обратимая функция, осталось найти зашифрованный пароль.


Ну ладно идём дальше, а дальше после шифрования нашего введённого пароля и после выхода из процедуры шифрования, наш шифрованный пароль помещается в стек, командой PUSH CRACKME2.0040217E, кстати наш пароль пошифровалсятам-же и находился по адресу 0040217E, это видно в дампе:

upload_2015-2-19_18-25-37.png



Т.е. байты 7С 57 40.

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

XOR EDI,EDI

XOR ECX,ECX

MOV CL,BYTE PTR DS:[402118]

MOV ESI,DWORD PTR SS:[ESP+4]

MOV EDI,CRACKME2.00402150

REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]

RETN

REPECMPSBYTEPTRES:[EDI],BYTEPTRDS:[ESI] – Вот-эта штука сравнивает строки, что у нас в регистрах EDI и ESI, а что у нас в регистрах, до выполнения этой штуки ?

upload_2015-2-19_18-25-52.png



То-что в адресе 0040217E это пошифрованный пароль который мы ввели, это понятно…

А что-же в адресе 00402150, кто догадается, тому пирожок с капустой…

Смотрим дамп по этому адресу…

upload_2015-2-19_18-26-6.png



СПОРИМ ЧТО ЭТО ЗАШИФРОВАННЫЙ ПАРОЛЬ, ШЕСТНАДЦАТЬ БАЙТ:

1F 2C 37 36 3B 3D 28 19 3D 26 1A 31 2D 3B 37 3E

КЛЮЧ У НАС ТАКОЙ

4D 65 73 73 69 6E 67 5F 69 6E 5F 62 79 74 65 73 (Messing_in_bytes)

ДЕЛАЕМ XOR КАЖДЫЙ С КАЖДЫМ И ПОЛУЧИМ:

52 49 44 45 52 53 4F 46 54 48 45 53 54 4F 52 4D

Каждому байту соответствует свой символ в таблице ASCII, осталось преобразовать и получим наш пароль ! ;)

upload_2015-2-19_18-26-19.png



Пароль: RIDERSOFTHESTORM

Можно расслабится и попить кофейку, ещё одна победа ! :)

upload_2015-2-19_18-26-33.png
 
Последнее редактирование:

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 376
Репутация
7 873
Telegram
Сам крякми, если кому нужно...
 

Вложения

ason

Уважаемый пользователь
Форумчанин
Регистрация
21.01.2015
Сообщения
171
Репутация
115
Подскажите где можно скачать этот плагин или чем его можно заменить.
Это из цикла статей Введение в крякинг используя Olli, 1 глава.
upload_2015-2-19_16-59-53.png
 
Последнее редактирование:

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 376
Репутация
7 873
Telegram
Подскажите где можно скачать этот плагин или чем его можно заменить.
Это из цикла статей Введение в крякинг используя Olli, 1 глава.
Это плагин CommandBar для старой версии OleDBG 1.10, для новой можно альтернативу CommandLine...

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

Что-бы установить плагины, достаточно просто поместить длл-ки в папку с программой и перезапустить олле...WinkSmile
 
Последнее редактирование: