Введение в крэкинг с нуля, используя OllyDbg - Глава 15

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!


Прежде, чем перейти к последнему из крэкми с жёстко-заданными серийными номерами, рассмотрим тот, который я оставил вам в прошлый раз для самостоятельной работы. Он назывался SPLISH.

Откроем его в OllyDbg.

6e19c855c7262af4cf9a91ef30186135.png

Он открывается на точке входа (ENTRY POINT).

Смотрим используемые API-функции (правая кнопка мыши - SEARCH FOR-NAME (LABEL) IN CURRENT MODULE).

50bf1979f14c00ff5b2defa59fd03362.png

Видим список используемых API-функций.

049bf9b99c461a28b4701ac443b15751.png

Видим, что используется GetWindowTextA при вводе серийного номера и MessageBoxA для отображения сообщения, правилен ли он или нет. Можем установить BPX на обе функции, но сначала ещё глянем, что покажет список строк, используемых программой.

3bdf864d34eef3f0f68ee7308803f9f1.png

Кликаем правой кнопкой мыши на листинге и выбираем SEARCH FOR-ALL REFERENCED TEXT STRING.

b7db6dbac8e4012603184e99132f5a73.png

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

Попадаем в область, где ведётся работа с серийным номером.

549625857280ae94e507fe1bab31e221.png

Видим ввод текста с помощью функции GetWindowTextA и два MessageBoxA с разным текстом: правилен ли серийный номер или нет.

Ставим здесь на вызов API-функции GetWindowTextA BPX, чтобы начать с того места, где вводится серийный номер.

3e4d32214c42b539471ccfb18aae7686.png

Запускаем крэкми с помощью F9 или RUN.

d3bb1d137ff33d9e5a3b67530fe20ee7.png

Так как пока что мы можем решить только ту часть, которая относится к жёстко-заданным серийным номерам, пишем в поле HARDCODED, которое находится наверху, неверный серийник или нажимаем на кнопку CHECK HARDCODED.

4f8c7a82f1dd387337a79912cb6719fb.png

Останавливаемся на BPX, установленный ранее.

f8ec7b55fc498d64797436911fc18468.png

Пояснения показывают нам, что находится в стеке, и это даёт нам сразу понять, что буфер, в котором будет сохранён введенный серийный номер находится по адресу 403215.

924fed886414595b9e2225769b45a35e.png

Посмотрим через DUMP, что находится в буфере.

8772e49d929276740507c639c39c335b.png

7600cf90755af717bb6825594a130532.png

Вот этот буфер, куда будет сохранён введённый серийный номер. Нажимаем F8, чтобы выполнить вызов API-функции.

ee85ba0ab1ee70296e48d7ebc3cd4901.png

Так как использовали F8, выполняется вся функция, так что неправильный серийник уже находится в буфере.

c76fcfacb53e7203da5ed56bb45b0c80.png

Ок, следующая строка переместит 401353 в EAX (помните, что LEA не перемещает содержимое ячейки памяти по заданному адресу, а только результат того, что находится в квадратных скобках; в данном случае это будет 401353). Видим в DUMP’е, что по вышеуказанному адресу (кликаем на строке правой кнопкой мыши и выбираем FOLLOW IN DUMP-MEMORY ADDRESS, и это нам покажет, что находится по адресу 401353).

39c392971c374418ed66ac16b507e141.png

По адресу 401353 находится строка “HARDCODED”; нажимаем F7, чтобы выполнилась LEA.

3d5a6d8a9b2164da6f3ec44dd0ac12df.png

После выполнения в EAX остаётся 401353, а с правой стороны появляется пояснение, что данный адресу указывает на строку “HARDCODED”.

f89cfc6f18bfe9c1b7f288be103335dc.png

Следующая строка загружает в EBX другой адрес, в данному случае это 403215.

28e22b395bd32e6fc152aa309bbd1336.png

После нажатия F7 EBX содержит значение 403215.

e909d53a88837f365faa72d0e999f584.png

