# Глава 27

## Продолжаем с Visual Basic'ом

Ок, продолжаем с Visual Basic’ом. Здесь у нас крэкми, в котором нужно избавиться от наг-окошка. Я это сделаю это тем способом, который подойдёт для данного конкретного случая (мне нравится размышлять и пробовать новое), но конечно, используя OllyDbg, специально заточенный для VB, тот же, что и в прошлой главе. Потом мы рассмотрим механический способ, позволяющий сэкономить время. Можно было бы сразу дать его, но я считаю, что очень важно самому попытаться это сделать, чтобы понять как его работает, поэтому сначала рассмотрим мой способ снятия нага, а потом – механический способ, потому что вы должны знать и уметь применять оба.

Killme [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/27/killme.7z) – это крэкми, которое мы будем изучать. В нём нет крэкми, а есть только назойливое наг-окошко, появляющееся при запуске программы и которое нужно убрать.

Если запустим крэкми в OllyDbg, то увидим наг-окошко.

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

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

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

Появляется указанное приложение, которое должно запускать сразу без каких-либо нагов. Изучим немного о том, как работает крэкми, разумеется, с помощью OllyDbg.

Первое побуждение, возникающее при исследовании программы с наг-окном — это посмотреть JMP-переходы, ведущие в разные части программы.

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

Запускаем программу и нажимаем F9.

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

Указанное время прошло и кнопка CONTINUE становится доступной для нажатия.

Знаем, что при закрытии нага осуществляется проход через JMP в секции кода, поэтому устанавливаем BPM ON ACCESS в указанной секции (что в реальности будет BPM ON EXECUTION) и нажимаем кнопку CONTINUE.

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

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

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

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

То есть видим, что собственно программа начинает выполнение в 40D090, то есть мы видим JMP-переход на 40D090, где начинается указанная часть и видим остальные JMP на разные части программы. Устанавливаем BP на все эти JMP, чтобы куда и в каком случае они ведут.

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

Перезапускаем программу.

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

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

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

Видим, что останавливаемся на следующем JMP и если нажмём RUN снова:

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

Несколько секунд и останавливаемся снова, и так – 5 раз, что говорит мне о том, что в этой процедуре содержится таймер.

Оттрасируем эту процедуру и посмотрим, что в ней находится.

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

Ничего хорошего, продолжаем трассировать с помощью F8.

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

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

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

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

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

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-66c6c440ef70141891fb1778ae6e32b46bda5f4d%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-070932fdb4517a5340d5d8a91523d85a4b472703%2F16.png?alt=media)

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

Идём к строке, которую забиваем NOP’ами до запуска чего бы то ни было.

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

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

Убираем все BP и ставим один сюда. Теперь делаем RUN.

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

Останавливаемся здесь и трассируем, чтобы посмотреть, где завершается процедура и происходит возврат в библиотеку Visual Basic’а.

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

Видим, что дошли до RETN, но переходит не в DLL VB, а продолжаем с 40d714.

Продолжаем трассировку.

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

Здесь видим RETN, который, согласно пояснению, производит возврат в DLL Visual Basic’а, поскольку тут уже всё подготовлено для запуска программы, так что можем попытаться изменить этот RETN 4 на переход в начало программы. Смотрим.

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

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

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

Пробуем, запустится ли. Делаем RUN.

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

Можем сохранить эти изменения, начальные NOP’ы и эти два перехода.

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

Нажимаем правую кнопку мыши – COPY TO EXECUTABLE – ALL MODIFICATION и сохраняем всё, что изменили.

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

Нажимаем COPY ALL.

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

Теперь правая кнопка мыши – SAVE FILE.

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

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

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

Делаем RUN.

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

Видим, что сначала происходит остановка на том переходе, который создает наг-окошко (404b7a), а спустя нескольких секунд происходит закрытие окошка и остановка на 404b87, после чего сразу запускается программа благодаря нашему патчу, так что нам нужно изменить переход, который создаёт наг-окно, чтобы сначала выполнялась пропатченная нами процедура, а затем сразу запускалась сама программа.

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

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

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

Сохраняем изменения и пробуем ещё раз.

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

Происходит "чистый" запуск без каких-либо всплывающих окон – чистый как слеза младенца.

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

Посмотрим на точку входа:

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

Видим, что программы, написанные на VB начинаются с PUSH и CALL (если вам они не встретились, значит, что exe-файл был изменён, тогда необходимо найти PUSH и записать адрес, который кладётся в стек, в данном случае 40436C).

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

Как видим, это адрес VB-заголовка.

К этому адресу необходимо прибавить 4C.

`40436c + 4c`

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

Это 4043b8.

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

Вот он, теперь ищем адрес, который здесь лежит – это 4044c0.

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

Находим данный адрес в DUMP’е.

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

Видим похожие элементы, каждый из которых соответствует какой-то форме (FORM). Двадцать четвёртый байт каждого из этих элементов – это порядок, в котором формы должны появляться. Смотрим:

`40440c + 24=404430`

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

Здесь находится 00, то есть эта форма будет появляться первой, а 01 означает, что это вторая, так что можем изменить порядок.

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

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

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

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

К этой главе прилагаются два крэкми – один простой [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/27/CrackMe.7z) (для запуска крэкми понадобиться MSVBVM50.dll [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/27/MSVBVM50.7z))\* и один посложнее [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/27/CrackMe2.7z), посмотрите, сможете ли вы найти серийные номера, избавиться от наг-окон и так далее. В следующей главе мы их решим.

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