# Глава 57

[Файлы к статье](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/57/\(123\)filesToTutor.zip)

`UNPACKME C:`

Мы продолжаем изучение execryptor на основе unpackmes, unpackme c похож на b, при запуске он сообщит нам, что нейтрализует действие registry monitors и file monitors.

![](/files/bnnq5LEgsqN8ECai7mwG)

Поскольку я не использовал мониторинг файлов или реестра, достаточно выполнить те же действия что и в b, инструкция, где появляется адрес api, на моей машине находится здесь.

> 00486DF7 8B45 F4 **MOV EAX,DWORD PTR SS:\[EBP-C]**
>
> **00486DFA** E8 61670100 CALL 0049D560 ; UnPackMe.0049D560
>
> 00486DFF 5B POP EBX
>
> 00486E00 8B0424 MOV EAX,DWORD PTR SS:\[ESP]
>
> 00486E03 52 PUSH EDX

Следовательно, адрес, где мы должны поместить HARDWARE BPX ON EXECUTION и соответственно изменить скрипт - **00486DFA** .

скрипт станет таким:

```
var tabla
var contenido
mov tabla,460818
start:
cmp tabla,460f28
ja final
cmp [tabla],50000000
ja saltear
mov contenido,[tabla]
cmp contenido,0
je saltear
log contenido
log tabla
mov eip,contenido
bphws 486DFA, "x"
mov [486DFA],0
mov [486DFB],0
cob reparar
run
reparar:
cmp eip,486DFA
jne saltear
log eax
mov [tabla],eax
run
saltear:
add tabla,4
jmp start
final:
ret
```

Не нужно забывать снимать BREAK ON EXECUTE, после прибытия в OEP посредством OLLYBONE, приостанавливать ненужные threads и помещать HE на ZwTerminateProcess, после чего скрипт отремонтирует таблицу и можно будет сделать dump и использовать IMP REC, аналогично b.

`UNPACKME D:`

Теперь перейдем к unpackme d, после запуска он покажет нам защиту, которую имеет:

![](/files/H9YgQZdWM5aWfY5rvzA5)

Debug Message Enabled, то есть в случае обнаружения отладчика будет показано сообщение, hmm, давайте посмотрим, повлияет ли это на наш метод, давайте запустим программу в OLLYDBG, мы прибудем как обычно в SYSTEM BREAKPOINT, там мы удалим BP, которые были размещены OLLY, потом разместим BREAK ON EXECUTE и прибудем в OEP.

![](/files/tnfm9ysfcEjCFIwF6TYZ)

До сих пор отличий нет, давайте посмотрим Threads, чтобы остановить их

![](/files/2ozHoiSLpzuyLmqs7jag)

Пока все аналогично, мы останавливаем все потоки, кроме 2-х

![](/files/kJe6KvP2XLilfiE0Pxyp)

Как и в прошлый раз, я не трогаю поток, выделенный красным и тот, который имеет адрес 270000 на моей машине, все остальные приостанавливаются, далее я найду первый вызов api, находящийся ниже OEP и размещу BPM ON WRITE для него, после чего запущу трассировку OLLY.

![](/files/aY6iezfk6emUQDCsTeUU)

Происходит поимка исключения

![](/files/thlQHEXtIDdj30Q91mfD)

Посмотрим строку трассировки, записывающую адрес api в EAX

![](/files/zzZzyUdkfEonXVAMMgUE)

До сих пор различий нет

> 0046D8DC 8B45 F4 MOV EAX,DWORD PTR SS:\[EBP-C] ; kernel32.GetVersion
>
> **0046D8DF** 8BE5 MOV ESP,EBP

возьмем этот адрес для размещения HE в скрипте, после чего он примет вид:

```
var tabla
var contenido
mov tabla,460818
start:
cmp tabla,460f28
ja final
cmp [tabla],50000000
ja saltear
mov contenido,[tabla]
cmp contenido,0
je saltear
log contenido
log tabla
mov eip,contenido
bphws 46D8DF, "x"
mov [46D8DF],0
mov [46D8DF],0
cob reparar
run
reparar:
cmp eip,46D8DF
jne saltear
log eax
mov [tabla],eax
run
saltear:
add tabla,4
jmp start
final:
ret
```

Хорошо, снова прибываем в OEP, снимаем break on execute, размещаем HE ZwTerminateProcess и смотрим, функционирует ли скрипт.

![](/files/izKLgENA0rGlDz5ISXH7)

Мы видим, что он исправляет всю таблицу, и она совпадает с предыдущими, так что мы переходим к unpackme "e", посмотрим, появится ли что-то новое в нем.

`UNPACKME E:`

![](/files/H2KeDR6opuGdQedLEO3F)

Active Watch Enabled - это то, что нам показывает unpackme "e", когда мы его запускаем, давайте посмотрим, какие отличия он имеет по отношению к предыдущим.

Он также аналогичен предыдущим, следовательно, мы решим его таким же методом, видно, что он распаковывается верно и мы продолжим с "g", поскольку f также не содержит чего-то нового.

`UNPACKME G:`

![](/files/FYTmW6d67aeuzLAWJuqb)

