> For the complete documentation index, see [llms.txt](https://backoftut.gitbook.io/intro-cracking-with-ollydbg/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://backoftut.gitbook.io/intro-cracking-with-ollydbg/ch-24.md).

# Глава 24

Мне попросили, чтобы прежде, чем начинать рассказ об исключениях, я рассказал о том, как запустить в OllyDbg крэкми "antisocial" [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/23/antisocial1.7z), которое было приложено к предыдущей статье.

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

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

Итак, запускаем antisocial в переименованном и пропатченном OllyDbg со всеми доступными плагинами.

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

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

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

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

Запускаем, чтобы посмотреть, до куда дойдёт.

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

Досюда.

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

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

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

То есть, значение наверху стека равно 130000, и если рестартуем программу:

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

Посмотрим секции и увидим, что стек на моей машине идёт с 12c000 до 12ffff, ошибка возникает, потому что стек вышел за пределы своей секции на другую, которая начинается с 130000, а туда-то писать как раз прав и нет.

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

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

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

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

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

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

Смотрим стек.

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

Находимся в правильной секции. Запускается POPAD.

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

Здесь заканчивается секция, так что проблему можно решить, забив POPAD NOP’ами, но вообще, POPAD должен предшествовать PUSHAD, которая сохраняет начальные значения регистров в стек, а этот POPAD тогда будет получать их обратно, поэтому давайте посмотрим, что будет, если заменить POPAD на PUSHAD. Рестартуем программу.

Нажимаем пробел.

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

Пишем PUSHAD.

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

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

Теперь нажимаем RUN и останавливаемся на второй POPAD.

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

Но в этот раз стек в порядке.

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

Поэтому POPAD не выходит за границу секции стека, и мы можем миновать это место с помощью F8.

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

Видим, что всё прошло без проблем.

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

Доходим до PUSH и RET, трассируем и, нажимая на F8, доходим до RET.

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

Хорошо, здесь есть проблема с анализированием.

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

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

Здесь это особенно видно.

Посмотрим, что случится, если сделаем RUN.

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

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

Так как программа завершилась, посмотрим в LOG’е OllyDbg, есть ли там что-нибудь интересное.

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

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

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

Уберём галочки со всех опций, которые относятся к исключениям.

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

Делаем RUN.

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

Останавливаемся на исключении, что отображается в LOG’е.

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

INT68 – одно из немногих исключений, которое OllyDbg не может избежать, но можем забить его NOP’ами.

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

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

С другой стороны, знаем, что могут быть ещё INT68, которые будут мешать, поэтому поищем их и также забьём NOP’ами.

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

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

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

Видим, что нашлось ещё одно исключение, забиваем его NOP’ами.

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

Ищем заново, находим, забиваем NOP’ами.

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

Если нажмём CTRL + L, то продолжим искать то, что искали в последний раз.

Когда ничего больше не находим, делаем RUN.

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

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

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

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

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

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

Как видим, здесь только один плагин. Запускаем OllyDbg.

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

Повторяем операции по замене popad.

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

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

Устанавливаем BPX на POPAd, нажимаем RUN и смотрим куда попадём.

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

Прибываем туда, где распаковывается код программы.

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

Можем забить INT68 или снять галочки с исключений, и каждый раз, останавливаясь на INT68, забивать его NOP’ами, а не идти дальше с помощью SHIFT+F9, как это мы обычно делаем с другими исключениями.

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

Посмотрим, какие API-функции используются в программе, для чего нужно вспомнить следующую настройку:

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

Необходимо отметить её, чтобы отображалась информация о секции, в которой мы сейчас находимся.

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

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

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

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

Жмём RUN.

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

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

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

Здесь нам повстречалась первая странность: API-функция, которая делает снимок состояния всех выполняющихся процессов. Доходим до RET и ставим BP EAX, так как EAX будет содержать адрес функции.

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

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

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

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

Там, где находится BP, оставим комментарий, чтобы не забыть, к какой API-функции это относится.

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

Список продолжается.

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

Ещё что-то похожее на прошлый случай, на всякий случай поставим BP и сюда.

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

Жмём RUN.

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

Ставим BP на неё.

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

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

То же самое.

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

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

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

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

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

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

Видим пустые пробелы (NOP’ы), так что можем сделать EAX равным нулю, до того как его значение будет возвращено.

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

Так мы возвращаем ноль, и у программы нет логического номера, с помощью которого она могла бы обработать снимок или что-то узнать о процессах. Это один способ, а другой состоит в изменении кода самой программы. Выполним неизменённый RET функции.

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

Чуть пониже есть JNZ-переходы, а ещё чуть ниже их – вызов TerminateProcess, который закрывает OllyDbg, и перед которым есть OpenProcess, получающий логический номер программы.

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

Если заменить все JNZ на JMP, можно избежать перехода на TerminateProcess и закрытия OllyDbg.

Первая часть защиты преодолена, теперь переходим ко второй части. Жмём RUN.

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

Забиваем NOP’ами, запускаем выполнение программы, но она всё равно закрывается. Если поставить плагин HideDebugger [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/19/HideDebugger124.7z), который защищает от FindeWindows/EnumWindows, то выполнится нормально, если повторить сделанные до этого шаги.

Место, где происходит закрытие, следующее:

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

Выполняем программу и когда останавливаемся на верхнем вызове,

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

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

Видим, что здесь сравнивается.

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

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

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

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

Этот загадочный переход заменяется на JMP.

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

Избегаем второго CALL, внутри которого находится следующее.

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

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

Конечно, если спросите меня, как найти этот JNZ, то это легко.

Как только прошли первую часть защиты, устанавливаем BPX на PostQuitMessage.

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

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

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

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

Идём в 4532d7, так что стек расскажет, откуда происходит вызов.

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

Конечно, я попробовал изменить JE, стоящий перед PostQuitMessage, на обратный и не смог избежать закрытия окна, так что идём ко втором RETURN TO, который есть в стеке.

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

Он ведёт в 4532СС.

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

Как видим, этот call можно избежать, обратив JNZ, и тогда не будет вызван и PostQuitMessage, и изменив JNZ на JMP видим, что крэкми выполняется без помощи каких-либо плагинов.

К статье приложен распакованный крэкми [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/24/muysocial.7z), выполняющийся под OllyDbg без каких-либо ухищрений. В этом курсе вы не будете учиться распаковке, но если вам интересен этот крэкми, то вы можете использовать приложенный файл, чтобы посмотреть, как он работает. С него уже снята распаковка и внесены необходимые изменения, чтобы он запускался под Олли без плагинов.

До встречи в 25-ой главе, где мы будем изучать исключения.

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