ASM: защита удаления файлов

Тема в разделе "WASM.BEGINNERS", создана пользователем Einior, 30 май 2011.

  1. Einior

    Einior New Member

    Публикаций:
    0
    Регистрация:
    30 май 2011
    Сообщения:
    14
    В Досбоксе тоже не работает. Там удаление и не удаление файлов никак не зависит от программы.
     
  2. Einior

    Einior New Member

    Публикаций:
    0
    Регистрация:
    30 май 2011
    Сообщения:
    14
    Нашёл информацию о том, что для удаления DOS может использовать функцию 13h от прерывания 21h. В интернете информации об этом немного, а в Абеле и вовсе нет.
    Попробую поискать.
    UP:
    Нет, удаление идёт всё-таки не через функцию 13h
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Код (Text):
    1.    push    CS
    2.     pop        DS
    3.     ...............
    4.      mov    AL, [SI]
    Имя файла в DS:lol: X и DS из проги удаляющей файл не равен твоему CS !
    В стародавнии времена, когда отладчиков почти не было я отладочную печать бросал в старшие адреса и смотрел через debug.com :) Ну нельзя вслепую такие вещи прогать, когда еще азбука не на автомате...
     
  4. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Einior
    Функция 13h - удалить файл, используя FCB.
    Код (Text):
    1. AH=13h
    2. DS:DX->FCB
    3. Имя в FCB может содержать символы '?', что означает любой символ.
    4. Возвращает:
    5. AL=00h файл найден
    6. AL=FFh файл не найден
    Если обработчик срабатывает, тогда вместо очистки экрана надо выводить номер функции, и таким образом посмотреть какие функции вызываются, а в гадании смысла нет.
     
  5. Einior

    Einior New Member

    Публикаций:
    0
    Регистрация:
    30 май 2011
    Сообщения:
    14
    valterg
    Это код из первого поста, он уже исправлен :)
    skomarov
    Да, я знаю про FCB. Просто первый раз с этим столкнулся.
    Номер функции пробовал выводить (через прерывание BIOS).
    Если запустить под Волковым, то там постоянно вызывается функция 44h. Постоянно, в смысле, беспрерывно - весь экран заполняется.
    Если запускать под cmd, то отрабатывает функция 25h (странно, почему) и 40h.

    Такое предположение появилось. DOS ведь работает с FAT. А мои диски под NTFS. Может, дело в этом?
    В приложении на всякий случай код всей программы
     
  6. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    а ты проверь под чистым досом, с фатом, тогда никаких сомнений не останется, где проблема.
    VirtualBox поможет.
     
  7. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Einior
    В системе Windows XP под cmd.exe/command.com удаление происходит не через int 21h.
    В системе Windows XP под cmd.exe/command.com + VC.exe сначала формируется FCB AH=29h, затем удаляется файл AH=13h.
    В системе Windows XP под cmd.exe/command.com + DN.exe удаляется также через FCB.
    В системе MSDOS 6.22 удаляется также через FCB.
    В моем случае cmd.exe/command.com + VC.exe постоянно обновляет время (AH=2C), но это решается простым фильтром на код функции.
     
  8. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Einior
    Все изменения находятся в блоках debug, основной код не изменял. Добавил функции отладки show_func и show_fcb (выводит только имя файла), и добавил вызовы в обработчик int 21h. В структуре FCB расширение имени файла находится по смещению +9 и занимает 3 байта, незначащие символы замещаются пробелами. Это упростит анализ имени файла.
     
  9. Einior

    Einior New Member

    Публикаций:
    0
    Регистрация:
    30 май 2011
    Сообщения:
    14
    skomarov
    Большое спасибо, код понял. Буду доделывать.
     
  10. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Einior
    Думаю, что надо исходить из того, что задача является системо-зависимой, поэтому ориентироваться на версии DOS и соответственно отлаживать в такой системе, а в пределах системы уже перехватывать все варианты удаления, в том числе и переименование файла, а для этого не только проверять с помощью стандартных инструментов (del, vc), но и создать для каждого случая свои небольшие тестовые программы удаления, так же проверять функцию DOS (AX=5D00). В общем, могу сказать, что задача хорошая, многоплановая.
     
  11. Einior

    Einior New Member

    Публикаций:
    0
    Регистрация:
    30 май 2011
    Сообщения:
    14
    skomarov
    Ага, это только на первый взгляд задача показалась мне лёгкой.
    Самое интересное, что это задание сдавали до меня уже лет 5-6 подряд. Везде отлавливалась функция 41h. Запускалось всё под cmd + vc. И программа работала, и сдавалась.
    Думаю, прежде чем браться за проработку всех вариантов, нужно хотя бы что-нибудь одно отладить.

    Сейчас попробовал всё переписать под отлов функции 13h - не получилось, файл удаляется. Я правильно, понимаю, что в DS:lol: X при вызове 13h содержится адрес области памяти в FCB?
    У меня такое ощущение, что с сегментными регистрами опять что-то не так. Хотя DS не изменял, ES настроил.
    Прогонял код в эмуляторе. Если в DX загрузить адрес чего-нибудь, похожего на FCB, например:
    Код (Text):
    1. file db 5, 'test    txt', 21 dup (0)
    то алгоритм поиска подстроки работает.

    Вот новый обработчик.
    Код (Text):
    1. new_21h     proc
    2.  
    3.     cmp     AH, 13h             ;функция удаления по FCB, DS:DX содержит FCB
    4.     je      work                ;работаем по нашей функции    
    5.     jmp     exit_21h            ;иначе уход в старый обработчик без возврата
    6.    
    7. work:
    8.     call    show_func
    9.    
    10.     push    AX
    11.     push    BX
    12.     push    CX
    13.     push    DX
    14.     push    DI
    15.     push    SI
    16.     push    ES
    17.    
    18.     push    CS
    19.     pop     ES
    20.        
    21.     mov     SI, DX              ;SI <- FCB
    22.     add     SI, 9h              ;расширение находится по смещению +9 и занимает 3 байта
    23.     mov     BX, SI              ;копируем SI в BX, понадобится при поиске
    24.     mov     AX, offset CS:extensions    ;смещение extensions, первого символа
    25.    
    26.     mov     DX, AX
    27.     add     DX, ex_len          ;смещение первого байта после extensions
    28.     sub     DX, 2               ;смещение предпоследнего символа
    29.    
    30.     cld                         ;DF=0, движение вправо
    31.     search_string:
    32.         mov     DI, AX
    33.         cmp     DI, DX              ;дошли до предпоследнего символа - дальше нет смысла проверять
    34.         je      delete_file
    35.         mov     CX, 3h              ;ожидаемая длина расширения
    36.         repe    cmpsb
    37.         mov     SI, BX              ;возвращаем BX в предыдущее состояние
    38.         cmp     CX, 0h              ;найдено совпадение
    39.         je      found
    40.         inc     AX
    41.     jmp search_string
    42.    
    43. found:
    44.        
    45. not_delete_file:   
    46.  
    47.     pop     ES
    48.     pop     SI
    49.     pop     DI
    50.     pop     DX
    51.     pop     CX
    52.     pop     BX
    53.     pop     AX
    54.  
    55.     mov     AL, 0FFh                ;код ошибки - доступ запрещён
    56.     iret
    57.    
    58. delete_file:
    59.  
    60.     pop     ES
    61.     pop     SI
    62.     pop     DI
    63.     pop     DX
    64.     pop     CX
    65.     pop     BX
    66.     pop     AX
    67.    
    68. exit_21h:
    69.     jmp     DWPTR CS:[old_21h]
    70.    
    71. new_21h     endp
     
  12. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    Einior
    Возможно, что для лабораторной достаточно и одной функции, но тщательная проработка даже простой лабораторной формирует на будущее необходимые навыки в самом человеке. Да и преподавателю всегда приятно увидеть оригинальное решение.

    Да, правильно. Поищи "TechHelp! 6.0", там все написано, кроме функции 5D00.
    Сегментные регистры настроены правильно, хотя алгоритм проверки можно упростить. Ошибка заключается в том, что в FCB имя файла и расширение заглавными буквами, а в твоих данных - строчными.
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Пара замечаний. В начале для универсальности добавляем:
    Код (Text):
    1.   .386
    2. code_seg segment USE16
    Надо добавить в boot: команды
    Код (Text):
    1.   push  cs
    2.   pop   cs
    Тоже самое перед вызовом print. Если делать exe, а не com то CS != DS и прога не работает.
    Досбокс реализует команды не через ДОС-прерывания. Соответственно проверить ничего нельзя.
    У меня Волков 4.05 и он благополучно убивает перехват 21h и в ХП и в Досбоксе
    Если сначала загрузить lab2, то в Досбоксе все виснет после int 21h AH=4Bh, а в ХП выдает аппаратная ошибка ntvdm