e-mail    Debatní kniha    Mapa stránek    Hlavní  
 perličky 
 

Aktivace rezidentů trochu jinak - aneb ,,Síťový budíček"

Petr Tůma

Tato perlička si klade za cíl upozornit na poněkud nezvyklý způsob aktivace rezidentního programu. Nejprve malé shrnutí. Snad neznámějším způsobem aktivace rezidentu je přesměrování některého z přerušovacích vektorů na sebe samého. Tento způsob je převelice dobře známý a lze ho poměrně jednoduše sledovat.

Dalším způsobem je využít vlastností procesoru či obecněji hardwaru a nechat se aktivovat jím. Sem spadají například breakpointy (hardwarové i softwarové), režim Trace procesoru, různé chybové interrupty a přerušení od periferií. Lze sice namítnout, že ty patří také pod normální přerušení, ale mají jednu zvlášnost - většinou se o nich předpokládá, že budou přesměrovány.

Ale zcela transparentní pro všechny antivirové a podobné prostředky je způsob, kdy nějaký naprosto regulérní a případně i zcela nezbytný program - nejlépe samotný operační systém - sám zavolá rezidentní program. Problém je v jedné věci - jak ho k tomu donutit? To by ještě nebyl takový problém, stačí přepsat začátek instrukcí JMP FAR a je to OK. Ale to je jen jednorázové řešení; co když je potřebná periodická aktivace (a že většinou potřeba je!)? Tak na to už běžné prostředky nestačí.

Níže uvedený program ukazuje jednu z cest, jak to udělat lze. Pracuje jen na síti Novell NetWare a vyžaduje, aby k ní byla připojena alespoň jedna stanice, která síti poskytuje nějaké služby file + print server, bridge=můstek apod.), ale není nutné být na síti nalogován. Jeho jedinou rozumnou činností je cyklické přepisovžní double wordu v paměti, ale upravit ho na nějakou inteligentnější a rozumnějši funkci je jednoduché.

Program komunikuje (prakticky se nechává aktivovat) prostřednictvím služeb IPX, což je na síti zcela nezbytná záležitost, proto ji nelze jednoduše odblokovat. Ovládaní modulu IPX bylo popsáno v Bajtu 11/92. V principu se zde využívá toho, že ona stanice, která nabízí síti nějaké služby, je MUSÍ PERIODICKY "vytrubovat" do sítě. Dělá to pochopitelně tak, že vyšle speciální datový packet. Prakticky jedinou jeho speciální vlastností je jeho číslo přípoje, tj. 452h. To je pevně stanoveno a Novellem vyhrazeno.

Struktura packetu: Offset Obsah Typ Pořadí ----------------------------------------------------------- 0 Záhlaví IPX packetu byte(30) 30 Typ odpovědi word hi-lo 32 Typ obslužné stanice word hi-lo 34 její jméno byte(48) 82 Adresa sítě byte(4) hi-lo 86 Adresa vývodu byte(6) hi-lo 92 Adresa přípoje word hi-lo 94 Počet intersítí word hi-lo Význam jednotlivých položek je následující: Záhlaví IPX packetu bylo popsáno ve výše uvedeném článku. Typ stanice určuje obor služeb, které stanice poskytuje: Typ Význam ------------------------------- FFFFH Wild = všechny typy 0000H Neznámý typ 0003H Print server 0004H File server 0009H Archive server 0024H Remote bridge server 4000H ... 7FFFH Dynamicky přidělované

Jméno je jasná záležitost, adresa sítě, adresa vývodu a adresa přípoje tvoří dohromady síťovou adresu oné stanice. Počet intersítí je počet lokalních sítí, přes které zpráva přešla.

Tento packet musí být periodicky vysílán do sítě. Perioda není veliká - 60 s, ale to neznamená, že za ni by nutně musel přicházet jen jeden packet, protože v síti je většinou více stanic, které poskytují nějaké služby.

.386c code segment use16 assume cs:code org 100h start: jmp install ipxentry dw ?,? old_val dd 0 CHECK_OFF equ 21h*4 CHECK_SEG equ 0 ecb: dd 0 dw offset intr,? db ?,? dw 452h db 4 dup (?) db 12 dup (?) db 6 dup(0ffh) dw 1 dw ipx_offset dw ? dw 96d ipx_offset: dw 0 db 96d,0 db 0,0 dd 0 db 6 dup(0ffh) dw 452h dd 0 db 6 dup(0) dw 452h db 96d dup(?) intr: call fill mov ax,CHECK_SEG push ds mov ds,ax mov bx,CHECK_OFF push eax mov eax,cs:[old_val] cli mov dword ptr ds:[bx],eax sti pop eax pop ds call listen retf listen: mov bx,4 mov di,offset ecb push cs pop es call dword ptr cs:[ipxentry] retn fill: mov ax,cs mov word ptr cs:[ecb+6],ax mov word ptr cs:[ecb+38d],ax retn install: mov ah,9 mov dx,offset mes1 int 21h mov ax,7a00h int 2fh cmp al,0ffh je s1 mov ah,9 mov dx,offset err1 int 21h mov ax,4c00h int 21h s1: mov cs:[ipxentry],di mov cs:[ipxentry+2],es push CHECK_SEG pop ds mov bx,CHECK_OFF mov eax,dword ptr ds:[bx] mov cs:[old_val],eax call fill xor bx,bx mov al,-1 mov dx,452h call dword ptr cs:[ipxentry] call listen mov ah,9 push cs pop ds mov dx,offset mes2 int 21 mov dx,(install-start)/10h+11h mov ax,3100h int 21h err1: db 'IPX modul not detected.',0dh,0ah,'$' mes1: db 'Memory DWORD checker 1.0 (c) 1993 by Petr' db 'Tuma',0dh,0ah,'$' mes2: db 'Program resident. Instalation status:' db ' OK.',0dh,0ah,'$' code ends end start


Pascal - hlavní
Překladače
Vlastní články
Převzaté články
Věci na stáhnutí
Odkazy k tématu
BP7 buglist
Chyba Run-time 200

BASIC