Собственно имеется курсовик. Задание таковое - написать сторож COM файла - резидент, который висит в памяти и проверяет целостность оного. Если целостность нарушена - восстанавливает ее. Как то так. Суть вопроса - где найти пособие по написанию резидентов, например на TASM. И как проверить целостность файла(моя идея сделать его копию и каждый полминуты его восстанавливать видится категорически неправильной). Ну в общем Help и все такое)
А по какому предмету курсовик? Может искать его CRC. Всего или какой-то части? Иначе -распаковать удалить испорченный и заменить на распакованный?
AlexPozinsky т.к. размер com файла не может превышать 64 Кб (с оговоркой на эффективную часть и отсутствие оверлеев), то предлагаю просто тупо считать в отдельный сегмент в памяти и восстанавливать оттуда, целостность проверять можно простым побайтовым сравнением.
_sheva740, по ассемблеру же. Точнее - Организация ЭВМ. СRC на асме будет реализовываться... долго и усердно. Нужен простой и изящный метод, который будет работать) max7C4, то есть вы предлагаете мой метод, но уже с работой в памяти? Можно как нибудь намекнуть ассемблерным кодом или ссылкой, как сие реализовывать? То есть как в память загрузить?
AlexPozinsky что не изящного в Код (Text): mov ecx, sizeof buffer; можно исключить и полагать первым параметром mov esi, offset buffer; можно исключить и полагать вторым параметром mov ebx, CRC_Table mov edx, 0FFFFFFFFh xor eax, eax @@loop: lodsb xor al, dl shr edx, 8 xor edx, [eax*4+ebx] loop @@loop mov eax, 0FFFFFFFFh xor edx, eax retn да. намекаю: Код (Text): mov ax, 03D00h mov dx, offset file_name int 33 push save_seg ; или вместо этой и следующей строки можно предположить (но поверьте, что лучше этого не делать), что в ds уже загружен сегмент для загрузки файла pop ds xor dx, dx mov cx, iend-$$ mov bx, ax mov ah, 03F int 33 mov ah, 03Eh int 33 примерно так. насколько я помню дос. Это должно загрузить файла с именем записанным в file_name в сегмент с адресом из save_seg и еще намекну. Если резидент должен находиться в этом же самом com файле, то все еще проще. Если убрать все переменные из сегмента с загруженным com файлом, а резидента запихнуть в конец, то можно ничего в память не грузить, т.к. система сама загрузит весь этот com файл в память. просто останется позаботиться о его неизмености (т.е. исключить все переменные и стек из сегмента com файла).
AlexPozinsky незачто не советую. набирал в браузере, могут быть опечатки и не точности с теорией (всегда путал 3F и 40 функции, а еще значения флагов для 3D функции)
AlexPozinsky, Если не использовать таблицу остатков, CRC кодируется в десяток инструкций. Ну и другие хэш-функции есть, ADLER32 к примеру. ----8<---- Стэк для .Com по-любому располагается выше всего, что было загружено из файла (если правильно помню исходник DOS, sp в общем случае инициализируется нулём, а push 0 даёт 0xFFFE). Проверяя целостность до запуска основного кода, волатильностью переменных можно пренебречь.
baldr это и имелось ввиду на случай если будет извращение помещающее стек в зарезервированные блоки внутри кода com файла (например стек для обработчиков прерываний)
Господа, после исключительнейшей активности секса с TASM & DOSBOX я решил перехватывать прерывание открытия файла. Таки думал побыстрее. В результате родился следующий код: Код (Text): SEG segment assume cs:SEG, ds:SEG, es:SEG, ss:SEG org 100h start: jmp Init Int_21h_proc proc cmp ah, 3Dh je cmp_name jmp dword ptr cs:[Int_21h_vect] cmp_name: cmp dx, offset File_name je change jmp dword ptr cs:[Int_21h_vect] change: push al mov al, 00h pushf call dword ptr cs:[Int_21h_vect] pop al iret Int_21h_vect dd ? File_name db '1.com' Int_21h_proc endp Init: mov ah, 35h mov al, 21h int 21h mov word ptr Int_21h_vect, bx mov word ptr Int_21h_vect+2, es mov ax, 2521h mov dx offset Int_21h_proc int 21h mov dx, offset Init int 27h SEG ends end start Оно не работает. Никак. Ошибку я в упор не вижу, ну должна она работать. Наверное. Как сделать так, чтобы работала?
хреновый способ дос вызовы перехватывать. надо тогда уж и биос вызовы перехватывать, а порты ввода-вывода никак не перехватишь в реальном режиме. лучше сравнивать. хотя хз, для курсовой может лишь бы работало...
то там. ты сравниваешь значения указателей на строку. которые по определению не могут быть одинаковы. сравнивай строки и тебе может будет счастье.
max7C4 Намного интереснее проверять с переменными и стеком в области кода, контролировать область PSP, учитывать само распаковку в памяти, само модифицирующийся код. В этом случае следует при помощи встроенного дизассемблера выделить из проверяемого сегмента области данных, область стека, определить код модификации, и главное, из всего этого сделать правильные выводы. Хорошее задание!