RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

Внутренности SOFTICE (Запуск Softice)

Эта статья является переводом "SOFTICE INTERNALS" by +Spath.
I.1 Запуск в DOS

Winice.exe это MZ/LE файл, который содержит как части кода которые выполняются в DOS так и части которые выполняются protected mode (VxD).
Во время выполнения DOS частей winice.exe делает следующее:

1. Меняет видео режим на mode 3 (80x25, text mode, 16 цветов) и выводит месагу о версии айса и т.д.
2. Проверяет запущен ли windows, если да - выходит
3. Проверяет наличие XMS драйвера. Если нет - выходит, если есть - сохраняет entry point драйвера.
4. Проверяет тип CPU чтоб был 386+ пытаясь записать старшую часть eflags, если не 386+ - выходит
5. Выполняет командную строку (т.е. обрабатывает параметры, с которыми запущен winice.exe)
6. Перехватывает следующие вектора IVT:

2Fh - Microsoft Windows
SoftICE управляет сервисом 1605h (Windows Init Broadcast) и возвращает собственные значения ES:BX для указателя структуры startup infos (привязанный к предыдущей структуре). Previous vector is chained.

68h - Real Mode Debugger services
SoftICE берет управление над следующими сервисами (previous vector is chained):
43h: D386_Identify, SoftICE возвращает AX=0F386h.
44h: D386_Prepare_PMode, SoftICE возвращает указатель на его protected mode initialization callback функцию (PMINIT). Эта функция реализует сервисы PMINIT_INIT_IDT, PMINIT_INIT_PAGING, PMINIT_INIT_SPARE_PTE and PMINIT_GET_SIZE_PHYS.
5080h и 5081h: D386_Load_Segment (сегмент code/data драйвера устройств).
9000h: SoftICE SIWVID

23h - перехват Ctrl-C
Эта комбинация может использоваться для отмены загрузки Softice. Когда нажато CTRL-C, Softice восстанавливает оригинальные обработчики INT 2Fh и INT 68h, потом INT 0Bh или INT 0Ch (прерывание COM портов, в зависимости от того к чему они относились, следуя значению параметру /COM из командной строки). Потом SoftICE вызывает сервисы 0Dh и 0Ah XMS драйвера и выходит. Предыдущий вектор игнорируется.

7. Открывает видео драйвер (по умолчанию SIWVID.386) и читает параметры.
8. Читает и обрабатывает WINICE.DAT (макс размер 16K).
9. Читает и обрабатывает WINICE.BRK (breakpoint history). Этот файл может содержать до 32 брейкпоинтов описанных в plaintext виде (типа "BPX GetProcAddress").
10. Читает WINICE.VID для настроек видео.
11. Ищет VGA драйвер и берет указатель шрифтов 8x14, 8x16 VGA или 8x8 double dot в ROM.
12. Получает версию DOS и указатель на список списков DOS (В оригинале написано DOS List of Lists. Я вроде как DOS знаю, но про такое слышу первый раз…).
13. Ищет WIN.COM.
14. Открывает KRNL386.EXE, USER.EXE, GDI.EXE, WIN386.EXE, DOS386.EXE.
15. Выделяет себе память под символы и бэктрейс буфер и т.д. используя XMS драйвер.
16. Если нужно выводит дополнительную инфу.
17. Запускает WIN.COM

Вот тут происходит загрузка Windows…

I.2 Запуск в Protected mode

В отличие от остальных дебагеров SoftICE уже активен, перед тем как запущен процесс или несистемный статический драйвер загружен, и эта уникальная возможность требует довольной сложной настройки в protected mode. После того как на шаге 17 запускается WIN.COM, SoftICE снова может получить контроль только через хуки на INT2Fh и INT68h в IVT и OS callbacks (PMINIT).
Итак, на шаге 17 мы все еще в real mode, WINICE.EXE запускает WIN.COM :

18. Чтобы получить инфу о реальном режиме Windows делает широковещательный (Init Broadcast) вызов; Этот сервис (INT2Fh/1605h) контролируется SoftICE (шаг 6), который возвращает собственные Startup Infos структуры, и где SoftICE обьявляет себя ДОСовским драйвером устройства.

19. Так как SoftICE теперь ДОСовский драйвер устройства Windows будет выделять новые селекторы для него и вызывать INT68h/5080h и 5081h для поддержки символьной отладки. Когда SoftICE засекает, что такие вызовы используются для него же, он использует значения селектора чтобы вычислить линейные адреса начала своего кода в protected mode (это, кстати, как раз его PMINIT функция).

