TSR w TASMie przechwytujący przerwania 16h lub 21h bez zwiech.

0

Cześć.

Nie mamy działu ASM, więc pisże tutaj. Prośba aby wypowiedziały się osoby ogarniąjące pisanie w TASMie i temat oldskoolowych TSR'ów. Gdyż po raz kolejny męczę ten temat. Mamy taki kod jak poniżej. I działa on idealnie pod DOSBoxem z grą "Robbo". Myślę, że Pan Janusz Pelc się po latach nie obrazi, bo gra jest nie aktualniei tak do kupienia :) A Poniższy kod jest udoskonalonym TSR'em na bazie analizy połamania doxchecka w tej grze swego czasu przez kogoś, kto podpisal się "Mroova The Great". Moj TSR calkiem przeskakuje doxchecka w tej grze, tak jak został on pominięty w wersji anglojęzycznej gry, co można zobaczyć na letsplayach na YouTubie. I tutaj problemu nie ma, bo przechwytujemy przerwanie 10h używane akurat w tej grze. Ale do rzeczy. Pytanie. Czy na bazie poniższego kodu da się zrobić TSR, który po sprawdzeniu odpowiedniej warotści w DS gry, pozwoli na reagowanie ba przerwanie najlepiej 16h? Bo takie obsługuje docelowa gra, dla ktorej chcialbym napisać nowy TSR i podmienić jej dane w pamięci, wykrywając cały cxas wciskane znaki bez względu na to jakie one są. W tej chwili podmiana po ,35 z 10 na 16 lub 21 powoduje że pod Norton Commanderem TSR powoduje zwiechy lub "kaszanienie się grafiki". Natomiast wywołany poza NC, przed uruchomieniem docelowej gry ("Larry 2" w wersji angielskiej) powoduje zawieszanie się. I gra się w ogóle nie uruchamia, a prompt "wisi". Jak to rozwiązać? Prosił bym o przykład poprawienia poniższego kodu. Docelowo dane wpisane do pamięci jak i sprawdzane adresy będą oczywiście inne pod kątem gry Larry 2. Z góry dziękuję za wskazówki dla mnie maniaka grzebania w old Dosowych grach przy niemal niesety zerowej znajomości ASM'a pod DOS, bardzo cenne :)

.model tiny
.code
.386
org 100h
Start:
        jmp  RealStart
OldProc dd 0
TrainerProc:
        push    bp
        mov     bp,sp
        pusha
        push    es
        push    ds
        mov     ax,word ptr ss:[bp+4]
        sub     ax,488h
        mov     ds,ax
        mov     si,039CAh
        cmp     dword ptr ds:[esi],0F804E80Eh
        jne     EndOfTrainer
        mov     byte ptr ds:[si],0EBh
        mov     byte ptr ds:[si+1],02h
EndOfTrainer:
        pop  ds
        pop  es
        popa
        pop  bp
        jmp  dword ptr cs:[OldProc]
RealStart:
	mov  ax,3
        int  10h
        mov  ah,9
        mov  dx,offset LogoText
        int  21h
        mov  si,81h
        mov  ax,3510h
        int  21h
        cmp  bx,offset TrainerProc
        jne  InstallNow
        mov  dx,word ptr es:[OldProc]
        mov  ax,word ptr es:[OldProc+2]
        mov  ds,ax
        mov  ax,2510h
        int  21h
        mov  ah,49h
        int  21h
        mov  ax,cs
        mov  ds,ax
        mov  ah,9
        mov  dx,offset UninstalledText
        int  21h
        mov  ax,4c02h
        int  21h
InstallNow:
        mov  ax,word ptr ds:[2ch]
        mov  es,ax
        mov  ah,49h
        int  21h
        mov  ax,3510h
        int  21h
        mov  word ptr cs:[OldProc],bx
        mov  word ptr cs:[OldProc+2],es
        mov  ax,2510h
        mov  dx,offset TrainerProc
        int  21h
        mov  ah,9
        mov  dx,offset InstalledText
        int  21h
        mov  dx,offset RealStart
        int  27h
