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

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

AnGel

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

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Ещё техники для Visual Basic (абсолютная война)

Лично я слышал немало крэкеров, которые говорили, что тот или другой метод – это не «чистый» крэкинг, не «элегантный» крэкинг или что-нибудь ещё вроде этого. Для меня «элегантный» крэкинг – тот, который работает, и это всё, что имеет значение, потому что на войне как на войне: программисты, создающие упаковщики и протекторы не задумываются о том, насколько «элегантны» их действия, они используют любые методы, которые могут найти, не думая о том, как те повлияют на наши машины. Мы рассмотрим примеры грязных трюков, которые используются упаковщиков в отчаянной попытке сделать так, чтобы никто не мог распаковать защищаемую ими программу.

Поэтому я думаю, что если враг использует ракеты, ограничивать себя в бою револьвером – это значит заведомо проиграть, так что я использую ЛЮБОЙ метод, который нормально работает, не портит другие программы, корректен и юзабелен, и то, что он не одобрен АЭК (Ассоциацией элегантных крэкеров) меня не остановит.

Прояснив этот момент, переходим к рассмотрению следующего крэкми, которое будет объектом сегодняшнего изучения.

bf42da644d24bddc4b1a5a5b371ba766.png

С помощью метода 4c мы может легко избавиться от наг-окна. Часть, связанная с серийным номером, сделана с помощью PCODE, и его мы оставим до того момента, как начнём рассматривать эту тему.

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

Прежде всего посмотрим, что там с вводом серийного номера.

bca4aa1edb28908d26b8579708a4940c.png

Оказываемся в окне крэкми и вводим неправильный серийный номер.

128fe58dbd1cc8149e1bac2100c84a7f.png

Одна из самых полезных функций для сравнения – это vbaStrCmp.

b278673e47901fa05281d172890968c2.png

Устанавливаем на неё BP, чтобы посмотреть, будет ли она использоваться для определения, является ли введённый серийный номер правильными.

Так как останавливаемся множество раз и постоянно нажимать на F9 лень, то посмотрим, можно ли перехватить сообщение об ошибке и оттуда попасть в сравнение, которое должно быть где-то поблизости. Снимаем BP на сравнение и устанавливаем его на вывод окошка сообщения.

Bp rtcMsgBox

826d3c8eebec6e0248c34695b57ac8e3.png

65b3335f40127b0990360a5b262c25fc.png

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

b774d5b00b62ecc66523affc936f9b83.png

Идём сюда.

2724485faa94104c02a9fd46a0de2bbd.png

e919bbf5254730eb3210dd97489ac3b2.png

Вот, куда произойдёт возврат. Это вызов API-функции и смотрим выше, есть ли там какое-нибудь сравнение.

95be36928722ea08157e968c0cfc4fd8.png

Немного ранее видим его, устанавливаем BP, чтобы проверить, верно ли наше предположение, нажимаем F9.

2f9e342c5d64d50987e4b79f73de239a.png

Здесь видим, что мой серийный номер сравнивается с другим числом. В моём случае это 4887649. Смотрим, является ли этот серийный номер правильным. Убираем все BP и снова попадаем в окно ввода серийного номера.

eb5863caf871428a52f0f60f761d5d47.png

18bc90f0d262622ae674fa5892c18912.png

Да, это правильный серийный номер, кейген оставим когда-нибудь на потом.

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

c2be4c437f2eebe4bafcc78bfa86c0b1.png

816736888dd9e74a4dc5fd776be86762.png

И переходим в режим PE HEADER.

59ff466b4e3fe540b4fcfd1fc55a9b7c.png

Спускаемся оттуда, где начинается PE SIGNATURE заголовка, до места, где находится первая секция.

0a08cbb1c5c42bab1361c95d3ae94f56.png



Здесь видим характеристики. Знаем, что если изменим на E0000020, то сможем производить запись в данную секцию.

8ed2c3a158be300689752bf2ca11b684.png

892610f8dfa6f9302f2b1152b6f429fd.png

Хорошо, теперь сохраняем изменения.

4a64bfa7536eb9694f68700a50a3b1bd.png

7a6ff33d78e4451354b48e6006ec3c42.png

acff8dcf5a6096ce89f14f901991a2c5.png

Сохраняем как CrackmeA.exe.

409144aa0e4fbb4ce2d7f47e63c0f52b.png

