• Уменьшение отступа

    Обратная связь

    (info@ru-sfera.pw)

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

Как статья ?

  • Классно

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

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

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

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

    Голосов: 1 5.0%

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

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 175
Всем привет !

Что-то стало как-то уныло вообще, особенно на работе, поэтому для поднятия настроения решил продолжить наконец-то свои занятия по крякингу, вообще занимаюсь по мануалу «Введение в крякинг с нуля» [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

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


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


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

Вложения

  • upload_2015-2-12_18-13-57.png
    upload_2015-2-12_18-13-57.png
    342.7 КБ · Просмотры: 29
  • upload_2015-2-12_18-14-31.png
    upload_2015-2-12_18-14-31.png
    255 КБ · Просмотры: 26
Последнее редактирование:

Антоха

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

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 175
Вот ещё:

Сейчас качаю, ибо читать хорошо, а смотреть лучше...Отдыхай!!!
 

X-Shar

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

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 не станет нулём ! :)
 

Вложения

  • upload_2015-2-13_14-38-48.png
    upload_2015-2-13_14-38-48.png
    94.5 КБ · Просмотры: 23
  • upload_2015-2-13_14-40-12.png
    upload_2015-2-13_14-40-12.png
    86.1 КБ · Просмотры: 21
Последнее редактирование:

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 175
Забыл ещё добавить во вложение крякми, которое описано !

Сам олле можно скачать с офф. сайта:
 

Вложения

  • Splish.rar
    30.5 КБ · Просмотры: 24

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 175
Всем привет !

В главе 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
 
Последнее редактирование:

ason

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

X-Shar

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

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

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