Препарируем DotFix NiceProtect

Discussion in 'Реверсинг' started by 0x0c0de, 27 Jul 2007.

  1. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    Исследование DotFix NiceProtect

    [Part I]
    [Intro]
    Начала эту статью писать еще до отпуска.. Сейчас нарыла в недрах винта и решила ее закончить наконец-то=) Начала писать потому, что материала было этому проту катастрофически мало. Скачала протектор, и начала его препарировать…

    * Версия, используемая в этой статье – 2.5 – вм не используется, так как триал(

    [Инструменты]
    OllyDbg – отладчик
    LordPe – дампер
    ImpRec – восстановление импорта
    CFF Explorer – Pe Editor

    [Опции]
    Посмотрим сначала на возможные опции защиты
    *Protect original entry point ; защита оригинальной точки входа
    *Encrypt code section ; шифрация кодовой секции
    *Use anti-tracing ; анти-трассировка
    *Use anti-debug ; анти-отладка
    Здесь, думаю, все понятно

    Также существует два метода защиты
    *Include SEH frames
    *Stolen bytes protection

    Второй случай страшнее и продвинутей, первый – более простая защита.

    [Исследование]
    Распаковка на примере Пасьянс ”Паук” из стандартной поставки форточек.
    Опции защиты – все.
    1.Метод защиты – SEH.

    Интересная функция прота – использование сигнатуры какого-то компилятора или протектора=) Чтобы ввести Peid в замешательство. Например в нашем случае entry point выглядит так

    Code:
     
    01008F00 >  55                         PUSH EBP
    01008F01    8BEC                       MOV EBP,ESP
    01008F03    6A FF                      PUSH -1
    01008F05    68 92240001                PUSH spider.01002492
    01008F0A    68 92240001                PUSH spider.01002492
    01008F0F    64:A1 00000000             MOV EAX,DWORD PTR FS:[0]
    01008F15    50                         PUSH EAX
    01008F16    64:8925 00000000           MOV DWORD PTR FS:[0],ESP
    01008F1D    83C4 10                    ADD ESP,10
    01008F20    B8 00000000                MOV EAX,0
    01008F25    8BE5                       MOV ESP,EBP
    01008F27    5D                         POP EBP
    
    Peid самоуверенно заявляет, что файл ничем не запакован и определяет компилятор - Microsoft Visual C++=) Отлично. Пакер свое дело сделал=)

    [ Нахождение OEP]
    Логично использовать тот факт, что все графические приложения используют в своей работе определенный стандартный набор функций. При нахождении OEP в данном случае нам понадобятся две функции GetModuleHandleA и GetVersionExA. Если не срабатывает на этих функциях – попробуйте поставить бряк на юникод-версии этих функций (GetVersionExW и GetModuleHandleW). Поставили бряки. В Olly Dbg Go-to->Expression-> GetModuleHandleA -> брекпоинт на ret, также поступаем с GetVersion. Брекпоинт сработает несколько раз, нужно дождаться момента, когда адрес возврата будет соответствовать нашей запакованной программе. В данной проге функция-ориентир – как раз GetVersion, а не GetModuleHandle. Сначала я пробовала как раз второй вариант, но не получив результатов начала искать альтернативу. Альтернативой оказалась GetVersion.

    Code:
    01008FB2    6A 60                      PUSH 60
    01008FB4    68 48160001                PUSH spider.01001648
    01008FB9    E8 B2110000                CALL spider.0100A170
    01008FBE    BF 94000000                MOV EDI,94
    01008FC3    8BC7                       MOV EAX,EDI
    01008FC5    E8 06130000                CALL spider.0100A2D0
    01008FCA    8965 E8                    MOV DWORD PTR SS:[EBP-18],ESP
    01008FCD    8BF4                       MOV ESI,ESP
    01008FCF    893E                       MOV DWORD PTR DS:[ESI],EDI
    01008FD1    56                         PUSH ESI
    01008FD2    FF15 58110001              CALL DWORD PTR DS:[1001158]                          ; kernel32.GetVersionExA
    01008FD8    8B4E 10                    MOV ECX,DWORD PTR DS:[ESI+10] ; нажав f7 попали сюда
    
    Типичный start-up. Снимаем дамп. Дамп снимается без проблем – антидамп не предусмотрен. Восстановим импорт. Ввожу OEP 0008FB2-> Iat auto search->Get Import. Все нашлось=) Склеиваю с дампом и все работает на ура. Нда. Работает на ура – а размер гигантский. 5,6 метров! С помощью CFF Explorer отрезаю 5-метровую секцию. Запускаю. Все работает.

    Приступаем ко второму дублю распаковки. Участники те же=)

    2.Метод защиты – Stolen Bytes.
    OEP – находим так же. Только возвращаемся мы в секцию пакера.

    Code:
    015A3FCC   .  6A 60                    PUSH 60
    015A3FCE   .  C74424 FC 48160001       MOV DWORD PTR SS:[ESP-4],spider.01001648
    015A3FD6   .  EB 01                    JMP SHORT spider.015A3FD9
    015A3FD8      E9                       DB E9
    015A3FD9   >  83EC 04                  SUB ESP,4
    015A3FDC   .  68 ED3F5A01              PUSH spider.015A3FED
    015A3FE1   .  EB 01                    JMP SHORT spider.015A3FE4
    015A3FE3      E8                       DB E8
    015A3FE4   >  68 70A10001              PUSH spider.0100A170
    015A3FE9   .  EB 01                    JMP SHORT spider.015A3FEC
    015A3FEB      E8                       DB E8
    015A3FEC   >  C3                       RETN
    015A3FED   .  68 00000094              PUSH 94000000
    015A3FF2   .  5F                       POP EDI
    015A3FF3   .  0FCF                     BSWAP EDI
    015A3FF5   .  8BC7                     MOV EAX,EDI
    015A3FF7   .  68 08405A01              PUSH spider.015A4008
    015A3FFC   .  EB 01                    JMP SHORT spider.015A3FFF
    015A3FFE      E9                       DB E9
    015A3FFF   >  68 D0A20001              PUSH spider.0100A2D0
    015A4004   .  EB 01                    JMP SHORT spider.015A4007
    015A4006      E8                       DB E8
    015A4007   >  C3                       RETN
    015A4008   .  8965 E8                  MOV DWORD PTR SS:[EBP-18],ESP
    015A400B   .  8BF4                     MOV ESI,ESP
    015A400D   .  893E                     MOV DWORD PTR DS:[ESI],EDI
    015A400F   .  897424 FC                MOV DWORD PTR SS:[ESP-4],ESI
    015A4013   .  83EC 04                  SUB ESP,4
    015A4016   .  FF15 58110001            CALL DWORD PTR DS:[<&KERNEL32.GetVersionExA>]        ; \GetVersionExA
    015A401C   .  8B4E 10                  MOV ECX,DWORD PTR DS:[ESI+10] ; возврат сюда
    015A401F   .  890D 6C300101            MOV DWORD PTR DS:[101306C],ECX
    015A4025   .  8B46 04                  MOV EAX,DWORD PTR DS:[ESI+4]
    015A4028   .  A3 78300101              MOV DWORD PTR DS:[1013078],EAX
    015A402D   .  8B56 08                  MOV EDX,DWORD PTR DS:[ESI+8]
    015A4030   .  8915 7C300101            MOV DWORD PTR DS:[101307C],EDX
    015A4036   .  8B76 0C                  MOV ESI,DWORD PTR DS:[ESI+C]
    015A4039   .  81E6 FF7F0000            AND ESI,7FFF
    015A403F   .  9C                       PUSHFD
    015A4040   .  9D                       POPFD
    015A4041   .  8935 70300101            MOV DWORD PTR DS:[1013070],ESI
    015A4047   .  83F9 02                  CMP ECX,2
    015A404A   .  9C                       PUSHFD
    015A404B   .  9D                       POPFD
    015A404C   >  60                       PUSHAD
    015A404D   .  68 03900001              PUSH spider.01009003 ; этот пуш+ следующий рет аналогичны инструкции jmp  01009003
     
    Видно, что oep начинается с инструкции push 60 - так как прога на с++ написана. Проверим, действительно ли это сильно замусоренный стартовый код...
    Посмотрим внимательнее ...

    Code:
    015A3FCE   .  C74424 FC 48160001      MOV DWORD PTR SS:[ESP-4],spider.01001648
    015A3FD6   .  EB 01                    JMP SHORT spider.015A3FD9
    015A3FD8      E9                       DB E9
    015A3FD9   >  83EC 04                  SUB ESP,4
    
    аналогично push 01001648...

    Code:
    015A3FE1   .  EB 01                    JMP SHORT spider.015A3FE4
    015A3FE3      E8                       DB E8
    015A3FE4   >  68 70A10001              PUSH spider.0100A170 
    015A3FE9   .  EB 01                    JMP SHORT spider.015A3FEC
    015A3FEB      E8                       DB E8
    015A3FEC   >  C3                       RETN
    
    Пара инструкций PUSH spider.0100A170 и ret аналогичны инструкции call 0100A170. Так дальше...

    Code:
    015A3FED   .  68 00000094              PUSH 94000000
    015A3FF2   .  5F                       POP EDI
    015A3FF3   .  0FCF                      EDI
    015A3FF5   .  8BC7                     MOV EAX,EDI
    
    Первые две инструкции можно заменить на mov edi,94000000.. Я не помнила, что такое BSWAP, поэтому поставила на инструкцию по адресу 015A3FED New origin here и после выполнения команды в edi оказалось число 94.
    Теперь пора заменить эти инструкции на

    mov edi,94
    mov eax,edi

    Что мы получили теперь

    push 60
    push 01001648
    call 0100A170
    mov edi,94
    mov eax,edi

    Похоже на oep. будем считать что это oep.
    Такс… Много байт притырил себе. И мусора намешал, но это мы обошли, проанализировав код

    Code:
    015A3FE9   .  EB 01                    JMP SHORT spider.015A3FEC
    015A3FEB      E8                       DB E8 ; это чтобы смутить отладчик=) следующие 4 байта будут неверно проанализированы
    
    Восстанавливать не хочется. Да и зачем это надо? Крадет только с OEP байты + все это добро не в выделенной памяти. Значит дампим. Открываем Imprec, пишем oep 05A3FCC и он без проблем определяет все функции. Так что все просто и восстанавливать ни к чему=) Запускаем, все работает=) Можно поизвращаться, позаменять инструкции на альтернативные, а потом вручную восстановить на свое место. Но, учитывая, что прот крадет в среднем 100 байт (в данном случае 81, а неск. других 104 и 95)- это долго.

    [Антиотладка]
    Отключила все плагины для скрытия отладчика, но на антиотладку мне напороться так и не пришлось. Может, плохо искала? =)

    [Где скачать]
    _http://www.niceprotect.com/index.php?p=Download
    Офф сайт протектора

    На этом пока все=)
     
    #1 0x0c0de, 27 Jul 2007
    Last edited: 28 Jul 2007
    5 people like this.
  2. Hellsp@wn

    Hellsp@wn Elder - Старейшина

    Joined:
    29 Apr 2007
    Messages:
    401
    Likes Received:
    153
    Reputations:
    48
    хех =) не сложнее упх получилось... надо было по выше уровень брать =)
     
  3. dmnt

    dmnt Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    89
    Likes Received:
    36
    Reputations:
    15
    эмм... очередной hr [esp-4] ? :)
    а где исследование то?
    как шифруется секция кода? какой антитрейс? антидебаг? где seh-frames?
     
  4. GoreMaster

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    119
    Likes Received:
    32
    Reputations:
    4
    протектор накрыт чем?
    Если этим же протом,то надо было его исследовать,вот это была бы рульная статья,а так [:]||||||[:]
    P.S.:ковыряй уж Фемиду или StarForce :p
    P.P.S.: линки тоже выкладывай в статья на протектор ;)
     
  5. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    угу ....in progress))))))))))))

    hr esp-4 - эт неуниверсально=) Относительно антитрейса и антидебага - видимо реализованы как-то криво=\ Все плагины отрубила и нихрена....

    Собой же и написан на vb(!)=)

    когда-нибудь и до них доберусь=)
     
    #5 0x0c0de, 27 Jul 2007
    Last edited: 27 Jul 2007
  6. GoreMaster

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    119
    Likes Received:
    32
    Reputations:
    4
    Для гамнопротов самое то
    [qquote]Собой же и написан на vb(!)=)[/quote]
    Вот с прота и снимай защиту,но блиа VB это сакс
     
  7. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    Сделано

    Не прокатит с этим протом. Заипешься тормозиться на бряках(
     
  8. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    Пасиб за помидорозакидывание и агитацию=) Зато конструктивно=)

    Читаем далее.
    [Part II]
    [DotFixNiceProtect на примере DotFixNiceProtect].

    Как я уже говорила - прот написан на vb (сама была удивлена), а значит использует библиотеку MSVBVM60.dll. Так, VB-проги первым делом вызывают функцию ThunRTMain и код, естессно будет выполняться в этой библиотеке (MSVBVM60.dll). Здесь подход должен быть немного иной, чем в предыдущих случаях (из-за языка, на котором программа написана). Пришло время воспользоваться SEH. Теперь идем в отладчик и включаем остановку на всех эксепшнах (Alt + O и на вкладке Exceptions снимаем все галочки). Ждем последнего эксепта в таком месте (оно идентично во всех запакованных программах)

    Code:
     
    0012FFE0    FFFF                       ???                              
    0012FFE2    FFFF                       ???   
    
    А теперь хитрость=) Идем на карту памяти (Alt+M) и ставим бряк на доступ к кодовой секции в библиотеке MSVBVM60.dll. Shift+f9..... Через секунду мы в MSVBVM60.dll. Причем не где-то, а в стартовой функции ThunRTMain. Класс))))) Теперь нам нужен адрес возврата. Глянем в стек........ Видим, что на верхушке лежит

    Code:
    0012FBCC   00B1628E  DotFix_N.00B1628E
    
    Туда и отправимся. Go to-> 00B1628E. Что видим. Посмотрела на карту памяти. Мы в секции, а не на выделенной памяти=\ Резонный вопрос, а где вм? Ну нам же лучше.
    Опять вспоминаем как выглядит начало программы на вб. Сначала в стек заталкивается некое число, а потом уже идет вызов стартовой функции. Ищем это число, прокручивая листинг вверх. Вот оно

    Code:
    00B16207   .  C74424 FC ACBF4000       MOV DWORD PTR SS:[ESP-4],DotFix_N.0040BFAC
    00B1620F   .  EB 01                    JMP SHORT DotFix_N.00B16212
    
    C чего я взяла, что это именно то число? Да очень просто. Открыла в дампе. По этому адресу идет сигнатура VB5, что характерно для вб программ. Отлично, теперь у нас есть украденная oep не в выделенной памяти.
    Дампим, открываем импрек и пишем адрес иат - 1000.... Все нашлось. Вводим нашу OEP и склеиваем.
    Все работает)))))))))
    [Done]
     
    #8 0x0c0de, 27 Jul 2007
    Last edited: 28 Jul 2007
  9. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Девушка, а вы реверсите хэк защиты, использующие драйвер(а) ?
    > шифрация

    шифровация

    Great: шифровка
     
    #9 KEZ, 28 Jul 2007
    Last edited by a moderator: 31 Jul 2007
    2 people like this.