"g", после запуска мы видим что-то, что может оказать на нас воздействие, а именно он сообщает нам что у него присутствует "Anti-Trace Enabled", а мы знаем что нами используется трассировка для поиска места размещения HE ON EXECUTION, и скоро мы узнаем насколько эффективно работает эта защита.

Хорошо, первое отличие, когда я прибываю в system breakpoint и убираю BP, которые размещает OLLYDBG и размещаю BREAK ON EXECUTE, возникают 5 или 6 Single Step Exceptions перед тем, как остановиться на OEP

![](/files/ge02qObcOqXmi9vTvR6I)

![](/files/LwyzrXMUf6ZCOc6LSAGt)

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

![](/files/byKoZO1AY1xDZ4NfTwLx)

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

![](/files/W7ftu90hg100QSRCK1FH)

Мы видим только 2 потока, которые необходимы для выполнения программы, если бы их было больше, мы бы приостановили остальные, хорошо, давайте посмотрим, чем нам грозит этот anti-trace, на всякий случай используем RDTSC, не забываем о том, что в плагине OLLY ADVANCE включены опции ANTI RDTSC и GetTickCount.

![](/files/NA4D8hV6fLHkr1MEIUtc)

И

![](/files/aLHPytoiUWo1NiwaOFOC)

Хорошо, кроме того при использовании ANTI RDTSC вы должны посмотреть, когда загружаете OLLYDBG, довольно часто в нижнем углу, где обычно располагается информация о точках останова на несколько секунд показывается сообщение COULDN'T START THE DRIVER, в этом случае драйвер не был загружен правильно и не будет функционировать, часто это происходит в моем случае после определенного времени использования компьютера.

![](/files/rZHqemuv381a7HNT1D2O)

Я размещаю BPM ON WRITE на адресе, который должен быть исправлен, как обычно мы убираем BREAK ON EXECUTE и запускаем трассировку.

![](/files/e5fYcIlgecAzRGmJzPnl)

Мы здесь.

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

![](/files/avSEltjppLcRe3dbPdT1)

Так что искомая инструкция - **491E68**

> 00491E65 8B45 F4 MOV EAX,DWORD PTR SS:\[EBP-C] ; kernel32.GetVersion
>
> 00**491E68** 8BE5 MOV ESP,EBP

До сих пор не было проблем с трассировкой, по-видимому, RDTSC справился со своей задачей и threads всегда оставались в количестве 2 в моем случае.

![](/files/qksqbItXLyh6mQtWy9Zo)

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

![](/files/cZpgd2aKqZn6WRnNf8iX)

Мы заменяем в скрипте адрес, где размещается HBP ON EXECUTION

```
var tabla
var contenido
mov tabla,460818
start:
cmp tabla,460f28
ja final
cmp [tabla],50000000
ja saltear
mov contenido,[tabla]
cmp contenido,0
je saltear
log contenido
log tabla
mov eip,contenido
bphws 491E68, "x"
mov [491E68],0
mov [491E68],0
cob reparar
run
reparar:
cmp eip,491E68
jne saltear
log eax
mov [tabla],eax
run
saltear:
add tabla,4
jmp start
final:
ret
```

Хорошо, я разместил HE ZwTerminateProcess и запустил скрипт и он отремонтировал всю таблицу

![](/files/nE8Gl1fKWS9hpgDl8Akx)

Разница состоит в том, что в этом случае мы не попадаем в ZwTerminateProcess, но так или иначе таблица исправляется, давайте посмотрим в IMP REC.

![](/files/5YKsmsO6WZTdqcMcXNqo)

![](/files/lInanC2aFsuy3yRVaeZH)

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

```
mov tabla,460818
start:
cmp tabla,460978
ja final
cmp [tabla],50000000
ja saltear
```

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

![](/files/mFYiVZS1xAQqFH8CetRD)

Я вижу, что происходят исключения SINGLE STEP, которых раньше не было, так что я вновь перемещаюсь в OEP и повторяю процесс, но на этот раз я устанавливаю флажок SINGLE STEP, поскольку далее OLLYBONE уже не используется.

![](/files/sbIvol4jOoBJ9ijrLdJo)

Я вновь размещаю HE ZwTerminateProcess и смотрю на первый адрес, с галочкой он ремонтируется верно.

![](/files/uSOSM92TZMajADLo0pGT)

Давайте посмотрим LOG

![](/files/ZhPDlJSTzqODz0970n9l)

Сейчас мы видим исправленные apis и видим, что мы попадаем в ZwTerminateProcess как и раньше, теперь я могу заменить в скрипте конечный адрес и он отремонтирует всю таблицу до конца.

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

![](/files/4B6CTxQeg0oqrAzDGllP)

Починка завершается верно, нажимаем FIX DUMP.

![](/files/tBte23D83CFwtZO36wBS)

Давайте посмотрим, выполняется ли программа

![](/files/Hd8gXZiO9xgqzfycUKmE)

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

До следующей части, где мы увидим 3 завершающих h i и j unpackme серии execryptor и покончим с этой темой (если сможем, хе-хе)

\[C] Рикардо Нарваха, 15.11.06


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://backoftut.gitbook.io/intro-cracking-with-ollydbg/ch-57.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
