Внутренности 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 загрузить таки русские шрифты... ======================================================================= TEAM-53 TUTORiALs \\ www.BSUiR.com \\ #team-53 , IRC.By, IRC.BYNETS.ORG =======================================================================