И справа Олли показывает нам, что этот адрес указывает на строку “98989898”, являющуюся введёнными нами неправильным серийным номером, который мы посмотрим в DUMP’е так же, как сделали это для предыдущей инструкции.

f2886ac06c8a046a6f7da6bdce5e0014.png

Здесь 403215 указывает на наш неправильный серийный номер.

43135d31623928fb1d087751cee8579a.png

e14389ac463ab158ba691fe7061d0e9a.png

Следующая строка проверяет, равен ли нулю первый байт содержимого EAX, который равен 401353.

6fec54d4b29bdcc7f825f1c323d1a04a.png

Так как мы уже смотрели содержимое по этому адресу через DUMP, то уже знаем, что там находятся байты строки “HARDCODED”.

d250bcfedff6427101a22f350189be62.png

Первый байт в данном случае равен 48, пояснения OllyDbg нам также говорят, что это соответствует символу “H” в кодировке ASCII, а это первая буква слова “HARDCODED”. Так как это не ноль, то продолжаем.

75853ccbf63cec3dc401bb65482d93f5.png

Так как сравнение не активирует флаг Z (операнды не равны друг другу), JE не совершает перехода (помните, что JE срабатывает только тогда, когда активируется флаг Z),

Нажимаем на F7 и продолжаем.

d150c083b39201f2d715d8d8c46c6c91.png Здесь очень хорошо видно, что сначала будет перемещён первый байт [EAX], равный 48, что соотвтествует слову “HARDCODED”, а на следующей строке перемещается [EBX], являющийся первым байтом неправильного серийного номера, после чего оба сравниваются и если они не равны, то происходит переход на 4013D2, где выводится сообщение “SORRY, PLEASE TRY AGAIN”.

Проверим это следующим образом.

Нажмём F7 и переместим в CL значение 48.

fee4e5a5a6f0786ebac785f322202db2.png

CL, как мы помним, это регистр, соответствующий двум последним цифрам ECX, здесь перемещаем 48, и вот, что получится в результате.

63d7ceb6f6c3fe53f098ebde474273a9.png

Затем в DL перемещается первый байт неправильного серийного номера.

3780461a4856d4c75de7fbd20116e99e.png

Выполним строку с помощью F7, видим, что в DL находится значение 39.

a5b7bdeb5e0574cb2efee7ea8db4b2c7.png

Теперь CL сравнивается с DL.

2cca9ad3db8822fdfa8b8e442ee35b5b.png

Пояснение OllyDbg не оставляет сомнение: сравнивается 39 (что есть 9, т.е. первый символ введённого мной серийного номера с H, являющейся первым символом строки “HARDCODED”).

50faacc885a248d0cc37e8d3d6499b88.png

7327caca4255824ff892f89017af8448.png

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

295488f767306d4af35b6a9e602b5b1f.png

Теперь Z равен 1, как если бы в сравнении двух байтов они были равны и их вычитание друг от друга дало бы ноль, активировав данный флаг.

706771feb60f31c55cc1c74e0a2653ca.png

Видим, что в этом случае происходит увеличение EAX и EBX и переход с помощью JMP на начало цикла.

2286ba86ad69300670bd93f1e0391a71.png

Теперь EAX указывает на второй байт строки “HARDCODED” и видим, что цикл повторяет побайтовое сравнение, пока [EAX] не будет указывать на ноль, то есть пока не завершится строка “HARDCODED” (в конце строки за последним символом находится ноль).

Тогда после увеличения значения EAX и EBX на 1 будут считаны и сравнены друг с другом вторые байты, если равны, то цикл повторится, но уже будут рассматриваться третьи байты, а когда слово “HARDCODED” закончится, то если все сравнения на равенство CL с DL прошли успешно, перехода на окошко с ошибкой не произойдёт, и попадём вот куда:

e4e742a55930400898aabcccab74bf83.png

Здесь EAX указывает не на какой-либо из байтов слова “HARDCODED”, а на ноль, так как строка уже закончилась.

bd21c904afd4e916d42321d62be82d34.png

Вот и тот самый ноль, а это значит, что сработает соответствующая проверка.

6d44140ed0b9b9f1cf42a8aa0a98e379.png

