# Глава 18

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

Но эту тему мы начнём в 19-ой главе, так как среди тех, кто изучает этот курс, нашлись люди, написавшие мне на почту и попросившие разобрать пример крэкми без кнопок как в прошлой части, и рассмотреть применение другой техники, использующей WM\_KEYUP.

Хорошо, используем для этого крэкми, предоставленный мне Stzwei’ем (спасибо ему), который называется \_4stz.exe [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/18/crackme_4stz.7z). Его мы и рассмотрим в данном туториале.

Откроем крэкми в OllyDbg.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-a9035ac06fa27e21c06526b6ed1701ab776fd5ec%2F1.png?alt=media)

Находимся на точке входа. Посмотрим, какие здесь есть не запакованные строки.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-9d488467f38a3aed4a0bdfbb7a2be5f714213278%2F2.png?alt=media)

Отображается список строк, используемых программой.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-d93188056a2b00e7388e443d6cc9b604501c9ad0%2F3.png?alt=media)

Здесь нет ничего интересного, посмотрим API-функции.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-8c3385af430350d0005b5e19606d14aa70e6bbe2%2F4.png?alt=media)

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-68cd1c67a59891e97a313cecd727a153b75390dd%2F5.png?alt=media)

Уфф, так много.. Ок, запустим программу и окажемся в окошке, где вводится серийный номер.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-cc0a0a2fe9b8a526068e28184035d05691f31abe%2F6.png?alt=media)

Видим, что кнопки регистрации нет. Введём полное имя.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-d3ea59975e998484bac80005b13cc943b54fca0d%2F7.png?alt=media)

И установим BPX CONDITIONAL LOG на TranslateMessage – сначала обычный BPX.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-96e9843e03a965df607a05aa5f0babca9de9e5fa%2F8.png?alt=media)

А когда вернёмся в крэкми, отредактируем установленный BP.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-e24282e69059acb5d4b00845f07d5735f46036f4%2F9.png?alt=media)

Если кто-то не помнит значение WM-сообщения, которое собираемся использовать, то нужно перейти в окно W, которое показывает, какие окна используются программой.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-a8f56d67c811ad066b650dba3a227e03c6ce2857%2F10.png?alt=media)

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

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-d4fed08b5844420e211106c77cbcfbbeb417d0c5%2F11.png?alt=media)

И мы попадаем в окно точек останова на сообщения с раскрываемым меню с WM-значениями.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-052e576c56fdb2464ce8e380f48711ae305899b7%2F12.png?alt=media)

Поищем в списке WM\_KEYUP.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-cb87613db35b5668ab7d2d1628ced6527788aba9%2F13.png?alt=media)

Видим, что это 101, поэтому уберём всё, что мы делали только для того, чтобы узнать это значение, и вернёмся к BREAKPOINT CONDITIONAL LOG в TranslateMessage.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-7406f1851a31862c8622c4980cff7fa990d84dc4%2F14.png?alt=media)

И устанавливаем здесь MSG==101 (обратите внимание на двойной знак равенства), также, если бы не нашли значение, могли бы написать MSG==WM\_KEYUP и это бы сработало, но мне больше нравятся числовые значения. Здесь каждый волен поступать так, как ему это нравится.

Хорошо, точка останова трансформировалась в условную (розовый цвет).

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-de13e63771b5bbf7e41e7439dc6a064375f3a902%2F15.png?alt=media)

Делаем RUN и вводим первый символ неправильного серийного номера.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-02e134f160bf26ba1446672c4e278ea0f8952922%2F16.png?alt=media)

И тут срабатывает условная точка останова.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-e521d17b0835e9557ba094dc150943050e20c9b5%2F17.png?alt=media)

Смотрим параметры API-функции, по адресу 12ff78 находится структура, в которой сохранены значения нажатой клавиши, в данном случае это 39, что соответствует цифре 9.

Смотрим через DUMP указанную область памяти – нажимаем правую кнопку мыши на указанном адресе и выбираем FOLLOW IN DUMP.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-4f595a20aa70b02dc93e9fd918192066042c8c7b%2F18.png?alt=media)

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-da3402c40e3246a358983035db1eb8fa65ccddff%2F19.png?alt=media)

Видим, что нам удалось узнать, куда помещается байт. Проблема в том, что это программа на Delphi (что мы рассмотрим в другой раз), и если мы установим на него BPM ON ACCESS, программа будет ходить сто раз туда-сюда, прежде чем дойдёт до сравнения, поэтому метод, который мы рассматривали в прошлый раз, работает здесь гораздо лучше, так что его мы и используем. В любом случае, вы уже знаете, как остановить программу по нажатию клавиши и как установить местонахождение байта. Разумеется, в крэкми, не написанном на Delphi, гораздо проще использовать BPM ON ACCESS.

