> For the complete documentation index, see [llms.txt](https://backoftut.gitbook.io/intro-cracking-with-ollydbg-2/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-2/ch-20.md).

# Глава 20

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

Если перейдём в DEBUGGING OPTIONS-SECURITY:

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvbvruiBL5QZDxN9%2F1.png?generation=1566513585787743\&alt=media)

Здесь находится три галочки. Если мы их все отметим, то увидим, что установив BPX на API-функцию, и если переинициализируем OllyDbg (Restart), то BPX останутся установленными, что позволяет нам избежать повторение всего процесса каждый раз, когда мы делаем рестарт.

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvc79KnJ9Oe3uzHS%2F2.png?generation=1566513553066989\&alt=media)

Именно так, как мне кажется, без особых проблем и хлопот, мы и начинаем изучение темы антиотладки по имени процесса.

Обнаружение OllyDbg по имени процесса

Запустив OllyDbg, мы можем посмотреть список процессов с помощью CTRL + ALT + SUPR.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvcMCHCDJZ_9pXAt%2F3.png?generation=1566513551291513\&alt=media)

Видим, что имя процесса находится среди остальных, что позволяет программе пробежаться по их списку, и если она встретит называющийся OllyDbg, она закрывается, оставив противника ни с чем, ха-ха!

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

Приложенный к статье крэкми называется DAXXOR [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/tree/3679d233f4d394747f712e9b6b09bc9c2a3cad80/.gitbook/assets/files/20/daxxor.7z). Если запустим его и OllyDbg по отдельности, то увидим, что крэкми запускается, но закрывает отладчик, а если загрузим программу в OllyDbg, то закроются оба.

Изучим, как это происходит. Откроем крэкми в OllyDbg.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvccFmWfq9IH-OJT%2F4.png?generation=1566513549490085\&alt=media)

Оказавшись в точке входа, посмотрим, какие API-функции используются.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvcki1OKF68VJbeP%2F5.png?generation=1566513555837178\&alt=media)

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

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvcsEg-tlEiqzwDF%2F6.png?generation=1566513557273465\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvcznIXXBSR0v-Ea%2F7.png?generation=1566513553976641\&alt=media)

И делаем RUN.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvd861TSiKlWVd0z%2F8.png?generation=1566513551400286\&alt=media)

Каждый раз, останавливаясь на ней, видим, что именно запрашивается, в данном случае первой запрашивается функция \_\_CPPdebugHook, не связанная с защитой, которую мы изучаем, поэтому снова жмём RUN.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvdHwHYu_V995k8H%2F9.png?generation=1566513554109053\&alt=media)

Таким образом, с помощью F9 доходим до API-функций, относящихся к защите. Здесь видим, что используется функция EnumProcesses, так что после того, как дойдём до RET в GetProcAddress, в EAX будет возвращен адрес функции, действительный для конкретной машины, и туда мы установим BPX, после чего выполним RET с помощью EXECUTE TILL RETURN.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvdUnhbE_2EQ5FCx%2F10.png?generation=1566513554036570\&alt=media)

Здесь в EAX возвращается адрес указанной функции для конкретной машины, в моём случае это 76BB3A9A (он может отличаться у вас).

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvdb84bUIuMP8BBb%2F11.png?generation=1566513555333384\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvdnXt9iuyFVOxVs%2F12.png?generation=1566513554440491\&alt=media)

Вот она установилась.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvdvfx1AvLb0OGrg%2F13.png?generation=1566513551465027\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTve0TkbfGxYHNWbI%2F14.png?generation=1566513557229247\&alt=media)

Хм, перебираются модули процесса, дойдём до RET и установим BPX на адрес, который будет возвращён в EAX.

Чтобы много не печатать, то находясь на RET, можем сделать так:

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTve6VYCUL_UhEnzs%2F15.png?generation=1566513554556896\&alt=media)