20. Перед тем как переключиться в protected mode, Windows сделает вызов D386_Prepare_PMode, а тут SoftICE вернет вычисленный ранее адрес PMINIT.

21. Windows переключается в protected mode. Во время инициализации windows, VMM вызывает процедуры PMINIT. Вот на какие из них SoftICE будет реагировать (именно в этом порядке):

- PMINIT_INIT_IDT: здесь SoftICE дополняет свой код для BPINT и ставит хуки на IDT векторы 1,2,3,6,0Bh,0Ch,0Dh,0Eh,41h.

- PMINIT_GET_SIZE_PHYS: здесь SoftICE игнорирует сервис (Возвращает debugger address = debugger size = 0) чтобы заставить VMM вызвать следующие два:

- PMINIT_INIT_PAGING: тут происходит бОльшая инициализации SoftICE, которая включает настройку PIC, TSC калибровка, обработка WINICE.DAT (опции, макросы), настройка видео, принтера, клавиатуры, загрузка символов и т.д. По окончании всего этого Softice активен и готов к работе.

- PMINIT_INIT_SPARE_PTE: SoftICE проецирует всю физическую памяти (как указано PHYSMB в WINICE.DAT) в линейное адресное пространство. (maps into linear address space).

Так как SoftICE зарегистрировался как драйвер, winice.exe будет получать все системные сообщения VxD системы (SoftICE обрабатывает только сообщения SYS_CRITICAL_INIT, DEVICE_INIT, INIT_COMPLETE, SYS_CRITICAL_EXIT, W32_DEVICEIOCONTROL, SET_DEVICE_FOCUS, DESTROY_VM). Во время запуска Windows (когда статические VxD загружаются), SoftICE получает 3 следующие сообщения:

22. SYS_CRITICAL_INIT, тут SoftICE

  • вызывает Win386_Alive сервис (INT22h/AX=0) чтоб проверить что WIN386 загружен.
  • получает версию VMM и по ней активирует или отключает команды типа DEVICE, DRIVER, FOBJ, IRP, OBJDIR.
  • получает инфу по компьютеру (Версию MSDOS, тип CPU, и т.д.).
  • ставит хуки на PM faults 06, 0Ch, 0Dh, 0Eh
    VMM faults 06, 0Dh, 0Eh
    V86 faults 06, 0Ch, 0Dh, 0Eh
  • ставит хуки на следующие сервисы VMM: Out_Debug_String, In_Debug_Chr, Out_Debug_Chr, Get_Profile_Hex_Int
    И если версия VMM как минимум 400h, Trace_Out_Service и
    Debug_Printf_Service.
  • ставит хук на порт 84h, перенаправляет его на retn, и полностью отрубает контроль Windows над этим портом.
  • ставит хуки на следующие сервисы VMM:
    Enable_Local_Trapping, Disable_Local_Trapping, Enable_Global_Trapping, Disable_Global_Trapping.
  • устанавливает собственную Task Switch Callback функцию (она вызывается при каждом переключении между задачами).
  • ставит хуки на следующие сервисы VMM:
    _AllocateThreadDataSlot, _FreeThreadDataSlot.
  • ставит хуки на следующие сервисы VMM:
    _ContextDestroy, _Debug_Flags_Service.
  • дополняет SIWDEBUG DDB и добавляет его в список устройств.
  • ставит хук на VXDLDR _PELDR_AddExportTable.
  • создает 3 новых дескриптора в GDT, один для доступа к своему же коду SoftICE, второй для перехвата INT 41h и третий для доступа к первому мегабайту памяти
23. DEVICE_INIT, тут SoftICE
- вызывает сервисы 0 и 1 в SIWVID.
- устанавливает сочитание клавиш для вызова SoftICE.
- устанавливает свой обработчик page fault.

24. INIT_COMPLETE, тут SoftICE просто очищает carry flag.

25. Если BootGUI=0 в msdos.sys, то DOS часть SoftICE DOS получает контроль снова когда происходит выход из Windows. Он сохраняет новый WINICE.BRK, очищает память восстанавливает векторы 2Fh, 68h, 0Bh/0Ch и выходит в DOS.

P.S. Блин все так умно. А вот интересно можно ли на шаге 11 заставить Softice загрузить таки русские шрифты...


<= Вернуться к статьям


Rambler's Top100