[ Pobierz całość w formacie PDF ]
.6.4.1.Korzystanie ze staÅ‚ych adresów w systemie (przerwania 21h i 2Fh)Ta metoda tunelingu jest możliwa tylko w wersjach DOS powyżej 5.00.SÅ‚uży ona doprzechwytywania obsÅ‚ugi przerwania 21h i ewentualnie 2Fh (przy okazji znajdowany jestoryginalny adres procedury obsÅ‚ugi tego przerwania, ulokowanej w kodzie systemuDOS).Wykorzystuje ona fakt, iż system DOS posiada w swym pierwszym bloku MCB(oznaczonym jako systemowy) standardowÄ… sekwencjÄ™ kodu (takÄ… samÄ… dla obuprzerwaÅ„ 21h i 2Fh), która zostaÅ‚a przedstawiona poniżej.Sekwencja kodu wystÄ™pujÄ…ca w DOS od 5.0 wzwyżDOS używa HMA DOS nie używa HMAAdres Kod Znaczenie Kod ZnaczenieSEG:OFS 90 90 NOP NOP EB 03 JMP $+3SEG:OFS+2 E8 xxxx CALL [IP+xxxx] E8 xxxx CALL [IP+xxxx]2E FF 2E yyyy JMP FAR 2E FF 2E JMP FARSEG:OFS+5CS:[yyyy] CS:[yyyy]Dla przerwania 21h powyższa sekwencja kodu wystÄ™puje pod adresem SEG:OFS, gdzieOFS jest równy 109Eh (w wersji DOS od 5.00 do 6,22) lub 0FB2h w wersjach powyżej6.22 (np.DOS 7.0, wystÄ™pujÄ…cy z systemem Windows 95).W przypadku przerwania 2Fh OFS jest równy: 10C6h (dla DOS 5.00 - 6.22) i 0FDAh(dla wersji 7.00).Wartość SEG jest wartoÅ›ciÄ… zwracanÄ… przez funkcjÄ™ 52h w rejestrze ES.Na podstawiepowyższych danych Å‚atwo odczytać adres pierwotnego adresu procedury int 21h,korzystajÄ…c z nastÄ™pujÄ…cej sekwencji:MOV AH,30H ; funkcja - we%0Å„ wersjU systemuINT 21h ; wywo%aj funkcjUXCHG AL,AH ; zabieg kosmetyczny - aby pÇ%0Å„niejsze; porÇwnanie by%o bardziej przejrzysteMOV BX,109EH ; offset dla wersji 5.00 - 6.22CMP AX,0500h ; czy wersjaJB NIEDZIAúA ; jeeli tak, to tunneling nie dzia%aCMP AX,0622h ; czy wersja wiUksza od 6.22 ?JB Wer5_6_22MOV BX,OFB2h ; nowsze wersje DOS - inny offsetWer5_6_22:PUSH BX ; zachowaj offset na stosieMOV AH,52h ; funkcja - podaj adres do LLINT 21h ; wywo%aj funkcjUPOP BX ; teraz ES:BX wskazuje na sekwencjU z tabeliCMP WORD PTR ES:[BX],9090h; czy jedna z sekwencji ?JE JEST ; jest czUe` sekwencjiCMP WORD PTR ES:[BX],03EBh ; czy druga z sekwencji ?JNE NIEDZIAúA ; nie ma sekwencji - tuneling nie dzia%aJEST:CMP BYTE PTR ES:[BX+2],OE8h; czy druga czUe` sekwencji ?JNE NIEDZIAúA ; nie ma sekwencji - tuneling nie dzia%aCMP WORD PTR ES:[BX+5],0FF2Eh ; czy trzecia czUe` sekwencji ?JNE NIEDZIAúA ; nie ma sekwencji - tuneling nie dzia%aCMP BYTE PTR ES:[BX+7],02Eh ; czy czwarta czUe` sekwencji ?JNE NIEDZIAúA ; nie ma sekwencji - tunelling nie dzia%a; znaleziona pe%na sekwencjaMOV BX,WORD PTR ES:[BX+8]LES BX,DWORD PTR ES:[BX] ; ES:BX wskazuje na oryginalny adres int 21hNIEDZIALA:Dla przerwania 2Fh sekwencja bÄ™dzia wyglÄ…daÅ‚a bardzo podobnie, z jedynÄ… zmianÄ… wprogramie wartoÅ›ci 0FS z 109Eh na 10C6h i 0FB2h na 0FDAh.6.4.2.Wykorzystanie trybu krokowego procesora (ang.tracing)Do znalezienia oryginalnych wejść do procedur obsÅ‚ugi przerwaÅ„ można wykorzystaćtryb krokowy procesora.Po zainstalowaniu odpowiedniego monitora pod przerwaniemkrokowym wykonuje siÄ™ jakÄ…Å› testowÄ… funkcjÄ™, której wynik jest już wczeÅ›niej znany (np.przez uprzednie wywoÅ‚anie tej funkcji bez monitora przerwania krokowego).Na bazietego możemy stwierdzić (bÄ™dÄ…c w procedurze obsÅ‚ugi przerwania krokowego), czyznajdujemy siÄ™ w poszukiwanym, oryginalnym kodzie przerwania, poprzez testowaniezawartoÅ›ci odpowiedniego rejestru lub ich grupy.Dla przerwania int 21h wygodnie Å›ledzić np.funkcjÄ™ 62h (wez aktualny adres PSP) lubfunkcjÄ™ 30h (wez numer wersji DOS), dla przerwania int 13h takÄ… funkcjÄ… może być 08h(wez informacjÄ™ o parametrach dysku).6.4.3.Tuneling rekursywny (ang.recursive tunneling)Ze wzglÄ™du na możliwość blokowania trybu krokowego procesora do znalezieniaoryginalnego adresu przerwania 21h można zastosować tzw.tuneling rekursywny.Polega on na tym, iż w otoczeniu aktualnej procedury obsÅ‚ugi przerwania (wskazywanejprzez tablicÄ™ przerwaÅ„), poszukuje siÄ™ kodów wywoÅ‚aÅ„ dalekich procedur lub skoków,dziÄ™ki którym zwykle przekazywane jest sterowanie do kolejnego elementu Å‚aÅ„cuchaobsÅ‚ugi przerwania.Najczęściej Å‚aÅ„cuch taki skÅ‚ada siÄ™ z nastÄ™pujÄ…cych sekwencji:Element_l.; pierwszy element %aÝcuchaSkok_do_Elementu_2.; pamiU` wykorzystywana przez inne programyElement_2.; drugi element %aÝcuchaSkok_do_Elementu_3.; pamiU` wykorzystywana przez inne programyElement_N
[ Pobierz całość w formacie PDF ]