LogoText db 13,10,13,10
                db '          ________  _________  ____ _________ __________  ____ ________'
                db 13,10
                db '       E _\    __/_/      \  \/   /_    _   /_\__   /_  \/   /_   /   /_'
                db 13,10
                db '      H  \    /   /   /   /       _/   ____/   _    _/   \   _/__     _/'
                db 13,10
                db '     T   /________\______/___\/___\___/   /_________\___\____\/_______\spot'
                db 13,10,13,10
                db '           Robbo (C) xland/L.K. Avalon - 100% perfect crack by olesio'
                db 13,10
                db '           Adapted from source code of Gods trainer by beanus & CoxoC'
                db 13,10,13,10,'$'
InstalledText   db '                     Crack has been installed in memory.',13,10,13,10,'$'
UninstalledText db '                     Crack has been removed from memory.',13,10,13,10,'$'
end Start
1

Zachowaj (i odtwórz) też ax,bx,dx,si oraz flafi - czyli wszystko co zmieniasz, pamiętaj że to jest przerwanie, czyli program zakłada ze zmienią się tylko te rejestry które są opisane w dokumentacji.

0

Dziękuję za odpowiedź. Jednak sam sobie już poradziłem. Póki co napisałem prosty fix zmieniający działanie starego playera modułów IPLAY w wersji 1.22 pod DOS. Wkurzalo mnie, że musi on trzymać i odczytywać config z C:\IPLAY.CFG i to śmieci mi w podkatalogu z DOSBoxem gdzie trzymam iune pliki, a lubię jeśli nie potrzeba aby C:\ nie zawieralo plików. Nie dało się zastąpić C:\ .\\, bo wtedy zawsze musieliśmy uruchamiać exeka iplay.exe z katalogu z takim plikiem. Także podmieniłem to na takiej samej długości wpis dla istniejącego podkatalogu C:\NC i tam umieściłem plik o nazwie ip.cfg. Poniżej prawidłowy kod. Po prostu powyższy kod, był kopiowany z kodu Trainera TSR do gry "GODS" napisanego przez beanusa i CoxoC'a. Kod wraz z artykułem był opublikowany w starym zinie CrackPL "BadIdea" (issue 0).

Poniższy kod jest idalny wedlug mnie i będę musiał swoje inne TSR'y, tak raczej też poprawić. Mianowicie mamy tutaj czyszczenie ekranu przed napisami, mamy obslugę znacznika, ktory powinniśmy ustalić na uniwersalny ciąg znaków. Mamy stałą tsr_irq, dzięki której możemy ustalić na jakie IRQ ma reagować TSR. Oczywiście z obsługą 21h co wykazały moje testy nie ma już problemów. Brakowało po prostu chyba prawidłowego kodu przywracania starej obslugi przerwania i stad zwiechy. A z 09h lub 10h jakimś cudem to działalo prawidłowo. Chociąz był problem, bo bez znacznika, TSR o podobnej długości i offsecie nowej procki uruchominy dla innego programu unloadował się zamiast załadować.

Oczywiście zamiast wpisywanie parametru -u dla uninstallu z pamięci jest sprawdzanie znacznika i odpowiednia obsluga. Co załatwia problem z wykrywaniem obecności akurat tego TSR'a w pamięci i jego loadem/unloadem. Mamy też przypisanie DS, także ustalmy sobie tylko różnicę pomiędzy CS i DS (na plus bądź minus) pod debuggerem DosBOXowym lub SICE pod DOS'a i "wuala" ;) Akurat tutaj DS wynosi CS + 37Ah Ponieważ najczęściej można operować na DS w przypadku trainerów, ale i patchy/fixów/cracków TSR też powinno to zdać egzamin. Sprawdzanie poprzedniej wartości jest zrobiona linijka po linijce, a nie jako na przykład porównanie wartości DWORD. Po to żeby było to czytelniejsze z czym porównujemy, kiedy na przykład na szybko podejrzymy sobie nasz kod pod HIEW. Albo innym wygodnym HexEdytorem z możliwością podglądu zawartości pliku jako opkodów. Poza tym wtedy nie musimy sobie odwracać warotści jak przy porównaniu liczby. Sorry za rozpisanie się i mam nadzieję, że to się komuś przyda jeżeli będzie musiał fixnąc jakiś spakowany Dosowy kod przez napisanie TSR do skompilowania pod TASMem.

