Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Распаковка Beria 0.07

Обсудить статью на форуме

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: kR01eG <netu@ego>

"Кому Ларик, а кому Лаврентий Павлович..."(c)фольклор

Инструменты: OllyDebug, PE Tools, ImpRec

http://www.tuts4you.com/blogs/download.php?view.921

Позавчера в мои руки попал unpackme с tuts4you.com. Запакован он был Beria 0.07 by symbiont, что подтвердила PEiD. Похоже, этот протектор бородатый как минимум полгода, т.е. возраст моих баз.
В архиве лежали файлы, запакованные с различными возможностями Берии. Причем Unpackme_IAT при запуске вылетел с матом =)) Ладно, вон файлик UnpackmeAll лежит, посмотрим всю мощь протектора.
Что же нас поджидает в лице (т.е. содержимом) этого файла? А вот:
Создание дочернего процесса аля армадилло от силиконовых друзей
Убойное восстановление импорта с динамической подгрузкой.
Больше ничего существенного...

Ну как? Внушает? Меня тоже внушало, пока я одну вещь не понял.. ладно, поехали.
Процесс в венде создается функциями CreateProcess*. В нашем случае - CreateProcessA. Как узнал? Элементарно! Слегка прокрутил по PageDown вниз от EP.

Вот он, ненаглядный =)