И запускаем.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-8c62f1c34a259bc52db6c7de7203ea0d909fb7e5%2F20.png?alt=media)

Вводим 9898, идём в окно M и ищем по всей памяти.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-a1ca4da3503943c5fde37d59dc3f6f3ba4ec4038%2F21.png?alt=media)

Нажимаем правую кнопку мыши и выбираем SEARCH.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-9e3358dde86497bb301527d555ba16c3899b1595%2F22.png?alt=media)

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-e5dee6a49c00c33e2dd6d3021663e46dfc36af48%2F23.png?alt=media)

И ищем строку 9898.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-2edd7e50746c657b1e1194f79cfc754812d42e47%2F24.png?alt=media)

Первое вхождение обнаруживается в стеке. Нажимаем CTRL+L несколько раз, чтобы увидеть, сколько раз оно в нём встречается.

Как только нам внизу отобразится жёлтым цветом слово ITEM NOT FOUND, выходим и возвращаемся в окно M.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-14e03ff6f2e9db81adab9b316fb28beaaea92825%2F25.png?alt=media)

Оказываемся там, откуда искали, так что идём дальше вниз с помощью CTRL + L.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-e08a6d515e733470951da639541c23760c40bd0c%2F26.png?alt=media)

Первый раз в этой секции, нажимаем CTRL + L, чтобы посмотреть, найдётся ли здесь что-либо.

Нет, ничего нет, если посмотрим область, находится вхождение чего-то подозрительного.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-0dfc28f850e014be21457eadbbea2546d678a988%2F27.png?alt=media)

Видим возможный серийный номер 418507, установим на это место BMP on ACCESS, чтобы посмотреть, не с ним ли происходит сравнение.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-18908c0c136ecfdce7621a13a16fbef235eab265%2F28.png?alt=media)

Делаем RUN.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-351977256d89b26866693c530a6a258656ab2283%2F29.png?alt=media)

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

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-93925bc01c684d02099e5e5f9f84e87a3106bdaa%2F30.png?alt=media)

Видим, что каждый раз, когда печатаем, по новой копируется мой неправильный серийный номер, и с каждым следующим символом по новой копируется правильный серийный номер. Как только введём 6 символов, то установим на них BPM (помните, в предполагаемом серийном номере как раз 6 символов? – прим. пер.).

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-523e9acfb3b729b3e3d7424ee9a9ea66a8201f61%2F31.png?alt=media)

Останавливаемся прямо на сравнении.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-58c5453adce24f4104835d7acd0943cb6c7e64fd%2F32.png?alt=media)

Тут видим, что ESI и EDI указывают на неправильный и правильный серийные номера.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-b12e89a4657208d60ea6b409e07ea38c958dd6c7%2F33.png?alt=media)

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

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-f8f058798d68d04c47c0d511dc6c2f324a4bc095%2F34.png?alt=media)

*(Сообщение гласит: "Поздравляю, победитель!" - прим. пер.)*

Видим, что не смотря на то, что это сложный крэкми, можно поймать точный момент, когда происходит сравнение, для чего нужно отслеживать местоположение неправильного серийного номера и ставить на него BPM.

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

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-9b96e72361af1afccd0fad585cfd15e6691208dc%2F35.png?alt=media)

Он же, но уже из 5-ти первых байтов, чуть ниже.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-e12ce971f47d33ddfd36ba70098d0b919e9c9bdf%2F36.png?alt=media)

Соответственно, можем установить BPM ON WRITE на область, находящуюся ниже, где будет записан следующий символ.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-e72c0c6db249ce952c523d89099f2c49473dd28c%2F37.png?alt=media)

Отметим место, куда будет помещён следующий символ, а затем делаем RUN.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-1353e9fe224f50f98eb9f7fafeda3e1e98d2830e%2F38.png?alt=media)

Здесь записываю наиболее возможный серийный номер.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-420f7ee05b1b422836b14e0490972171edfeee06%2F39.png?alt=media)

Делаем RUN.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-af82f1af8faf1f60da96e0141c296e31f1a53cf3%2F40.png?alt=media)

И далее программа останавливается на том месте, где копируется неправильный серийный номер, и прежде, чем это произойдёт, можем установить на него BPM ON ACCESS, а затем выполнить RUN и снова остановиться точно на сравнении.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-6462f5438cbb199f5c86784f8bc762d916e3c8c3%2F41.png?alt=media)

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

Ладно, оставляю домашнее упражнение – крэкми CrueHead’а 2 [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/18/CRACKME2.7z), а со следующей главы мы переходим к новой теме.

\[C] Рикардо Нарваха, пер. Aquila