Теперь открываем CrackmeA в версии OllyDbg, пропатченной на предмет OEP’ов и Visual Basic’а.

Устанавливаем BPM ON ACCESS (которые исчезли после выхода из отладчика) на секцию CODE.

e5d5696c8b8230d5e294da4af872272e.png

Делаем RUN несколько раз досюда.

3b6d8440e4c9278f63c2a85cf4b0aa95.png

Продолжаем, пока не остановимся на знакомых нам JMP’ах, уводящих в разные части программы.

5342ed4ea60f33e78f911ec1a661d9bf.png

Видим, что в первый раз останавливаемся на первом JMP и переходим на 40bd80, то есть здесь выполняется первая часть программы. Смотрим, появляется ли наг-окно до того как происходит возврат к этим переходам. Убираем BPM ON ACCESS, так как сейчас будет выполняться значительная часть программы в секции кода, и останавливаться на каждой строке нам совсем не нужно, лучше установим BP на эти конкретные переходы в разные части программы.

25ea650e6613b865392f5d367f8b9595.png

Посмотрим, будет ли наг-окно или перейдём к другому JMP. Делаем RUN.

e77be313bc6cdf915290a456d8a88404.png

Сейчас останавливаемся на последнем переход, который ведёт в 40c470, но нага ещё нет.

Снова делаем RUN.

9a0d299b5354601a1965c2fe5580d2ba.png

Здесь появляется наг-окошко, то есть часть программы, которая начинается с 40c470 ответственна за наг, нажимаем кнопку «Register».

40eeb1642706c13d503da99aef2d25e8.png

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

bea458ab54bfe0332f2d931f09a9771b.png

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

Запускаем изменённый нами CrackmeA не из-под OllyDbg.

32f7e96bedb1c9fe147868b5f9cf9689.png

Видим, что наше изменение слегка улучшило состояние дел с проблемой, хотя и не решило её, т.к. изначальное наг-окно не исчезло и требует, чтобы была нажата кнопка «Register», для чего отображает окошко для ввода серийного номера, которое находится сзади под первым. Это большой шаг вперёд, так как раньше если мы делали наг невидимым, то мы не могли нажать вышеупомянутую кнопку. Теперь же мы можем сделать так, что окно ввода отобразится, а наг сделать невидимым, так что окно для ввода серийного номера останется одно на экране.

Поскольку наши попытки с JMP не решили проблему полностью, не остаётся ничего другого, как вносить изменения в VB-библиотеку. Это может стать для многих крэкеров поводом, чтобы сказать, что не подобает изменять VB-библиотеку, но это верно только тогда, когда она находится в system32 и используется всеми программами. Мы скопируем её в ту же папку, где и располагается программа, так что она будет использовать только последней, а остальные программы будут продолжать использовать библиотеку в system32.

Вопрос заключается в том, как именно называется эта DLL.

ea51a4468cda8fa70393fb0ccee20191.png

Копируем в папку с программой.

8ef01019ddce2d7c8ef6574f0bb9663c.png

Теперь она находится вместе с CrackmeA, то есть чтобы перестала использоваться системная VB DLL, нужно скопировать её в папку с программой, и та будет использовать именно эту копию библиотеки.

Соответственно, когда некая программа использует какую-то нестандартную DLL, то первым дело надо поискать её в папке этой программы, а если её там нет, то в system32. Подобное положение вещей нас очень даже устраивает, хе-хе, потому что позволяет нам вносить изменения только для конкретной программы, не меняя ничего для других.

Снова открываем CrackmeA в OllyDbg, в этот раз используя обычный, неизменённый вариант отладчика, чтобы внести те строки кода или изменения, которые нельзя сделать в пропатченной версии.

6e2cebc7a22568adf26c6651ddac3011.png

Проверяем с помощью кнопки E, используется ли DLL из директории программы или из system32.

3ca6d8c85c4cc5349e5fd4df5ce69a89.png

5c5d93116ce7bb5978099d9154c6d95a.png

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

Хорошо, у нас есть VB DLL. Для того, чтобы можно было вносить в неё изменения, нам нужно выставить в секции кода права на запись. Это можно сделать следующим образом.

Открываем OllyDbg и идём в меню OPEN.

9038b471b041369a1ecd3db1de98d186.png