004017C4  |.  68 C0434000   PUSH    Beriav0_.004043C0                ; /pProcessInfo = Beriav0_.004043C0
004017C9  |.  68 A8404000   PUSH    Beriav0_.004040A8                ; |pStartupInfo = Beriav0_.004040A8
004017CE  |.  55            PUSH    EBP                              ; |CurrentDir
004017CF  |.  55            PUSH    EBP                              ; |pEnvironment
004017D0  |.  8BD0          MOV     EDX,EAX                          ; |
004017D2  |.  68 22000004   PUSH    4000022                          ; |CreationFlags
004017D7  |.  33C0          XOR     EAX,EAX                          ; |
004017D9  |.  55            PUSH    EBP                              ; |InheritHandles
004017DA  |.  55            PUSH    EBP                              ; |pThreadSecurity
004017DB  |.  B9 11000000   MOV     ECX,11                           ; |
004017E0  |.  BF A8404000   MOV     EDI,Beriav0_.004040A8            ; |
004017E5  |.  F3:AB         REP     STOS DWORD PTR ES:[EDI]          ; |
004017E7  |.  A3 C0434000   MOV     DWORD PTR DS:[4043C0],EAX        ; |
004017EC  |.  55            PUSH    EBP                              ; |pProcessSecurity
004017ED  |.  A3 C4434000   MOV     DWORD PTR DS:[4043C4],EAX        ; |
004017F2  |.  52            PUSH    EDX                              ; |CommandLine
004017F3  |.  BE 01000000   MOV     ESI,1                            ; |
004017F8  |.  A3 C8434000   MOV     DWORD PTR DS:[4043C8],EAX        ; |
004017FD  |.  55            PUSH    EBP                              ; |ModuleFileName
004017FE  |.  8915 A0404000 MOV     DWORD PTR DS:[4040A0],EDX        ; |
00401804  |.  C705 A8404000>MOV     DWORD PTR DS:[4040A8],44         ; |
0040180E  |.  8935 D4404000 MOV     DWORD PTR DS:[4040D4],ESI        ; |
00401814  |.  66:8935 D8404>MOV     WORD PTR DS:[4040D8],SI          ; |
0040181B  |.  A3 CC434000   MOV     DWORD PTR DS:[4043CC],EAX        ; |
00401820  |.  FF15 20304000 CALL    NEAR DWORD PTR DS:[<&KERNEL32.Cr>; CreateProcessA


Далее идет пара WriteProcessMemory, а затем нас поджидает кусок пирожка, который на полке:


......
00401975  |. |A1 40404000   |MOV     EAX,DWORD PTR DS:[404040]
0040197A  |. |48            |DEC     EAX
0040197B  |. |83F8 06       |CMP     EAX,6                           ;  DEBUG_EVENT > 7 - out
0040197E  |. |0F87 81000000 |JA      Beriav0_.00401A05
00401984  |. |FF2485 B81A40>|JMP     NEAR DWORD PTR DS:[EAX*4+401AB8]
0040198B  |> |392D 0C444000 |CMP     DWORD PTR DS:[40440C],EBP       ;  On Create Process
00401991  |. |75 72         |JNZ     SHORT Beriav0_.00401A05
00401993  |. |8B0D 1C404000 |MOV     ECX,DWORD PTR DS:[40401C]
00401999  |. |8B15 C0434000 |MOV     EDX,DWORD PTR DS:[4043C0]
0040199F  |. |8D4424 24     |LEA     EAX,DWORD PTR SS:[ESP+24]
004019A3  |. |50            |PUSH    EAX                             ; /pBytesWritten
004019A4  |. |6A 01         |PUSH    1                               ; |BytesToWrite = 1
004019A6  |. |68 50304000   |PUSH    Beriav0_.00403050               ; |Buffer = Beriav0_.00403050
004019AB  |. |51            |PUSH    ECX                             ; |Address => 401660
004019AC  |. |52            |PUSH    EDX                             ; |hProcess => NULL
004019AD  |. |FF15 44304000 |CALL    NEAR DWORD PTR DS:[<&KERNEL32.W>; WriteProcessMemory
......
004019CF  |> |892D DC434000 |MOV     DWORD PTR DS:[4043DC],EBP       ;  On ExitProcess
004019D5  |. |EB 2E         |JMP     SHORT Beriav0_.00401A05
......
00401A19  |> |392D DC434000 |CMP     DWORD PTR DS:[4043DC],EBP
00401A1F  |.^F85 3FFFFFFF JNZ     Beriav0_.00401964


Здесь я выделил одну из главных строчек всей этой байды. Она обращается к таблице:


00401AB8   . B5194000      DD      Beriav0_.004019B5                       ;  EXCEPTION_DEBUG_EVENT
00401ABC   .  051A4000      DD      Beriav0_.00401A05                       ;  CREATE_THREAD_DEBUG_EVENT - unused
00401AC0   .  8B194000      DD      Beriav0_.0040198B                       ;  CREATE_PROCESS_DEBUG_EVENT
00401AC4   .  051A4000      DD      Beriav0_.00401A05                       ;  EXIT_THREAD_DEBUG_EVENT - unused
00401AC8   .  CF194000      DD      Beriav0_.004019CF                       ;  EXIT_PROCESS_DEBUG_EVENT
00401ACC   .  051A4000      DD      Beriav0_.00401A05                       ;  LOAD_DLL_DEBUG_EVENT - unused
00401AD0   .  051A4000      DD      Beriav0_.00401A05                       ;  UNLOAD_DLL_DEBUG_EVENT - unused


То, что я закомментировал как unused - ведет прямиком к ContinueDebugEvent, т.е. нас никуда не ведет :) А вот оставшиеся служат для того, чтоб отмечать следующие знаменательные события дочки, объясняю сверху вниз:

Отладочные события, происходящие в дочернем процессе, такие как попадание на INT3, ACCESS VIOLATION и др.
Создание дочернего процесса
Выход


Значит когда процесс создан, он заморожен и ожидает своей участи. При создании процесса в EP пишется INT3, чтоб потом на нем прерваться и сделать с дочкой что-то нехорошее..

Вот эти штуки

004019B3  |. |EB 50         |JMP     SHORT Beriav0_.00401A05
004019B5  |> |A1 4C404000   |MOV     EAX,DWORD PTR DS:[40404C]       ;  0N eXcEpTi0N; Case 1 of switch 0040197A
004019BA  |. |3D 01000080   |CMP     EAX,80000001                    ;  STATUS_GUARD_PAGE_VIOLATION
004019BF  |. |74 32         |JE      SHORT Beriav0_.004019F3
004019C1  |. |3D 03000080   |CMP     EAX,80000003                    ;  EXCEPTION_BREAKPOINT
004019C6  |. |74 0F         |JE      SHORT Beriav0_.004019D7
004019C8  |. |3D 050000C0   |CMP     EAX,C0000005                    ;  EXCEPTION_ACCESS_VIOLATION
004019CD  |. |75 36         |JNZ     SHORT Beriav0_.00401A05

управляют жизнедеятельностью процесса. Процедур там немного, думаю сами разберетесь что к чему. На EXCEPTION_BREAKPOINT создается импорт, причем бряк этот проходится туеву хучу раз. На STATUS_GUARD_PAGE_VIOLATION подгружаются нужные куски кода. Ну а после EXCEPTION_ACCESS_VIOLATION идет выход из процесса без шума и мата.
Сюжет вкратце ясен, перейдем к практческим занятиям. Все помнят что надо делать? Остановиться на OEP и дампануть, потом прикрутить импорт. Но так как работаем мы с дебагером, наши планы немного меняются. Итак, надо:
Остановиться на том месте, где процесс готов к употреблению, и сдампить.
Прикрутить импорт.


Начнем с импорта, раз уж он так такой динамический. Тормознем на EXCEPTION_BREAKPOINT. Он ведет нас сюда:

004019E9  |.  E8 F2000000   |CALL    Beriav0_.00401AE0


и потом


00401AE0  /$  8B0D A4404000 MOV     ECX,DWORD PTR DS:[4040A4]
00401AE6  |.  8B51 0C       MOV     EDX,DWORD PTR DS:[ECX+C]
00401AE9  |.  8B52 04       MOV     EDX,DWORD PTR DS:[EDX+4]
00401AEC  |.  83EC 10       SUB     ESP,10
00401AEF  |.  53            PUSH    EBX
00401AF0  |.  56            PUSH    ESI
00401AF1  |.  8BF0          MOV     ESI,EAX
00401AF3  |.  33C0          XOR     EAX,EAX
00401AF5  |.  85D2          TEST    EDX,EDX
00401AF7  |.  57            PUSH    EDI
00401AF8  |.  76 2F         JBE     SHORT Beriav0_.00401B29
00401AFA  |.  8B49 14       MOV     ECX,DWORD PTR DS:[ECX+14]
00401AFD  |.  83C1 54       ADD     ECX,54
00401B00  |>  8B7C24 20     /MOV     EDI,DWORD PTR SS:[ESP+20]
00401B04  |.  3B39          |CMP     EDI,DWORD PTR DS:[ECX]
00401B06  |.  74 0A         |JE      SHORT Beriav0_.00401B12                ;  found import
00401B08  |.  40            |INC     EAX
00401B09  |.  83C1 58       |ADD     ECX,58
00401B0C  |.  3BC2          |CMP     EAX,EDX
00401B0E  |.^ 72 F0         JB      SHORT Beriav0_.00401B00
00401B10  |.  EB 1B         JMP     SHORT Beriav0_.00401B2D                 ;  not found import - found code :)