Срабатывает JE, и мы выходим из цикла.

e892ab4d53583698d7e17c033b222f10.png

И попадаем в то место, где отображается сообщение о правильно введённом номере (так как поменяли значение флага Z при побайтовом сравнении, хе-хе).

a73c248ecd3533b489b122616f35fda6.png

Очевидно, что менять значение флага Z пришлось при каждом сравнении CL с DL, чтобы программа поверила в одинаковость обоих серийников и не перешла на сообщение об ошибке и не вышла, но в любом случае мы теперь знаем, что правильный серийный номер – это слово “HardCoded” (с соблюдением прописных и строчных букв, так как у них разный ASCII-код).

f9e2691ece9868371dc468640ea95f86.png

Уберём все точки останова, введём найденный серийный номер и нажмём кнопку “CHECK HARDCODED”.

df5b5d9ad7bc40680294b6a1a11a9c4f.png

Ещё одна победа, поздравляю.

Хорошо, тогда переходим к последнему крэкми с жёстко заданным серийным номером и заканчиваем на этом с ними, а в главе 16 перейдём к следующей теме.

Алгоритм следующего крэкми, который назвается SAMBO, отличается от предыдущих. Откроем его в OllyDbg.

68623715000ff254ef165535334d6f27.png

Выходим из этого окошка, которое говорит нам, что файл, возможно, самораспаковываемый или автомодифицируемый. Такие файлы на крэкерском жаргоне мы называем пакованными, запакованными или сжатыми. В дальнейшем мы изучим их подробно, но пока запустим его в OllyDbg и, несмотря на то, что он запакован, попробуем найти серийный номер.

Соглашаемся с предупреждением OllyDbg и прибываем в EP.

592ef4560569c4a48e87942edf0792fa.png

С помощью ещё одного окошка OllyDbg сообщает нам, что программа, возможно, запакована или зашифрована, поэтому анализ её будет настолько же неэффективным, как пепельница в мотоцикле, так как программа будет распаковывать себя во время выполнения, поэтому пока что выберем “Нет”.

b0b77a25725e86fde559a14b095797bc.png

Уже на первых строках листинга мы можем заметить, что этот крэкми выполняется не так, как его незапакованные сородичи, чья первая секция начинается с 401000.

Здесь точка входа равна 4d4001.

d4407d468c696e926bdae61736a1ee66.png

Посмотрим, является ли секция исполняемой, для этого идём VIEW-MEMORY или нажмём клавишу M.

9eb3aab320ec8bd5097c6d6eb119c0cd.png

62fbea06d78daf5ceb81515797e15365.png

Видим, что программа стартует в секции, начинающейся с 4D4000, размер которой равен 2000 (в шестнадцатеричной системе), и поэтому 4d4001 – это адрес, который относится к данной секции.

Это и есть то, о чём говорила OllyDbg – точка входа находится за пределами секции code.

531edb19e0cfd1ca292625ad4c17d228.png

Секция CODE начинается с 401000, а выполнение начинается с адреса 4D4001, который относится к другой секции. OllyDbg нам сообщила, что это характеристика многих запакованных программ.

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

А раз так, нажимаем F9.

bc1a7a354936d5c0d671d6b6d160d1f9.png

Мы уже знаем, что когда появится окошко крэкми для ввода серийника, программа уже распакована в памяти и выполняется в секции code, поэтому можем установить на эту секцию BPM ON ACCESS , чтобы остановить выполнение на её первой строке.

80da3156b766dca5d77a0af56d52672f.png

При попытке вернуться в окошко крэкми OllyDbg остановится в секции code (т.е. первой секции после PE-заголовка).

700b9731cfb7dc230ece911e5eada9b8.png Видим, что теперь программа распакована в памяти, можем её анализировать. Кликнем правую кнопку мыши в листинге.

59fa22b866ba3cd89cde9c1290373642.png

1a6b52a7c36c9c581e7a336ae6266835.png

Видим, что OllyDbg прекрасно показывает нам проанализированный код.