Так я устанавливаю BPX на все API-функции, когда нахожусь на RET.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTveCI67FffJE6HTL%2F16.png?generation=1566513551118964\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTveJUv0ifSR71GyD%2F17.png?generation=1566513554908443\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvePIE6osTcjfVJZ%2F18.png?generation=1566513561298569\&alt=media)

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTveWKQIFiwoDJVmN%2F19.png?generation=1566513552117864\&alt=media)

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTveftueVNBwSXcIi%2F20.png?generation=1566513559297091\&alt=media)

Все эти функции, загруженные программой, не были увидены OllyDbg и не были отражены в списке, также она не даёт по ним какую-либо информацию.

Поищем в гугле, что это за функция "EnumProcess".

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTveowBTi1pQ2KthH%2F21.png?generation=1566513551849811\&alt=media)

Находим её на сайте Микрософта, адрес страницы:

<http://msdn2.microsoft.com/en-us/library/ms682629.aspx>

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTveynW-8nffSh7C0%2F22.png?generation=1566513551502107\&alt=media)

Хорошо, здесь говорится, что вышеупомянутая функция возвращает нам идентификатор или PID каждого запущенного процесса, ок, рассмотрим что такое этот PID, хе-хе.

Каждому запущенному процессу присвоен идентификатор – число, меняющееся каждый раз при запуске процесса. Посмотрим на список процессов.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvf7x1Iuy3eY7EyK%2F23.png?generation=1566513555382662\&alt=media)

Видим, что в данном случае OllyDbg присвоен PID 724 – в десятеричной системе счисления, так как программа просмотра процессов работает именно с ней. Переведём вышеуказанное число в шестнадцатиричную систему с помощью калькулятора Windows.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvfEJNHpOiwbUf-j%2F24.png?generation=1566513551156505\&alt=media)

Нажимаем на кнопку HEX, чтобы перейди в шестнадцатеричную систему.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvfJBkEqOcTNbgEt%2F25.png?generation=1566513553226355\&alt=media)

PID OllyDbg в шестнадцатеричной системе равен 2D4. Можем закрыть и запустить по новой OllyDbg, и увидим, что PID изменился. Каждый раз, когда процесс запускается заново – PID меняется.

Также нам не повезло с отображением параметров функции, так как для OllyDbg она не существует.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvfPEKhX8Ay05nUM%2F26.png?generation=1566513556747248\&alt=media)

Из страницы на сайте Микрософта, знаем, что у неё три параметра.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvfXSzyeDWUtSeKL%2F27.png?generation=1566513556428853\&alt=media)

То есть в 12EDE4 сохраняется список PID’ов всех процессов, запущенных на моей машине, делаем EXECUTE TILL RETURN, чтобы вернуться из API-функции и смотрим через DUMP, что там лежит.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvfehd3Gmbb7uasq%2F28.png?generation=1566513553246952\&alt=media)

Там находится список PID’ов, а среди них и PID OllyDbg, хнык, хнык.

Ставим здесь BPM ON ACCESS, чтобы посмотреть, где он используется.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvfkUVxnwwlt91Az%2F29.png?generation=1566513549124912\&alt=media)

Теперь делаем RUN.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvg-x74IRrJfVOFv%2F30.png?generation=1566513553662995\&alt=media)

Видим, что остановились там, где будет применена функция OpenProcess, которая проверяет, работает ли процесс, и если да, то возвращает его хэндл (логический номер).

Какая разница между PID и хэндлом? Это очень просто – PID – это общий идентификатор – на всей машине, в какой угодно программе PID OllyDbg остаётся одним и тем же, пока процесс не будет перезапущена, в моём случае это 2d4, а хэндл – это номер, который позволяет позволяет вашей программе управлять процессом и который будет отличаться в другой программе. Это своего рода заявка на контролирование процесса, без номера не сможете им управлять, а чтобы получить номер, нужно попросить систему, которая вернёт вам хэндл. Тогда сможете и управлять и подстроить какую-нибудь гадость, хе-хе.

Вот более подробное определение OpenProcess в WinApis32, у неё тоже много параметров, но нам они не интересны.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvg8O9cXRE9L-IXY%2F31.png?generation=1566513558487802\&alt=media)