Ставим бряк на выделенную строчку и идем на :d ecx. Прокручиваем чуть вверх, и видим:

00146C74  D9 07 18 00 4B 45 52 4E 45 4C 33 32 2E 44 4C 4C  Щ.KERNEL32.DLL
00146C84  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146C94  00 00 00 00 00 00 00 00 13 00 00 00 63 6F 6D 64  ...........comd
00146CA4  6C 67 33 32 2E 64 6C 6C 00 01 00 00 00 00 00 00  lg32.dll.......
00146CB4  00 00 00 00 00 00 00 00 00 00 00 00 13 00 00 00  ...............
00146CC4  01 00 00 00 47 44 49 33 32 2E 64 6C 6C 00 00 00  ...GDI32.dll...
00146CD4  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146CE4  00 00 00 00 14 00 00 00 0E 00 00 00 4D 53 56 43  ..........MSVC
00146CF4  52 54 2E 64 6C 6C 00 00 00 00 00 00 00 00 00 00  RT.dll..........
00146D04  00 00 00 00 00 00 00 00 00 00 00 00 22 00 00 00  ............"...
00146D14  0E 00 00 00 55 53 45 52 33 32 2E 64 6C 6C 00 00  ...USER32.dll..
00146D24  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146D34  00 00 00 00 30 00 00 00 0F 00 00 00 57 49 4E 4D  ....0......WINM
00146D44  4D 2E 64 6C 6C 00 00 00 00 00 00 00 00 00 00 00  M.dll...........

Кто-нибудь скажет мне, что это такое? :)) Это импортируемые DLL. Просто? Еще бы! Теперь найдем сам импорт, он ниже.

00146D78                          55 6E 6D 61 70 56 69 65          UnmapVie
00146D88  77 4F 66 46 69 6C 65 00 50 41 43 4B 7E 33 2E 45  wOfFile.PACK~3.E
00146D98  58 45 00 00 34 00 03 00 04 00 EF BE 0A 33 5C 71  XE..4...пѕ.3q
00146DA8  0A 33 09 86 14 00 00 00 55 00 6E 00 50 00 61 00  .3.....U.n.P.a.
00146DB8  63 00 6B 00 4D 00 65 00 5F 00 61 00 01 00 00 00  c.k.M.e._.a....
00146DC8  23 00 00 00 00 00 00 00 3C 50 00 00 00 00 35 00  #.......&lt;P....5.
00146DD8  4D 61 70 56 69 65 77 4F 66 46 69 6C 65 00 00 00  MapViewOfFile...
00146DE8  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146DF8  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146E08  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146E18  00 00 00 00 01 00 00 00 23 00 00 00 00 00 00 00  .......#.......
00146E28  40 50 00 00 01 00 35 00 53 6C 65 65 70 00 00 00  @P...5.Sleep...
00146E38  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146E48  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146E58  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146E68  00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00  ...............
00146E78  23 00 00 00 00 00 00 00 44 50 00 00 02 00 35 00  #.......DP...5.
00146E88  43 72 65 61 74 65 46 69 6C 65 4D 61 70 70 69 6E  CreateFileMappin
00146E98  67 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00  gA..............
00146EA8  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146EB8  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146EC8  00 00 00 00 01 00 00 00 23 00 00 00 00 00 00 00  .......#.......
00146ED8  48 50 00 00 03 00 35 00 47 65 74 46 69 6C 65 53  HP...5.GetFileS
00146EE8  69 7A 65 00 00 00 00 00 00 00 00 00 00 00 00 00  ize.............
00146EF8  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146F08  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00146F18  00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00  ...............
00146F28  23 00 00 00 00 00 00 00 4C 50 00 00 04 00 35 00  #.......LP...5.
00146F38  43 6F 70 79 46 69 6C 65 41 00 00 00 00 00 00 00  CopyFileA.......
..................
..................
..................
00148534              77 61 76 65 4F 75 74 50 72 65 70 61      waveOutPrepa
00148544  72 65 48 65 61 64 65 72 00 00 00 00 00 00 00 00  reHeader........
00148554  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00148564  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00148574  00 00 00 00 00 00 00 00 05 00 00 00 23 00 00 00  ...........#...
00148584  00 00 00 00 20 51 00 00 45 00 35 00 AB AB AB AB  .... Q..E.5.««««
00148594  AB AB AB AB 00 00 00 00 00 00 00 00              ««««........

