Авторские статьи Распаковка Upx'ов для новичков

Discussion in 'Статьи' started by KindEcstasy, 29 Nov 2006.

  1. KindEcstasy

    KindEcstasy Banned

    Joined:
    30 Sep 2006
    Messages:
    105
    Likes Received:
    64
    Reputations:
    54
    [ Распаковка UPX для новичков ]​


    Здравствуйте, мои дорогие а-чатовцы. С вами снова я, после долгого отсутствия, вернулся на любимый форум. Я надеюсь, вы ещё меня не зыбыли =), и не сбросили меня со счетов. Просто по некоторым техничиским причинам, я не мог выйти в сеть.


    Инструменты
    ------------



    • PE Tools 1.5 :[ 1.5 - это версия которой пользуюсь я, так как она меня не подводила ]
    • ImpREC 1.6 :[ 1.6 - это версия которой пользуюсь я, так как она меня не подводила ]
    • OllyDebuger 1.10 :[ Желательно иметь плагины: CommandBar v3.0 & OllyDump 2.21 ]
    • Target aka жертва :[ будем ковырять сапёра для XP, сжатого UPX с ключом: --best ]


    Настройки
    ---------


    Итак, для того чтобы что-нить распаковать, прежде всего необходимо настроить свой PE Tools и ImpREC, так и делаем. Сверте настройки с моими (помеченные галочками настройки будут обозначаться как: - [•]):

    [PE Tools]

    +--------------------------------------------+
    |
    | [•] Restore Last Directory on startup
    | [•] Restore Last Main Window Position
    | [•] Create Backup Copy
    | [•] Section Table: Autofix SizeOfImage
    | [•] Optional Header: Autofix CheckSum
    | [•] Optional Header: Autofix SizeOfHeaders
    | [•] Full Dump: Paste Header From Disk
    | [•] Full Dump: Fix Header
    | [•] Delete Temp Files
    | [•] Wipe Relocation
    | [•] Validate PE
    | [•] Rebuild PE
    | [•] Bind Imports
    |
    +-------------------------+------------------+
    |P.S - Остальное вырубайте|
    +-------------------------+


    [ ImpREC ]

    +--------------------------------------------+
    |
    | [•] Fix EP To OEP
    | [•] Enable Debug Privelege (NT/2K/XP)
    | [•] Use PE Header From Disk
    |
    +---------------------------------+----------+
    |P.S - Остальное оставить как было|
    +---------------------------------+


    Распаковка
    ----------

    Итак, с настройками определились, и самое время начать распаковывать прогу, в данном случае уже заранее запакованного вами Сапёра. Что? Вы ещё это не сделали? Ладно, делаем вместе:

    upx.exe --best winmine.exe

    Фух, сделали? Ну тогда продолжим:

    Суём в Olly наш запакованный бинарник, на табличке с предупреждениями жмём OK! Перед нами должен быть примерно такой код:


    Code:
    01021C20 > $ 60             PUSHAD					: <- Эта строка называется EntryPoint
    01021C21   . BE 00100101    MOV ESI,winmine.01011000
    01021C26   . 8DBE 0000FFFF  LEA EDI,DWORD PTR DS:[ESI+FFFF0000]
    01021C2C   . 57             PUSH EDI
    01021C2D   . 83CD FF        OR EBP,FFFFFFFF
    01021C30   . EB 10          JMP SHORT winmine.01021C42
    
    Что же мы видим? Типичное начало для UPX'ов! Теперь, жмём Ctrl+F и вводим "popad". Жмём Enter! Вывалиаемся тут:


    Code:
    01021D6E   > 61             POPAD
    01021D6F   .-E9 AD20FEFF    JMP winmine.01003E21			: <- Эта строка перехода на OriginalEntryPoint
    01021D74     00             DB 00					:    Она то нам и нужна...
    01021D75     00             DB 00

    Итак, мы стоим на 01021D6E! Жмём F2, чтобы поставить бряк на это место, потом жмём F9, чтобы запустить прогу. Она остановиться на 01021D6E. Жмём 2 раза F8, и попадаем на такое:


    Code:
    01003E21   6A 70            PUSH 70
    01003E23   68 90130001      PUSH winmine.01001390
    01003E28   E8 DF010000      CALL winmine.0100400C
    01003E2D   33DB             XOR EBX,EBX
    01003E2F   53               PUSH EBX
    01003E30   8B3D 8C100001    MOV EDI,DWORD PTR DS:[100108C]              : kernel32.GetModuleHandleA
    01003E36   FFD7             CALL EDI
    01003E38   66:8138 4D5A     CMP WORD PTR DS:[EAX],5A4D
    01003E3D   75 1F            JNZ SHORT winmine.01003E5E

    Вот это и есть точка входа в распакованную программу. Стандартное начало программ написанных на VC++. В это время отладчик находиться в состоянии "Paused", стоит прямо на OEP, да и кстати прога уже распаковалась в памяти! Самое время сделать дамп!

    Не закрывая отладчика, запускаем PE Tools, находим процесс нашей проги (НЕ ОТЛАДЧИКА!!!), на ней ПКМ->Dump full...
    Сохраняем дамп проги в удобное место, и закрываем PE Tools.

    Заметьте, что отладчик у нас остаётся загружен, то есть мы его не закрываем!!!

    Запускаем ImpREC, выбираем процесс нашего Сапёра и ... А теперь внимательней:

    В ImpREC'e есть такая фишка, IAT Autosearch! Найдите три поля: OEP, RVA и Size, а рядом кнопочка будет "IAT Autosearch". Нам нужно в поле OEP вписать OEP, но без ImageBase. То есть:

    OEP у нас равен: 01003E21
    ImageBase равен: 01000000


    Делаем:

    OEP-ImageBase=[значение которое нужно вписать в поле OEP], то есть мы из OEP вычитаем ImageBase и получаем 3E21. Вот это число вы должны вписать в поле для OEP. Вписали? Жмём "IAT Autosearch", нам должны сказать что:

    Found Adresses wich may be in the original IAT

    Теперь жмите GetImports, теперь Fix Dump и выбираем наж дамп, который мы получили при помощи PE Tools. При этом в окне лога ImpREC'a должно появится следующее:

    C:\Documents and Settings\Администратор\Рабочий стол\Unpacking\Dumped_.exe saved successfully.

    Вот и всё теперь файл Dumped_.exe можно отлаживать как нормальную прогу. Поздравляю! Вы распаковали UPX!

    В следующей статье вы будете распаковывать ASPack!

    До скорых встречь!

    [c] KindEcstasy

     
    4 people like this.