Теперь, когда мы находимся в секции code, можем посмотреть, какие api используются программой – то, что мы не могли посмотреть в начале, так как в тот момент нам показывались только API-функции, используемые распаковщиком, а не те, которые используются программой; сейчас же никаких проблем нет.

0f6c9551de1c0588ce7ac159cfc10bb5.png

2db742e781ca250a12a73e8ff7e03c49.png

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

6feecb18d191496df59a2ac016901e7d.png

Ещё один ужасный список.

3c071f2d145a45888efd698f6c2f647d.png

“YOU DID IT” – одна из строк с поздравлением.

743836971bf244dd760cd097929c173f.png

Хорошо, есть сравнение и переход, где мы видим строки с поздравлением и ошибкой, хотя здесь и нет MessageBoxA.

d7ab8446bdf762612373a418b0ffefe8.png

Устанавливаем BPX на условный переход, чтобы проверить, решающий ли это переход, и убираем BPM ON ACCESS щелчком правой кнопки мыши.

ff93da4c303b04a0079e9cc231a28afc.png

И делаем RUN.

7d5d4b2f36d65de368a198f2cbf1a1cd.png

В окне крэкми вводим “Narvajita” или любой другой неправильный серийный номер.

Нажимаем кнопку “Test-o-Doom”.

449a7574930ca3cbb7c9eab7991941a5.png

Видим, что произошёл переход, нажимаем F9.

e7a1129832b56f733d9431a07353b4a1.png

Тогда соглашаемся с окошком с поздравлением, что у нас получилось.

d787576d42bc65bff91b9620e176a2b4.png

Оно говорит, что это была шутка, и ничего не вышло на самом деле, ха ха! Делаем RUN по-новой и снова прибываем к переходу, связанному с кнопкой “Test-o-Doom”.

e77a1fc7a62100eb2674638b597d1450.png

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

4d629611fe139d35caf084ae6d55421b.png

После двойного щелчка на флаге Z и изменения его значения, делаем RUN.

b1c6a5d851e518cd73259b1c9d875c52.png

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

635503e47e3698ac0222aad3ae43763f.png

Это TEST CL, CL, где проверяется, равен ли CL нулю или единице, что задаётся где-то до этого, возможно в CALL, вызываемый ранее, на который мы можем поставить BPX.

5e36edde26ee215fbbfe1bb91cfcf3d6.png

Делаем RUN, возвращаемся в окно и снова нажимаем кнопку Test, чтобы остановиться на CALL.

Остановившись, осмотримся любопытным взором вокруг, хе-хе.

c105c3a145e9bef674651c56d5ecfd55.png

Если посмотрим в стек, то увидим введённый неправильный серийный номер, заглянем в DUMP (через FOLLOW IN DUMP).

d25f34db74f0eaaaee16dcb1237c1519.png

504edf241a6ef78245d060f0c585e91e.png

Мой глаз крэкера видит здесь строку, которая, возможно, является верным серийником; могли бы посмотреть, так ли это, но пока делать этого не будем и продолжим поиск серьёзным образом.

Если внутри данного CALL производятся какие-либо сравнения или операции с неправильным серийником, то можно установить BPX ON ACCESS на него, чтобы программа остановилась, когда с ним будет что-нибудь делаться, то есть на какой-либо операции или сравнении.

ac0c8d128bdc5da73f13134c7ee5b9f6.png

Выделим неправильный серийный номер, нажмём правую кнопку мыши и выберем BREAKPOINT-MEMORY ON ACCESS.

90ebc9e16461d9f95492bed1feefb488.png

После этого, когда продолжим выполнение, то если внутри call происходит какая-либо работа с этим серийником, OllyDbg остановится.

Нажимаем F9.

Видим, что остановки не произошло, возможно, сравнение происходит раньше, так что мы можем поставить точки останова на CALL'ы, находящиеся ещё выше, и повторить то, что делали прежде, но лучше пустим в ход другой способ остановиться на том месте, где вводится серийный номер: здесь не используется API-функция GetWindowTextA, но у нас есть сообщения Windows, которые послужат нам не хуже.

