Привязка программы к ключевой дискете

Тема в разделе "WASM.RESEARCH", создана пользователем Trasher, 18 янв 2009.

  1. Trasher

    Trasher New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2009
    Сообщения:
    8
    Всем привет!
    Недавно столкнулся с DOS-программой, которая привязана к дискете.
    Вот что удалось накопать:
    используется функция BIOS int 13h для чтения дискеты со след параметрами:
    AH=04 - тип операции (04=Верификация сектора)
    AL=01 - число секторов
    CH=50 - номер дорожки
    CL=09 - номер начального сектора
    DH=00 - номер головки
    DL=00 - номер дисковода
    После отработки int 13h AX=0200 - Не найден адресный маркер на диске.

    Теперь вопрос: кто знает как отвязать прогу от проверки ключевой дискеты? Была идея отформатировать саму дискету с нестандартным размером сектора...
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Trasher
    Сорри за опепятку.
    Небось все под "скользящей" строкой дешифрования-зашифрования в обработчике int1 замурцовано?
     
  3. Trasher

    Trasher New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2009
    Сообщения:
    8
    crypto
    Смутно представляю себе что это такое :)
    По-моему нет там "дешифрования-расшифрования"...
    На int 13h сразу вышел.Использовал отладчик из старых версий антивируса Касперского.Он позволяет сразу выбрать int и поставить на него точку останова.
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Trasher
    На дискетах (особливо на 5-дюймовых) помимо программно или аппаратно созданного уникального признака использовалось зашифрование программы. При загрузке такие программы переназначали 1 и 3-е прерывание (и некоторые другие), обработчик 1-го прерывания расшифровывал, исполнял и зашифровывал очередную инструкцию (это и есть "скользящая" строка), при этом выполнялось чтение секретной части диска, проверка и в зависимости от проверки программа либо раскрывалась и запускалась, либо обламывалась. Использовалась подобная идея, например, в защитах SHIELD, VANGUARD, CERBER.
    А то что ты попал на обработку 13-го прерывания, еще ни о чем не говорит, может и подстава. Нужно смотреть, как все это реализовано с самого начала.
     
  5. DeGlucker

    DeGlucker New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2002
    Сообщения:
    28
    Обрати внимание, что читается область за пределами стандартной дискеты (трек 50h = 80),
    там может быть записан ключ.
     
  6. Trasher

    Trasher New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2009
    Сообщения:
    8
    crypto
    Спасибо за разъяснения!

    DeGlucker
    Значит оригинальная дискета имеет нестандартное форматирование? Ведь обычная на 1.44Мб имеет 0-79 дорожек...

    Теоретически могу получить доступ к оригинальной дискете и посмотреть что к чему, но товарищ, который просил посмотреть эту прогу что-то жлобит принести дискету :)
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Trasher
    Естественно, такой признак как-правило трудно или даже невозможно воспроизвести програмнно.
    Прежде, чем просить дискету, лучше потратить некоторое время на изучение загрузчика. Тогда и станет понятно, нужна дискета или нет. А то, что товарщ жлобит, тоже понятно - на дискету в закрытый сектор может записываться некая информация (к примеру, количество оставшихся запусков), дискету неаккуратным обращением можно разрушить,...
     
  8. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Как насчет того, чтобы написать резидент, возвращающий значения, устраивающие искомую программу? В случае с Mecom (экономическая игра под дос), защита которой основывалась на чтении (они не проверяли содержимое) доп. сектора, все было успешно. Фильтровал вызовы инт13, в иных случаях отдавал упр-е старым обработчикам, в случае вызова с нестандартными параметрами возвращал не-CarryFlag.
     
  9. Trasher

    Trasher New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2009
    Сообщения:
    8
    crypto
    Можно подробнее, пожалуйста, про перехват прерываний. В смысле как это выглядит в общем виде... Сам ничего интересного не нашел по этой теме.
    _edge
    Как понять какие значения ее устроят? Про оригинальную дискету уже было сказано...
     
  10. Trasher

    Trasher New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2009
    Сообщения:
    8
    Попробовал поменять значения регистров перед выполнением инта 13... Поменял CH с 50h на 20h (номер дорожки). Теперь вместо "ILLEGAL COPY PROGRAM STOPPED" прога выдает "EQUIPMENT ERROR PROGRAM STOPPED"
     
  11. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    В моем случае программу устроило успешное выполнение вызова i13.
    Ломаемая прога тупо вызывала "читай сектор", если CF, начинала орать. Я же ей clc/retf. Как будто он прочитался. В моем случае она не проверяла, что же собственно "считалось".

    Может экзешник пропатчить, заменив jz на jnz? (явно направить ход исполнения на "все успешно").
    Тем более, она verify делает, ей похоже до содержимого дела нет.

    Пример перехвата инт21 для .com (учебный, но смысл ясен)

    Код (Text):
    1. _code   segment
    2. assume  cs:_code,ds:_code
    3.     org 100h
    4. start:
    5.     jmp setup
    6. ; здесь будем хранить cs:ip старого обраб.
    7. old21   dd  ?
    8. ; новый обработчик
    9. new21   proc    far
    10. assume  cs:_code,ds:nothing
    11.     pushf
    12.     push    ax
    13.     push    dx
    14.     cmp ah,4fh
    15.     jne loc01
    16.     mov ah,02h
    17.     mov dx,2bh
    18.     pushf
    19.     call    old21
    20. loc01:
    21.     pop dx
    22.     pop ax
    23.     popf
    24.     pushf
    25.     call    old21
    26.     retf    0002h ;<-- может быть правильно через iret, не помню уже
    27. new21   endp
    28. setup:
    29. ; сохр. старый вектор прерывания
    30.     mov ax,3521h
    31.     int 21h
    32.     mov word ptr old21[0],bx
    33.     mov word ptr old21[2],es
    34. ; уст. новый
    35.     mov ax,2521h
    36.     mov dx,offset new21
    37.     int 21h
    38. ; выйти и оставить резидентом
    39.     mov dx,offset setup
    40.     int 27h
    41. _code   ends
    42. end start
     
  12. Trasher

    Trasher New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2009
    Сообщения:
    8
    На предмет пропатчивания я уже лазил отладчиком, однако не нашел чего-либо подозрительного (хотя не факт что такого там нет :) ). К тому же непривычна DOS'овская 16-битная адресация (или правильно говорить 20-битная?).
    _edge
    Каким образом сделать перехват нужного инта? Подскажи, пожалуйста. Возможно так оно и есть, что прога только лишь проверяет наличие нестандартной разметки флопа...
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Trasher
    Собственно, о прерываниях все уже сказано.
    С помощью сервисного прерывания 21h определяешь вектор нужного тебе прерывания (скажем, 13h), сохраняешь его, назначаешь собственный обработчик, в котором будет в конце вызов старого обработчика. Потом все это дело восстанавливаешь.
     
  14. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    больше для себя
    http://www.books.ru/shop/books/552034
     
  15. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Вот такая дока идёт в комплекте с FDA PRO
     
  16. Trasher

    Trasher New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2009
    Сообщения:
    8
    Переделал по-быстрому код, что приводил _edge:

    Код (Text):
    1. _code   segment
    2. assume  cs:_code,ds:_code
    3.     org 100h
    4. start:
    5.     jmp setup
    6.  
    7. ; Здесь будем хранить cs:ip старого обраб.
    8. oldint13 dd ?
    9.  
    10. ; Новый обработчик
    11. new13   proc    far
    12. assume  cs:_code,ds:nothing
    13.         pushf
    14.     cmp     ax,0401h                ; Пользователь вызывает нашу функцию?
    15.         je      is_check                        
    16.         call    oldint13                ; Или переходим на исходный int 13h
    17.         retf
    18. is_check:
    19.         xor ah,ah
    20.         clc
    21.         popf
    22.         retf                            
    23. new13   endp
    24.  
    25.  
    26. setup:
    27.  
    28. ; Сохраняем старый вектор прерывания
    29.     mov ax,3513h
    30.     int 21h
    31.     mov word ptr oldint13[0],bx ; Смещение
    32.     mov word ptr oldint13[2],es ; Сегмент
    33.  
    34. ; Усанавливаем новый
    35.     mov ax,2513h
    36.     mov dx,offset new13
    37.     int 21h
    38.  
    39. ; TERMINATE and STAY RESIDENT :)
    40.         mov     ax,3100h
    41.         mov     dx,0004h
    42.         int       21h
    43.  
    44. _code   ends
    45. end start
    Запускаю эту программу и следом подопытную... И ничего: черный экран и курсор. Помогает только перезагрузка(если под реальным ДОС или VMWare).
    Подскажите, пожалуйста, может криво накодил...
     
  17. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Trasher
    А прежний обработчик нафиг? Уж если хочешь сбросить флажок, то сбрось его после вызова прежнего обработчика.
    ЗЫ
    Все-таки разберись, что делает старый, а потом переходи к кодированию.
     
  18. Trasher

    Trasher New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2009
    Сообщения:
    8
    crypto, видимо, ты был прав. Потрейсил прогу в самом начале, она перехватывает следущие прерывания:
    00h - ошибка деления
    1Bh - Ctrl-Break прерывание
    1Ch - Прерывание от таймера
    66h - не используется
    Будем смотреть...
     
  19. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    По просьбе ТС смотрел код. Выяснилось, что написан на Форте (версия прошита в коде). Нашел даже место, где вызывается 13-е прерывание, но ничего путного из этого не выходит. Кто знаком с Фортом, представляют, о чем я говорю. Может быть есть спецы по нему? А то не очень хочется изучать эту хренову стековую машину.