То есть возвращается логический номер исполняющегося процесса, коротко говоря, это то, что программа в данном случае и хочет узнать.

Трассируем с помощью F8, пока не остановимся на API-функции.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvgFLfzHlxONp0_L%2F32.png?generation=1566513555758255\&alt=media)

В EAX возвращается логический номер OllyDbg, который в моём случае равен 58.

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvgNZvcuwiGF8ou8%2F33.png?generation=1566513551411283\&alt=media)

Видим, что здесь есть 58 и TYPE или тип является PROCESS, т.е. процесс, таким образом, у программы есть логический номер 58, действительный в процессе OllyDbg.

Если другой процесс использует EnumProcess, чтобы получить PID, то для OllyDbg, если она не будет перезапущена, он будет равен 2d4, а если потом попросить логический номер данного процесса, то он будет каким-нибудь другим, так как хэндлы для каждого процесса, их запрашивающих, уникальны.

В данном случае, опасность для OllyDbg заключается в том, что у программы уже есть логический номер, с которым она может делать всё, что хочет. Хотя она и не знает, что выполняется из под OllyDbg, она может проверить имя процесса, чтобы определить, не называется ли он OllyDbg, и очевидно, что для этого будут перебираться все PID’ы, полученные в списке процессов, поэтому бросаем всё и отправляемся туда, где это будет происходить, для чего установим BPM ON ACCESS на соответствующий PID.

Продолжаем трассировать с помощью F8.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvgVW0JI-n3Te2w0%2F34.png?generation=1566513551413104\&alt=media)

Дошли до ещё одной API-функции, которую от нас пытались скрыть, – EnumProcessModules. Посмотрим её описание на том же сайте, что и ранее.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvg_jEaxU0CiA9Td%2F35.png?generation=1566513554392393\&alt=media)

То есть будет проводиться поиск в исследуемом процессе, получаем список модулей, используемых им. Продолжаем трассировать с помощью F7.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvgfWfQJTnV5QyUE%2F36.png?generation=1566513551300372\&alt=media)

В стеке видим параметры:

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvglbehnsVHHHe45%2F37.png?generation=1566513552257528\&alt=media)

Список хэндлов всех модулей сохранён по выделенному адресу, а первым параметром, как мы видим, является логический номер процесса OllyDbg.

Здесь нужно прояснить одну вещь: когда запрашиваем логические номера модулей, система возвращает нам адресную базу или откуда начинается указанный процесс в памяти. В данном случае нам было возвращёно 400000, так как именного отсюда начинается процесс OllyDbg.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvgqsofR_HOK0f0I%2F38.png?generation=1566513551230691\&alt=media)

Продолжаем трассировать и находим ещё одну API-функцию.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvgxwWx-v203LEEd%2F39.png?generation=1566513554050541\&alt=media)

GetModuleBaseNameA

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvh6nzR6vNaXvZmX%2F40.png?generation=1566513555446964\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvhEAWl_NZkMxIIg%2F41.png?generation=1566513561284946\&alt=media)

В стеке следующие параметры:

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvhPjK92UyfIm4Al%2F42.png?generation=1566513555544918\&alt=media)

58 – это логический номер OllyDbg, 400000 – это база главного модуля, а буфер располагается по адресу 12ECE0, так что смотрим эту область памяти через дамп.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvhYxU55uyvNmX7M%2F43.png?generation=1566513551038477\&alt=media)

Хе-хе, уже понятно, что эта операция будет проведена для каждого процесса, который запущен в машине, чтобы узнать, не является ли его именем ‘OLLYDBG.exe’.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvhg7Y66zEnfwGor%2F44.png?generation=1566513578123114\&alt=media)

Доходим до CloseHandle, где закрывается логический номер, то есть 58 исчезает из их списка.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvhq0EMOKaaY5i5H%2F45.png?generation=1566513551615937\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvhxQw7RIQ96JW-Q%2F46.png?generation=1566513555044583\&alt=media)

Дошли до CALL, входим в него, нажав F7.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvi2acXQjK7S1O2l%2F47.png?generation=1566513552459098\&alt=media)

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvi8SRdlMPi9KpyE%2F48.png?generation=1566513552534648\&alt=media)