Убираем BPM ON ACCESS.

6742aeed4c1401447b7a136bbe2c7c75.png

Ставим быстрым способом BP TranslateMessage.

b11b2ff388f7f7e8c4114fb5705e3e83.png

А теперь RUN.

61b19eff1294fec6a8e2aad3d1b90298.png

Остановшись на API-функции, нажимаем на правую кнопку мыши и выбираем:

30a7fe5548393069fbee2b93c1570888.png

6c24133546c5f7f715025fd68e983e00.png

И в окошке печатаем условие MSG==202, которое является значением WM_LBUTTONUP.

И устанавливаем переключатели так, чтобы остановка происходила по ON CONDITION, и чтобы логгировалось всё.

4a27da87c92ead3290c3fb231ab60d3b.png

Здесь розовым цветом обозначен BPX CONDICIONAL. Делаем RUN.

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

3aee4b38660b89bd30a8fd711a398fb9.png

И по нажатию на кнопку срабатывает BPX CONDICIONAL.

bfcd0d34f313e29894071ba9b7f00547.png

Остановка произошла на WM_LBUTTONUP.

Возвращаемся в программу с помощью EXECUTE TILL RETURN.

de3c89197fda3b82a7bb0edc805d5af8.png

a956ee2ffb0eb9375eb4f5979a571d94.png

Нажимаем F7 и возвращаемся в программу.

d34f5457e3cc59a00bf36930bc6fad0c.png

Здесь у меня появляется две возможности. Установить BPM ON ACCESS в первой секции, чтобы сделать переход с помощью F9 и посмотреть, куда ведёт процедура сравнения серийного номера, что мне кажется сложноватым, так как я уже видел, что эта процедура весьма большая.

Другая возможность – это посмотреть, находится ли уже в памяти введённый нами серийный номер, так что идём в окно M.

efbc2802d4a12cce98ea060ad2d5a2d9.png

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

ebb76a31219f25db21a3b452b4556017.png

В появившемся окне в поле ASCII введём наш неправильный серийник.

5002c44c9b2594e5a4c761e1e17e1d54.png

Нажимаем OK, чтобы начать поиск в памяти.

3f33629a2d4c32d757313aad7740c35b.png

С помощью CTRL+L можно искать остальные вхождения этого слова, но больше ничего не находим ни в секции, которую мы открыли, ни в остальной памяти.

4d8da31e8874c6bec1c0d87c801ead9f.png

Устанавливаем BPM ON ACCESS на этот неправильный серийник, , чтобы найти момент, когда с ним производятся какие-либо операции, чтение или сравнение.

И нажимаем F9.

29023a1fc0a3db71675a99b2c9e025c8.png

Останавливаемся там, где он копируется в то место, которое мы видели в последнем CALL’е.

54fd75c80b6fb111ee727e14bd307124.png

Мы знаем, что REP MOVS копирует содержимое из ESI в EDI, так что посмотрим EDI в DUMP (правая кнопка мыши на EDI-FOLLOW IN DUMP).

140a5d32602cf7fbb329aafa8d7c383b.png

cc6ee5da178aaa279cdbf6fa0d94f99a.png

Сюда REP MOVS скопирует серийник, нажмём F8, чтобы он это сделал.

5575148263e907697356571af27c8d85.png

Оказались после этого на RET, серийник полностью скопировался, и устанавливаем на него BPM ON ACCESS.

f5f1049793f10e833a811ab316e0aab8.png

Выполнив RUN, останавливаемся здесь.

a1014b43c1a4e927f9ee8053e3540cb6.png

Точнёхонько на сравнение, хех.

47e3ee73fac107497c08fa2409ed9f7a.png

ESI указывает на мой неправильный серийник, а EDI на правильный, который равен «1556555».

Убираем все BPX.

f37c93303048fd08adf8d66f45ecd0e0.png

0493a70647ec812c6491513cb8a570f2.png

5f4b63b02c51e568e4978a81e802efc3.png

10da66f24af83e6a1bdbcb851d04807e.png

Появляется окошко с поздравлением.

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

О нас

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

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя