PROGRAMY REZYDENTNE Terminate and State Resident, TSR
Transkrypt
PROGRAMY REZYDENTNE Terminate and State Resident, TSR
PROGRAMY REZYDENTNE Terminate and State Resident, TSR O co tu chodzi Podstawowe reguły Jak może program zostać rezydentnym Przechwytywanie przerwań Jak się samoznaleźć w pamięci Aktywacja TSR-u. Problemy z braku stabilności Korzystanie z pamięci Sytuacje konfliktowe Zakończenie Pytania O co tu chodzi TSR z bliska Funkcje i zastosowanie: Praca w tle Przechwytywanie przerwań Draiwery – sterowniki dla urządzeń wewnętrznych Monitory antywirusowe Warto zapamiętać: Na TSR-ach jest oparta duża część programów systemowych i aplikacyjnych konieczne jest przestrzeganie para reguł przy pisania TSR-ów Problematyka w tym wykładzie jest wspólna dla Jak może program zostać rezydentnym Dla *.COM: INT 27H Wejście: DX – adres początku części nierezydentnej; CS – początek PSP Przykład: LEA DX,NO_RES INT 27H Dla *.EXE i *.COM: funkcja DOS-a 31H Wejście: АН – 31Н, AL – kod wyjścia, DX – ilość paragrafów do załadowania Przykład: tsr1.asm Przechwytywanie przerwań To już było... Ważne tu: Przerwania 21h, 13h, 25h i 16h – owszem da się je używać, jednak BARDZO ostrożnie! Używać PUSH/POP technikę „na całego”! korzystać z CALL albo JMP (dalekie) Pisać tak, aby To nie przeszkadzało innym programom, czyli pracować grzecznie w tle Przed wywołaniem przerwania, wszystkie potrzebne rejestry mają zawierać to co zawierali one przed wejściu do Waszej procedury Przed wyjściem z Waszej procedury, te rejestry mają zawierać to co mieli przed wejściem do niej Przerwania sprzętowe 8 i 9 dbają o zachowanie rejestrów – tam masz zadbać tylko o swojej ingerencji Procedura obsługująca przerwania w TSR nr1 INT_N PPOC FAR ;chowamy rejestrów +rejestru znaczników PUSHF PUSH AX ..... ..............;wykonujemy pracę ;i zwracamy zawartości rejestrów ..... PОР АХ POPF ;wołamy przerwania CALL DWORD PTR CS:OLD_INT_N ;chowamy rejestrów +rejestru znaczników PUSHF PUSH AX .... ..............;wykonujemy pracę ;i zwracamy zawartości rejestrów ..... PОР АХ POPF IRET INT_N ENDP Procedura obsługująca przerwania w TSR nr2 INT_N PPOC FAR ;chowamy rejestrów +rejestru znaczników PUSHF PUSH AX ....... ..............;wykonujemy pracę ;i zwracamy zawartości rejestrów ...... PОР АХ POPF ;wołamy przerwania JMP DWORD PTR CS:OLD_INT_N INT_N ENDP Jak się samoznaleźć w pamięci CZYLI JAK ZDBAĆ ABY SIĘ 100 RAZY NIE ŁADOWAĆ = NIE ZAJMOWAĆ WIĘCEJ MIEJSCA NIŻ JEST POTRZEBNE Zewnętrzny „markier” Wewnętrzny „markier” (metoda „funkcji pomocniczej”) Metoda skanowania bloków pamięci Zewnętrzny „markier” W programie umieszczamy „markier” – ze zwyczaj słowo, tuż przed wektorem przerwania Najprostszy sposób (+) Jeżeli inny program wykorzysta ten sam wektor, to już się program nie samoznależe (-) przykład ;FRAGMENT CZĘŚCI REZYDENTNEJ – JEŻELI PROGRAM JUŻ ZAŁADOWANY, TO TA CZĘŚĆ JEST JUŻ W PAMIĘCI ......... MARKIER DW 12ABH INT_8 PROC FAR ....... INIT_8 ENDP ............. ;FRAGMENT CZĘŚCI INSTALACYJNEJ – SPRAWDZA OBECNOŚĆ MARKIERA ........ MOV AX, 3508H INT 21H CMP WORD PTR ES:[BX-2],MARKIER JNE LADUJ ................ Wewnętrzny „markier” (metoda „funkcji pomocniczej”) Wykorzystać można jakąś nieistniejącą funkcję przerwania jakiegoś, np.. 21h, lub 16h itd.. No więc my ją nadpisujemy, a ona zwracać ma wartość (a la MARKIER) w danym rejestrze, np. AX (klasycznie :) I jak się funkcja TA wywoła (jasne że program nasz ma to zrobić – część instalacyjna, oczywiście) – sprawdzamy, wartość, przez niej zwracana, czyli nasz MARKIER Metoda jest o wielu bardzo stabilna, jednak czasami mogą się funkcje ‘pokryć’.... (-) Przykład ;FRAGMENT CZĘŚCI REZYDENTNEJ – JEŻELI PROGRAM JUŻ ZAŁADOWANY, TO TA CZĘŚĆ JEST JUŻ W PAMIĘCI ..................... INT16 PROC СМР АН,20Н JNZ CONT MOV АХ,789АН IRET CONT: JMP DWORD PTR CS:OLD16 INT16 ENDP ............................................................................ ;FRAGMENT CZĘŚCI INSTALACYJNEJ – SPRAWDZA OBECNOŚĆ MARKIERA ............... MOV АН,20Н INT 16H CMP АХ,789АН JZ YES ................ Metoda skanowania bloków pamięci Blok pamięci, nagłówek bloku,... Skanowane są wszystkie bloki – szukamy naszego TSR-a Jest to najbardziej bezpieczną i wiarygodną metodę samolokalizacji się w pamięci. Jest nieco bardziej skomplikowana Przykładowa procedura ; sprawdzamy nasz ZNACZNIK MOV BX, CS: ZNACZNIK CMP WORD PTR DS:[103H],BX ; tu offset zależy od naszego programu JZ _END CONT5: ; czy ten blok nie jest ostatni? CMP BYTE PTR ES:[0],'M‘ ; - to nie ostatni blok JZ CONT4 SCAN PROC PUSH BX PUSH DS PUSH DX PUSH SI ; w SI ładujemy segment aktualnego programu (nie rezydentnemu) MOV SI, CS ; znajdujemy pierwszy blok MOV AH, 52H INT 21H MOV ES, ES:[BX-2] ; ładujemy w ES segment MCB MOV AX, 1 LOO: CMP WORD PTR ES:[1], 0 ; JZ CONT5 PUSH ES POP BX INC BX ;czy ten segment ? CMP SI,BX JZ CONT5 MOV DS,BX ; (Z – ostatni blok) XOR AX, AX JMP SHORT _END CONT4: ; znajdujemy adres nagłówka następnego bloku MOV DX, ES:[3] ; rozmiar bloku MOV BX,ES ADD BX, DX INC BX MOV ES, BX JMP LOO _END: MOV BX, ES INC BX MOV ES, BX POP SI POP DX POP DS POP BX RET SCAN ENDP Aktywacja TSR-a. Problemy z braku stabilności Sprawdzanie klawisza/kombinacja klawiszów A z INT 21H?! Flag DOS-u (f 34H) To działa! Aby tylko odczekać na wyzerowania się znacznika! A jak ‘uderzymy’ na funkcja oczekiwanie na klawisz!!!! A można przechwycić int 21h Więc jak mamy czekać na klawisz – można sprawdzić bufor klawiatury i tylko wtedy pozwalać na pobierania, jak TAM coś będzie! Bufora można sprawdzić poprzez INT 16H, np. ???przykład INT21 РРОС FAR STI CMP АН,0АН JZ A1Z JMP SHORT A2Z A1Z: PUSH CX PUSH AX A3Z: MOV CX,OFFFFH A4Z: MOV AH,1 LOOP A4Z INT 16H JZ A3Z POР AX POP CX A2Z: MOV CS:FLAG_21,1 PUSHF CALL CWORD PTR CS: [OFF_21] MOV CS:FLAG_21,0 IRET INT21 ENDP Korzystanie z pamięci /Jak zarezerwowania pamięć tak aby innym nie przeszkadzać/ Podstawowy sposób: Wykorzystywanie pamięci wewnętrznej Wewnątrz programu Zarezerwować sobie pod czas ładowania Dane – na dysk Wybrać sobie obszar (oby tylko nie systemowy ;) Przy aktywacja TSR – zastępujemy ten obszar własnymi danymi Dezaktywacja – zwracamy stara zawartość!!! Wykorzystywanie dodatkową i rozszerzoną pamięć Sytuacje konfliktowe Przy odinstalowania programu warto dobrze zadbać o wektorach przerwań! Funkcje 49h i 4Ah Sprawdzić czy do naszego programu nie wskazują wektory! Uważać na Stos!!! Problem ładowania się w trakcie pracy innego TSR-a! (korekcje w przerwania klawiatury!) Dbać o reżym ekranu – czy pasuję do naszego TSR-a Praca z plikami – przechwycić ewentualnie PSP przerwanego programu, żeby nie było kolizji..(f50h) Problemy z f59h (zamieszania w odczytu kodu błędu...).... Problem niestabilności MS DOS-a (system. stos: f5Dh, al=6) Jeszcze raz o tym samym.. PSP Punkt wejścia podczas ładowania programu Punkt wejścia podczas aktywizacji programu Main PROC JMP INIT Dane rezydentne Rezydentna część programu Entry: .....rozkazy rezydentne Main ENDP INIT PROC ...Rozkazy ...inicjalizacyjne MOV AH, 31H INT 21H INIT ENDP END Main Część programu, odrzucana po instalacji