Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Резидентная программа

Автор: taric 12.10.2004 16:16

Народ пожалуста помогите!!!!
Нужно написать резидентную програму которая при запуске воспринимала ключи. Например:
reside.com /q - вигружает програму из памяти

Автор: Dark 12.10.2004 18:58

Берусь попробовать

Автор: xds 12.10.2004 22:17

Эх, тряхнём стариной smile.gif

З.Ы. Советую почитать какой-нибудь мануал по DOS, ту часть, которая касается резидентных программ и мультиплексного прерывания.


Прикрепленные файлы
Прикрепленный файл  resid.zip ( 2 килобайт ) Кол-во скачиваний: 341

Автор: Dark 13.10.2004 4:00

По моему немного проще:

; Эта программа будет проверять, находиться ли она уже в памяти, и показывать
; глупое сообщение, если это так. В противном случае она будет инсталлировать
; в память и показывать другое сообщение.
; Если файл запустить с параметром /u то он его выгружает.
; Я специально оптимизацией не занимался, но мне будетинтересно если вы ее
; оптимизируете
; компилить: tasm tsr.asm
; tlink /t tsr.obj

.model tiny
.code
org 100h

start:
jmp fuck

newint9:

cmp ax,0ACDCh ; Пользователь вызывает нашу функцию?
je is_check ; Если да, отвечаем на вызов

cmp ax,0AAAAh ; Пользователь выгружает наш резидент?
je disabled ; Если да, выгружаем

jmp dword ptr cs:[oldint9] ; Или переходим на исходный int9

is_check:
mov ax,0DEADh ; Мы отвечаем на звонок
iret ; И принуждаем прерывание возвратиться

disabled:
push ds ;сохраняем изменяемые регистры
push dx
push ax

lds dx, dword ptr cs:[oldint9] ;загружаем адрес старого загрузчика
; в ds:dx
mov ax,2509h ; Функция для возврата адреса
; старого обработчика int9
int 21h

pop ax ;Востанавливаем регистры
pop dx
pop ds
iret ; И принуждаем прерывание возвратиться

oldint9 label dword
int9_off dw 0000h ;указатель на старый обработчик
int9_seg dw 0000h

fuck:
mov di,81h ;В области DTA смещаем смещение в di
mov al,' ' ;через все пробелы
mov cx,128
repe scasb
dec di
mov si,di

cmp word ptr [si],'u/' ;сравниваем c /u
jne install

mov ax,0aaaah ;выгружаем
int 9h
mov ax,0900h ; Показываем сообщение 3
mov dx,offset msg_disabled
int 21h
jmp final

install:
mov ax,0ACDCh ; Проверка на резидентность
int 9h ;
cmp ax,0DEADh ; Мы здесь?
je stupid_yes ; Если да, показываем сообщение 2

mov ax,3509h ; Если, инсталлируем программу
int 21h ; Функция, чтобы получить векторы
; INT 9h
mov word ptr cs:[int9_off],bx ; Мы сохраняем смещение в oldint9+0
mov word ptr cs:[int9_seg],es ; Мы сохраняем сегмент в oldint9+2

mov ax,2509h ; Функция для помещения нового
; обработчика int9
mov dx,offset newint9 ; где он находится
int 21h

mov ax,0900h ; Показываем сообщение 1
mov dx,offset msg_installed
int 21h

mov dx,offset fuck+1 ; Делаем резидент от смещения 0 до
int 27h ; смещения в dx используя int 27h
; Это также прервет программу

stupid_yes:
mov ax,0900h ; Показываем сообщение 2
mov dx,offset msg_already
int 21h

final:
int 20h ; Прерываем программу.

msg_installed db 'Глупый резидент не установлен. Устанавливаю...$'
msg_already db 'Глупый резидент жив и дает вам под зад!$'
msg_disabled db 'Убиваю глупый резидент. Убит наповал : (( $'

end start

Автор: xds 14.10.2004 4:33

Если после установки твоего резидента у какой-нибудь программы в момент IRQ 1 будет AX = 0ACDCh, то она действительно станет DEAD. А если AX = 0AAAAh, то ей конечно в пору кричать - но этого никто не услышит (MS не гарантирует сохранность значений регистров, не используемых для передачи параметров) :P

Возможно я преувеличиваю, тем не менее, твоя программа использует достаточно опасную стратегию (вероятность серьёзной ошибки уже по условию не равна 0).

Автор: Dark 14.10.2004 5:12

ИМХО - сильно преувеличиваешь, а вот одна бага есть - в момент установки прерывания если к нему будет обращение, то будут глюки =) там еще насо ограничивать текст CLI и STI

Автор: xds 14.10.2004 8:14

CLI и STI не нужны, т. к.:
a) о них обязан позаботиться сам системный вызов DOS (ah = 25h / int 21h);
б) при входе в обработчик прерывания (программного или аппаратного) процессор сам обнуляет флаг IF, а при выходе (по iret) - восстанавливает вместе с другими флагами. Т. е., к моменту передачи управления на обработчик int 21h, прерывания и так будут запрещены.