Здесь считывается первая буква "OLLYDBG" (4F) и помещается в стек с помощью PUSH, затем идёт новый CALL, в который мы также заходим.

Видим, что в этом вызове не происходит ничего особенно важного, поэтому выходим и оказываемся рядом со следующим CALL'ом.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTviGiEPkoV5q3DDr%2F49.png?generation=1566513573210418\&alt=media)

Заходим в него.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTviP4G1hfiy9UuFB%2F50.png?generation=1566513557561713\&alt=media)

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTviZANR21CMk1vfX%2F51.png?generation=1566513556966301\&alt=media)

Ах, где-то здесь сравнивается полученное имя процесса с ‘OLLYDBG.EXE’, и если они равны, то всё, капут.. хе-хе, сейчас они равны, посмотрим, что случится. Возвращаемся через RET.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTviixWPGK1n283qg%2F52.png?generation=1566513549259395\&alt=media)

Если бы они не были равны, то EAX должен был бы отличаться от нуля, и был бы совершён переход, чего не происходит, если EAX равен нулю, как в данном случае.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTviru5jbK8xdzvuZ%2F53.png?generation=1566513556413342\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvj-U8IDJmaqhb6N%2F54.png?generation=1566513601128193\&alt=media)

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvjAxkoWqGY5Dkq_%2F55.png?generation=1566513551775302\&alt=media)

Если выполним с помощью F8.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvjI-Z3hznkpeBH7%2F56.png?generation=1566513551428327\&alt=media)

Система возвращает номер 58, так что продолжаем.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvjNCq0uoisdmOfw%2F57.png?generation=1566513549135499\&alt=media)

Как видим, API-функция TerminateProcess, которой передаётся логический номер 58, служит для того, чтобы убить OllyDbg.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvjTfr6QI5ztFJSM%2F58.png?generation=1566513558381680\&alt=media)

И по нажатию F8 – до свиданья, Олли. Всё закрывается. Вот так мы и исследовали, как работает обнаружение по имени.

Ладно, я слегка устал от роли убийцы, хе-хе, перезапускаем OllyDbg и устанавливаем BP на OpenProcess.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvjaWnNoZc2rIPIp%2F59.png?generation=1566513550635848\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvjhySp-G4Me3fd4%2F60.png?generation=1566513554515027\&alt=media)

Вот так, теперь эта API-функция всегда возвращает ноль. Теперь убираем все точки останова, и так как программа генерирует кучу исключений, то, хотя мы ещё и не рассматривали данную тему, чтобы она нормально выполнялась, отметим все опции в DEBUGGING OPTIONS-EXCEPTION следующим образом:

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvjo6AAwdQh63YEr%2F61.png?generation=1566513555052033\&alt=media)

Пока что просто отметьте все опции, чтобы программы перепрыгивала через все исключения, так как их очень много (для прохождения через них надо нажимать SHIFT+F9, а вышеуказанная конфигурация позволяет миновать их автоматически). Делаем RUN.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvjyFC5b0M0cBpcc%2F62.png?generation=1566513551676625\&alt=media)

И вот она выполняется без проблем, но вот ещё, что можно сделать:

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvk7PRCon_SzpIDi%2F63.png?generation=1566513557542509\&alt=media)

Меняем JNZ на JMP, чтобы избежать выполнения кода защиты.

Программа запускается и показывает нам окно, которое исчезает после нажатия на TRY.

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvkG7wTJC_WZRFAi%2F64.png?generation=1566513552553290\&alt=media)

Выскакивает сообщение об ошибке. Прекрасно, потому что это говорит о том, что защита против отладки была побеждена.

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvkOoipaEnJfv20n%2F65.png?generation=1566513553285742\&alt=media)

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

![](https://416819976-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjyqT34OedPJiOdIrDw%2F-LmvTfhKwMHzvDz9duQT%2F-LmvTvkXIvKvc-AvIsNH%2F66.png?generation=1566513558190293\&alt=media)

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

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