Конец здесь. Теперь залезем в PE Tools и сдампим эту таблицу так, на всякий случай.
Начало: 00146C74
Размер: 148594 - 146C74 = 1920
И не забудьте выбрать именно РОДИТЕЛЬСКИЙ ПРОЦЕСС!

Теперь слегка разберемся с ее структурой.
Ясен пень, поле таблицы расположено между двумя началами названий функций.
Значит из набора байт мы можем выделить название функции и ее Thunk. Догадался я методом сравнения :)
Название - ясно где. А вот Thunk расположен как word по смещению 50h относительно начала поля. Они выделены жирным выше.
Не забыли еще Калашникова? Слова расположены от младшего байта к старшему, так что 20 51 означает (word) 5120h. Запомним это на будущее.
С импортом разобрались, теперь ищем такое место, где можно брякнуться и сдампить дочерний процесс. А почему бы не использовать переход по STATUS_GUARD_PAGE_VIOLATION? Disable-им остальные бряки, ставим бряк сюда и пускаем процесс (попутно смотрим на дочерний процесс в PE Tools - все DLL подгружены):

004019F3  |> 8B15 64404000 |MOV     EDX,DWORD PTR DS:[404064]              ;  Beriav0_.00401000

Вот и наш OEP :) Проходим по CALL, проходим по ContinueDebugEvent, по WaitDebugEvent (чтобы код и табличка записались в память). Радостно лезем в ImpREC, вбиваем 1000 в "OEP", жмем "IAT AutoSearch", находим, и... и 22 unresolved pointers :/ А что нам-кабанам, открываем нашу сдампленную раньше табличку импорта и усердно и внимательно вбиваем все названия функций по соответствующим Thunk-ам. Кстати, названия функций идут последовательно по возрастанию величины Thunk, так что проблем возникнуть не должно. Просто ищем следующее значение Thunk-а и вбиваем следующую функцию.
Это и есть так называемая динамическая подгрузка. Была бы табличка слегка более защищенной... в общем-то тоже расковыряли бы, но чуть позже.
Так, все нашли, последняя осталась: GetOpenFileNameA, из comdlg32.dll. А вот здесь нас поджидает еще один кусок, но уже не тот %)) Она не подгружена процессом, так что импрек показывает нам... не показывает нам comdlg32.dll в списке модулей :) ТАк что жмем Save Tree, и сохраняем наше дерево в текстовик. Откроем и перепишем ручками функцию:

FThunk: 00005128	NbFunc: 00000001
1	00005128	comdlg32.dll	006E	GetOpenFileNameA

Теперь Load Tree и наслаждаемся :)
Все это можно было бы и автоматизировать, но лень мне :) А еще говорят, лень - двигатель прогресса...
Проходим дальше в надежде попасть на ContinueDebugEvent, что скажет нам о том, что процесс готов к употреблению. Но попадаем бы опять на переход по STATUS_GUARD_PAGE_VIOLATION.

004019F3  |> 8B15 64404000 |MOV     EDX,DWORD PTR DS:[404064]              ;  Beriav0_.0040506C

мда, теперь банановый... Ладно, ставим сюда бряк и жмем F9. Опять попали. И так несколько раз. В принципе, легко поймать последний такой бряк и сдампить перед проходом по нему. Чтобы упростить вам жизнь, скажу сразу, что последний вот:

004019F3  |> 8B15 64404000 |MOV     EDX,DWORD PTR DS:[404064]              ;  Beriav0_.00409054
.................... Info
DS:[00404064]=00409054 (Beriav0_.00409054), ASCII "File"

Когда вы на него попадете, можно смело дампить дочку и восстанавливать импорт.

THE END :)

зы. ногами не бить :)



Обсуждение статьи: Распаковка Beria 0.07 >>>


Комментарии к статье: Распаковка Beria 0.07


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS