IDT и StarForce

Тема в разделе "WASM.RESEARCH", создана пользователем DillerInc, 14 сен 2007.

  1. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Я думаю,многим известно,что StarForce перехватывает прерывания для своих нужд и не даёт таким образом нормально работать SoftIce.

    Я решил написать мини-драйвер(исходник и сам,приложены),который бы мог оперировать адресами обработчиков прерываний(примерно так,как это описывал ASMax в одной из своих статей про старые версии протектора).
    Для начала я ограничился только считыванием адресов обработчиков.
    И тут же встал косяк: в присутствии StarForce мой драйвер возвращает мне адреса обработчиков словно они перехвачены SoftIce,в то время как они должны быть и есть перехвачены протектором.В общем,некорректно работает.

    Ведь IDT должна быть одна для всех процессов??И данные о таблице,полученные из одного процесса,должны быть действительны и для любого другого,не так ли??

    Теперь же ситуация получается следующая: защищённое приложение висит зацикленое в памяти.Загружается SoftIce,который командой idt показывает правильные адреса обработчиков(прерывания 1 и 3 перехвачены протектором).Я запускаю свой мини-драйвер,который мне показывает,что прерывания 1 и 3 всё ещё перехвачены отладчиком SoftIce,что неверно.

    Собственно,вопрос: как быть??Почему так происходит??
    Надеюсь,что кто-нибудь сможет это всё как-то прокомментировать.

    P.S. ОС -- Win2kSP4
    P.P.S. Версия протектора очень древняя -- 1.0.0.1 -- судя по защитной библиотеке.
     
  2. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Если не ошибаюсь, в IDT айсовы адреса, а показывает он то, что там было до него.
     
  3. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...это как??

    Тут попробовал также утилиту от Dragon'а -- R0cmd.
    Так та тоже показывает,что прерывания перехвачены отладчиком,когда они на самом деле должны быть перехвачены протектором.Мистика какая-то.

    Жалко,что нельзя попробовать это дело на XP, т.к. на этой ОС защищённая игра вообще не запускается,перезагружая компьютер.А других игр со StarForce у меня к сожадению нет.
     
  4. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Молча :)
     
  5. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    DillerInc

    Загружается SoftIce,который командой idt показывает правильные адреса обработчиков(прерывания 1 и 3 перехвачены протектором).
    Утверждение неверно. При загрузке SoftIce перехватывает эти прерывания, а выводит информацию ту которая была до перехвата. Для реальных искользуй IceExt и комманду !idt

    Не проверял, но попробуй не пользовать idt а просмотри таблицу в памяти.
     
  6. Agent666

    Agent666 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    98
    Старфорс модифицирует таблицу страниц защищаемого процесса так, что его IDT отличается от общесистемной.
     
  7. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    PROFi
    Спасибо,проверим с IceExt.
    ...а как мне на неё ещё можно выйти??Я имею ввиду с помощью моего драйвера.Я так понимаю,что использование команду SIDT -- это единственный вариант узнавания базового адреса таблицы...

    Agent666
    Я пробовал делать следующим образом.В исследуемый процесс внедрялась моя DLL,которая потом вызывала мой драйвер.Последний возвращал результат,который вроде показывал,что прерывания перехвачены протектором,но адреса были какие-то как бы неверные...

    В общем,буду ещё смотреть.
     
  8. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Похоже,что Agent666 прав.
    Когда защищённое приложение висит в памяти в зацикленом состоянии и жрёт всё время процессора,то активированый отладчик остановится наверняка в контексте этого процесса.
    Тогда с помощью команды !idt мне выводится,что прерывание 1 и 3 перехвачены протектором(адреса 01820000h и 01830000h соответственно).Если же я в то же время прервусь в каком-нибудь другом процессе,например,с помощью бряка на WinAPI-функцию и тогда в отладчике введу команду !idt,то последняя покажет мне,что прерывания перехвачены отладчиком(адреса 8201C01Dh и 8201C03Ch соответственно).Вот такая вот загагулина.

    Меня смущает однако другое.
    Как я уже описывал выше,я внедряю свою библиотеку в адресное пространство исследуемого процесса и из неё вызываю свой драйвер.Драйвер считывает адреса обработчиков 1 и 3 и возвращает их обратно в библиотеку.Так вот адреса эти странные: 02490000h и 024А0000h соответственно для первого и третьего прерывания.Но они же отличаются от тех,что мне выдаёт команда !idt...?!Почему так происходит??

    EDIT.

    Значит так.Опытным путём было установлено,что адреса,полученные моим драйвером из внедрённой библиотеки,верные.StarForce видимо потом сам изменял свои адреса обработчиков.То ли он так реагировал на загрузку отладчика в память,то ли на завершение моего удалённого потока,то ли у него там свои какие-то манипуляции происходили.
     
  9. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    DillerInc

    я внедряю свою библиотеку в адресное пространство исследуемого процесса и из неё вызываю свой драйвер.

    ССчас жже. DeviceIoControl ассинхронная функция, и драйвер ее обрабатывает в любом контексте если использовать буферезированный ввод-вывод. Об этом нельзя забывать.
     
  10. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Сделай так, сбрось бит присутсвия сегмена с обработчиком int1, затем перехвати исключение и вуа-ля.
     
  11. Agent666

    Agent666 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    98
    Старфорс иногда перемещает свою ВМ в памяти, так что адреса могут меняться.
     
  12. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...я так понял,что данная функция может быть асинхронной,только если использовать структуру Overlapped.И вообще к чему это всё??
    ...а можно подробнее: что,как,куда,для чего...??Дело в том,что я только начинаю иметь дело с нулевым кольцом,поэтому многие вещи для меня туманны.
     
  13. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Starforce вешает свой обработчик на int1 (#DB, отладочное прерывание) и проверяет к тому же не прибил ли его кто. Но, мы просто снимаем бит присутсвия в дескрипторе для него и вместо #DB происходит #NP. Залепив небольшой драйвер отлаживаем любимым дебагером star.
     
  14. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...здорово звучит,но я пока не могу проследить весь ход мысли.
    Допустим,что мы снимем седьмой бит в KIDTENTRY первого прерывания.Я так понимаю,что протектор должен тогда выкинуть "Segment not present exception" -- прерывание номер 11.
    А вот как мы должны его обработать...??
     
  15. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Хукаешь #NP и там вызываешь оригинальный int1 (если это нужное тебе #NP, конечно)
     
  16. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    tylerdurden
    Хорошо,попробую разобраться.Если что,я спрошу тут что-нибудь.В любом случае спасибо за информацию.
     
  17. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...а можно ли,находясь не в защищаемом процессе,как-то выйти на IDT,которая находится в защищаемом процессе??
     
  18. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    DillerInc
    Думаю заюзать драйвер - приаттачиться к процессу , тем самым мы будем находиться в контексте процесса в который мы приаттачились. А дальше можно его зозохать .
     
  19. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    TermoSINteZ
    Я сейчас пробую делать следующим образом: библиотека,внедрённая в исследуемый процесс,запускает драйвер и потом общается с ним через DeviceIoControl.Так вот в драйвере я считываю IDT дважды.Первый раз в теле DriverEntry,которая выполняется в контексте процесса System,и воторой раз в теле DispatchControl,которая выполняется в контексте исследуемого процесса,который запросил операцию ввода-вывода.

    Я просто интересовался,есть ли какой-то иной способ...
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Дада, именно.

    #pragma pack(2)
    struct IDTR
    {
    WORD Limit;
    PVOID Table;
    } Idtr;

    #pragma pack()

    ...

    DriverEntry(..) {
    __asm sidt[Idtr];
    ...
    }