TSR_IRQ equ 21h
.model tiny
.code
.386
org 100h
Start:
        jmp  RealStart
OldProc dd 0
MyMarker db 'AN_IPLAY_FIX_BY_OLESIO'
My_Marker_Length equ $ - offset MyMarker
TSRProc:
        push    bp
        mov     bp,sp
        add     bp,2
        pusha
        push    es
        push    ds
        push    word ptr ss:[bp+2]      ;CS
        pop     ax
        add     ax,37Ah                 ;AX+???=DS
        mov     es,ax                   ;ES=CS
        mov     ds,ax                   ;DS=DS
        mov     esi,010136Fh
        cmp     byte ptr ds:[si+0],43h
        jne     EndOfTSR
        cmp     byte ptr ds:[si+1],3Ah
        jne     EndOfTSR
        cmp     byte ptr ds:[si+2],5Ch
        jne     EndOfTSR
        mov     byte ptr ds:[si+0],43h
        mov     byte ptr ds:[si+1],3Ah
        mov     byte ptr ds:[si+2],5Ch
        mov     byte ptr ds:[si+3],4Eh
        mov     byte ptr ds:[si+4],43h
        mov     byte ptr ds:[si+5],5Ch
        mov     byte ptr ds:[si+6],69h
        mov     byte ptr ds:[si+7],70h
        mov     byte ptr ds:[si+8],2Eh
        mov     byte ptr ds:[si+9],63h
        mov     byte ptr ds:[si+10],66h
        mov     byte ptr ds:[si+11],67h
EndOfTSR:
        pop  ds
        pop  es
        popa
        pop  bp
        jmp  dword ptr cs:[OldProc]
RealStart:
	mov  ax,3
        int  10h
        mov  ah,9
        mov  dx,offset LogoText
        int  21h
        mov  si,81h
        mov  ah,35h
        mov  al,TSR_IRQ
        int  21h
        mov  si,offset MyMarker
        mov  di,si
        mov  cx,My_Marker_Length
        cld
        repe cmpsb
        jne  InstallNow
        mov  dx,word ptr es:[OldProc]
        mov  ax,word ptr es:[OldProc +2]
        mov  ds,ax
        mov  ah,25h
        mov  al,TSR_IRQ
        int  21h
        mov  ah,49h
        int  21h
        mov  ax,cs
        mov  ds,ax
        mov  ah,9
        mov  dx,offset UninstalledText
        int  21h
        mov  ax,4c02h
        int  21h
InstallNow:
        mov  ax,word ptr ds:[2ch]
        mov  es,ax
        mov  ah,49h
        int  21h
        mov  ah,35h
        mov  al,TSR_IRQ
        int  21h
        mov  word ptr cs:[OldProc],bx
        mov  word ptr cs:[OldProc +2],es
        mov  ah,25h
        mov  al,TSR_IRQ
        mov  dx,offset TSRProc
        int  21h
        mov  ah,9
        mov  dx,offset InstalledText
        int  21h
        mov  dx,offset RealStart
        int  27h
LogoText db 13,10,13,10
                db '          ________  _________  ____ _________ __________  ____ ________'
                db 13,10
                db '       E _\    __/_/      \  \/   /_    _   /_\__   /_  \/   /_   /   /_'
                db 13,10
                db '      H  \    /   /   /   /       _/   ____/   _    _/   \   _/__     _/'
                db 13,10
                db '     T   /________\______/___\/___\___/   /_________\___\____\/_______\spot'
                db 13,10,13,10
                db '           Interia Player v1.22 (c) Stefan Danes and Ramon van Gorkom'
                db 13,10
                db '           This patch replace C:\IPLAY.CFG file entry to C:\NC\ip.cfg'
                db 13,10
                db '           So you need to rename and move C:\iplay.cfg there first!!!'
                db 13,10
                db '           Written by olesio (please visit http://thecompany.pl site)'
                db 13,10
                db '           Adapted from source code of Gods trainer by beanus & CoxoC'
                db 13,10,13,10,'$'
InstalledText   db '                     Patch has been installed in memory.',13,10,13,10,'$'
UninstalledText db '                     Patch has been removed from memory.',13,10,13,10,'$'
end Start

1 użytkowników online, w tym zalogowanych: 0, gości: 1