Сторож COM файла

Тема в разделе "WASM.BEGINNERS", создана пользователем AlexPozinsky, 2 дек 2010.

  1. AlexPozinsky

    AlexPozinsky New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    6
    Собственно имеется курсовик. Задание таковое - написать сторож COM файла - резидент, который висит в памяти и проверяет целостность оного. Если целостность нарушена - восстанавливает ее. Как то так.
    Суть вопроса - где найти пособие по написанию резидентов, например на TASM. И как проверить целостность файла(моя идея сделать его копию и каждый полминуты его восстанавливать видится категорически неправильной). Ну в общем Help и все такое)
     
  2. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    А по какому предмету курсовик?
    Может искать его CRC. Всего или какой-то части?
    Иначе -распаковать удалить испорченный и заменить на распакованный?
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    AlexPozinsky
    т.к. размер com файла не может превышать 64 Кб (с оговоркой на эффективную часть и отсутствие оверлеев), то предлагаю просто тупо считать в отдельный сегмент в памяти и восстанавливать оттуда, целостность проверять можно простым побайтовым сравнением.
     
  4. AlexPozinsky

    AlexPozinsky New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    6
    _sheva740, по ассемблеру же. Точнее - Организация ЭВМ.
    СRC на асме будет реализовываться... долго и усердно. Нужен простой и изящный метод, который будет работать)
    max7C4, то есть вы предлагаете мой метод, но уже с работой в памяти? Можно как нибудь намекнуть ассемблерным кодом или ссылкой, как сие реализовывать? То есть как в память загрузить?
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    AlexPozinsky
    что не изящного в
    Код (Text):
    1.  mov ecx, sizeof buffer; можно исключить и полагать первым параметром
    2.  mov esi, offset buffer; можно исключить и полагать вторым параметром
    3.  mov ebx, CRC_Table
    4.  mov edx, 0FFFFFFFFh
    5.  xor eax, eax
    6. @@loop:
    7.  lodsb
    8.  xor al, dl
    9.  shr edx, 8
    10.  xor edx, [eax*4+ebx]
    11.  loop @@loop
    12.  mov eax, 0FFFFFFFFh
    13.  xor edx, eax
    14.  retn
    да. намекаю:
    Код (Text):
    1.  mov ax, 03D00h
    2.  mov dx, offset file_name
    3.  int 33
    4.  push save_seg ; или вместо этой и следующей строки можно предположить (но поверьте, что лучше этого не делать), что в ds уже загружен сегмент для загрузки файла
    5.  pop ds
    6.  xor dx, dx
    7.  mov cx, iend-$$
    8.  mov bx, ax
    9.  mov ah, 03F
    10.  int 33
    11.  mov ah, 03Eh
    12.  int 33
    примерно так. насколько я помню дос. Это должно загрузить файла с именем записанным в file_name в сегмент с адресом из save_seg

    и еще намекну. Если резидент должен находиться в этом же самом com файле, то все еще проще. Если убрать все переменные из сегмента с загруженным com файлом, а резидента запихнуть в конец, то можно ничего в память не грузить, т.к. система сама загрузит весь этот com файл в память. просто останется позаботиться о его неизмености (т.е. исключить все переменные и стек из сегмента com файла).
     
  6. AlexPozinsky

    AlexPozinsky New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    6
    Ой. Тебе всяческие благодарности! Буду быдлокодить)
     
  7. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    AlexPozinsky
    незачто
    не советую. набирал в браузере, могут быть опечатки и не точности с теорией (всегда путал 3F и 40 функции, а еще значения флагов для 3D функции)
     
  8. AlexPozinsky

    AlexPozinsky New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    6
    Так быдлокодить же буду, а не копипастить XD
     
  9. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    AlexPozinsky,

    Если не использовать таблицу остатков, CRC кодируется в десяток инструкций. Ну и другие хэш-функции есть, ADLER32 к примеру.

    ----8<----
    Стэк для .Com по-любому располагается выше всего, что было загружено из файла (если правильно помню исходник DOS, sp в общем случае инициализируется нулём, а push 0 даёт 0xFFFE). Проверяя целостность до запуска основного кода, волатильностью переменных можно пренебречь.
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    baldr
    это и имелось ввиду на случай если будет извращение помещающее стек в зарезервированные блоки внутри кода com файла (например стек для обработчиков прерываний)
     
  11. AlexPozinsky

    AlexPozinsky New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    6
    Господа, после исключительнейшей активности секса с TASM & DOSBOX я решил перехватывать прерывание открытия файла. Таки думал побыстрее.
    В результате родился следующий код:
    Код (Text):
    1. SEG segment
    2. assume cs:SEG, ds:SEG, es:SEG, ss:SEG
    3. org 100h
    4. start:
    5. jmp Init
    6. Int_21h_proc proc
    7. cmp ah, 3Dh
    8. je cmp_name
    9. jmp dword ptr cs:[Int_21h_vect]
    10.  
    11. cmp_name:
    12. cmp dx, offset File_name
    13. je change
    14. jmp dword ptr cs:[Int_21h_vect]
    15.  
    16. change:
    17. push al
    18. mov al, 00h
    19. pushf
    20. call dword ptr cs:[Int_21h_vect]
    21. pop al
    22. iret
    23. Int_21h_vect dd ?
    24.  
    25. File_name db '1.com'
    26. Int_21h_proc endp
    27.  
    28.  
    29. Init:
    30. mov ah, 35h
    31. mov al, 21h
    32. int 21h
    33. mov word ptr Int_21h_vect, bx
    34. mov word ptr Int_21h_vect+2, es
    35.  
    36. mov ax, 2521h
    37. mov dx offset Int_21h_proc
    38. int 21h
    39.  
    40. mov dx, offset Init
    41. int 27h
    42.  
    43. SEG ends
    44. end start
    Оно не работает. Никак. Ошибку я в упор не вижу, ну должна она работать. Наверное. Как сделать так, чтобы работала?
     
  12. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    хреновый способ дос вызовы перехватывать. надо тогда уж и биос вызовы перехватывать, а порты ввода-вывода никак не перехватишь в реальном режиме. лучше сравнивать. хотя хз, для курсовой может лишь бы работало...
     
  13. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    AlexPozinsky

     
  14. AlexPozinsky

    AlexPozinsky New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    6
    PSR1257, что там?!
     
  15. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    то там. ты сравниваешь значения указателей на строку. которые по определению не могут быть одинаковы.
    сравнивай строки и тебе может будет счастье.
     
  16. skomarov

    skomarov New Member

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