Видим, что по умолчанию стоит отображение EXE-файлов, но сейчас нам нужно открывать DLL, так что меняем соответствующую настройку внизу.

4f8356582908efbcef3a415fcd4672f7.png

Ставим «Dynamic-link library (*.dll)», что позволит нам открыть DLL Visual Basic’а.

c2f534d66f5bd62865c18eb4d2d32861.png

3e346da8e53e980377ff93c37a39c4af.png

Останавливаемся на точке входа библиотеки.

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

9d03b5238c1b1263c955e7146e7bb762.png

В колонке «Base» мы находим базу образа DLL, которая в моём случае равна 66000000 и может отличаться на вашей машине.

Идём в DUMP и смотрим заголовок.

77a4388bccb2a693685d5d5a0ec93eca.png

440daac649be9ac7775b4d8fe9597e95.png

Теперь меняем режим «Special - PE HEADER» согласно процедуре, которую делали в крэкми. Спускаемся и ищем секцию кода.

52881653bdf0d0d2e0b2e2fda8a604da.png

Меняем на E0000020, чтобы установить разрешение на запись.

c89883ac41403989fc2a9d8cc74e8855.png

ebad79c8158af25b882e6f84340e7916.png

Сохраняем изменения.

dbeacc9e6d5c02e4cc8324b92be68a78.png

b9978221fee5a93385c87609f0693af4.png

Здесь не меняем имя, а сохраняем под тем же.

Как только у нас есть крэкми и DLL с возможностью писать в неё, до того как делать вставку, покажу в чём заключается идея того, как сделать так, чтобы не появлялось наг-окно.

Открываем в OllyDbg крэкми, которое нам нужно пропатчить, останавливаемся, когда поверх окна ввода серийного номера появляется наг-окно, устанавливаем BP на API-функцию создания окон с помощью команды “Bp CreateWindowExA”.

c0ee4d2c857b23bd10cd03136605d80d.png

Теперь открываем крэкми.

c3d05307d89f172a3094b809b1c2e62b.png

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

56df2f86150e3d8409355f9263483144.png

Тут мы легко обнаружили её по имени окна, т.к. оно совпадает с названием в заголовке окна.

e4c75c2d3cf363d1b9bbe510a317fc9f.png

Хорошо, тут создаётся наг, можем здесь поменять его стиль, давайте посмотрим, что произойдёт если поставим 40000000.

e6cac7aab627a07b9a257ce9eac079eb.png

87a564635fb1459821fbd548aa2c5d77.png

Меняем стиль на WS_CHILD. Вы можете поэкспериментировать с разными значениями. Теперь убираем все BP и делаем RUN.

eccffd5ae1076c84602ad45a2d7e4eee.png

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

Ок, повторяем процедуру до дого момента, как создаётся окно, чтобы вмешаться в API-функцию CreateWindowsExA.

5ae4405deb6a579cb87a02dda1b95569.png

d4edd407486c44b029cff0f964de1ed5.png

Видим, что API-функция вызывается из DLL Visual Basic'а, смотрим, откуда происходит вызов, информация об этом содержится в первой строке стека. Идём туда.

eb6d2bee8e260774bbac4a58f742e530.png

Устанавливаем BP сюда и выходим из API-фукнции.

Теперь посмотрим, когда произойдёт останов. Рестартуем и делаем RUN.

65c82375b4b6cb390dfa24f0b5660e61.png

Останавливаемся здесь и смотрим стек.

9c40ee381d14bda8a42b6ffc009f0efd.png

Видим, что в первый раз останов происходит при создании наг-окна, а так как в последующие разы останова на этой API-функции, вызов происходит не отсюда.

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

Вставка начинается с JMP в пустую область, куда можно писать. Если поищем конец секции, то найдём там такую зону.

666aad82ea25d76b443f104277f2681b.png

На моей машине такая область находится в конце секции кода, идите туда, где много нулей.

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

1c8ecb730f7409502ce436ff5f462a15.png

b5039f2f263167478abc7b1205c29b11.png

Видим, что область находится в исполняемом файле.

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

a2260aa4b5558b0890a0ef2ea376351f.png .

Сначала в том месте, где находится вызов API-функции, делаем переход на вставку.

9ce0e01fabd650816fb847dd75bcbfa3.png

Делаем косвенный переход, так как это делает возможным не модифицировать следующую строку после вызова – “MOV EDI, EAX”. Всегда надо следить, чтобы добавление кода не разрушало инструкций, идущих после. Это обеспечивает нормальное выполнение программы. Если перезапишем какой-либо байт “MOV EDI, EAX”, то после возврата из вставки, получим ошибку.

Делаем косвенный переход, который содержит адрес 660fc400, указывающий на место, находящееся чуть ранее моей вставки, где хранится собственно её адрес. Можно было бы сделать прямой переход, но ладно, обе возможности равноценны.

b4dd7f46414b5125dc279ddfd325d12d.png

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

ca0d97ad5da9c9ae750d25fa03eeb55d.png

Конечно, в стеке находятся параметры API-функции, видим имя окна.

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

9894b378d766a38ede803bc891ff6dc3.png

Если сделаем двойной щелчок здесь в стеке, то увидим, что изменилось.

f1c2db56eb4da3b1e4265836a9aac701.png

Это значит, что первая строка является ESP, вторая ESP+4 и так далее. Видим то, что нас интересует, находится в ESP+8. Перемещаем значение, находящееся там, в EAX.

ee5a8152538c5002f599aab6fad16424.png

Будем трассировать вставку, чтобы понять, как она работает. После выполнения этой строки в EAX остаётся.

241f34064f414ada9551bca7709ce1a8.png

Указатель на строку с названием, затем следующая строка проверяет, равен ли EAX нулю, что может случиться, если окно без названия.

9653042c25c35e9a091e8a28fcb9f600.png

e433458f53363788b6f5abf2d17e2919.png

Здесь видим, что если EAX равен нулю, то не надо ничего модифицировать, так что идём прямо к вызову API-функции.

Если EAX не равен нулю, то в этом случае переходим к следующей строка.

cd4de30437c115c3ead6fbca77b1c6e8.png

Здесь проверяется, так ли это текстовая строка, что мы ищем, то есть равны ли первые четыре байта названия 756f7243.

485365c6915ea861f2806b7515a99651.png

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

df886ed5faca654d4fdf514011b0a993.png

Здесь видим, что если не равны, то переходим к API-функции без каких-либо изменений, сейчас равны, то есть это нужное нам окно, поэтому продолжаем и меняем параметр в ESP+C, являющийся стилем окна, на 40000000.

97a0fb0a36cfe6c2cde007ccfeb4bede.png

Здесь, после выполнения строки:

448d3072711a65e0fb0e8b873420dd30.png

Доходим до API-функции и видим, что параметры следующие:

56d2bbb6aee329fa2c176236862b80cb.png

Vemos que como cambiamos ESP+C por 40000000 ahora el estilo es WS_CHILD como queríamos.

Видим, что изменили ESP+C на 40000000, то есть на стиль WS_CHILD, как и хотели.

Следующая строка – это вызов API-функции, которая должна совершаться в прямом виде, а так как это было в оригинальном вызове.

039e0dce18607e54d6ff92c809e2bc11.png

Видим, что это косвенный CALL, считывающий правильный адрес API-функции из 66014e8, для чего оно должно быть туда записано.

CALL [660014e8]

И OllyDbg изменит и поместит имя API-функции, куда совершается переход, однако всегда важно учитывать, что это косвенный вызов, идентичный исходному, работающий на любой машине. Подобные вещи мы рассмотрим глубже в части, посвящённой распаковки и IAT’ам.

df3ac1f702e99a6d9f630ffcf2e4ab2f.png

После вызова API-функции возвращаемся на следующую за оригинальным вызовом строку. На моей машине это “MOV EDI, EAX”. 87f628328dc778faaced7de992e9edcf.png

Продолжается выполнение программы.

Как видим, то, что нужно сделать – это заменить вызов API-функции на собственную процедуру, которая проверяет окна, и если это наг, то меняет стиль.

Сохраняем все изменения и пробуем.

6279f2081b8017f9c78d4756ee39a7bb.png

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

Вводим его в соответствующем поле.

29d1bcc299be348c601a1519fc74baf5.png

Нажимаем OK.

98e901016f4c594c31639e1ea7ebb41e.png

Видим, что всё работает превосходно. Не нужно быть ханжами, надо делать то, что проще всего.

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

Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
 

О нас

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

    Dark-Time 2015 - 2022

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

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

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