Cześc. Pisałem w tej sprawie do @msm, ale nie ma On chyba póki co czasu mi odpisać na prywatną wiadomość. Dlatego zwracam się z prośbą o pomoc na forum. Rzadko o coś proszę. A tutaj sprawa jest niełatwa, ponieważ nie dośc, że dotyczy czasów DOS'a to jeszcze ASM'a i pisania TSR'ów. I oczywiście wiem, że łamanie zabezpieczeń gier jest niezgodne z prawem. Ale tutaj moim celem jest gra, którą już legalnie będzie ciężko kupić, a poza tym była dołaczona z TSR crackiem i słowami z instrukcji za darmo do pisma CD-Action za pewne dość dawno temu. Chodzi o nawet fajną polską strategię "Polanie".
Otoż na http://olesio.eu/dos_asm.rar umieściłem DOSBox wraz konfiguracją, uruchamiającym batchem i odpowiednimi narzędziami, jak i samą grą. Pod F2 mamy oczywiście menu. Pliki *.asm są w NC skojarzone przy naciśnięciu entera z plikiem make_com.bat w C:\TASM. Natomiast po naciśnięciu F4 na plikach *.asm wywoływany jest skonfigurowany już Asm Edit. Jednak chyba najłatwiej edytować pliki źródeł pod jakimś wygodnym Windowsowym edytorem, a tylko kompilować pod DOSBoxem w drugim oknie po naciśnięciu entera na zapisanym pliku *.asm z nowym kodem. W katalogu C:\ASM są źródła. W pliku crack11.asm TSR do wersji 1.1 Polan, którą fartownie znalezłem na chomikuj, dzięki czemu mogłem zrobić patcha do bardziej dostępnej na sieci wersji 1.3 (źródło w pliku crack13.asm).
Oba te TSR'y działają ok i się unloadują. W katalogu C:\POLANIE mamy samą grę. Plik polanie1.exe to wersja 1.1, a polanie3.exe to wersja 1.3. Dzięki lamerskiej "analizie" pod Cheat Engine ustaliłem, że aby oryginalny crack z wersji 1.1 działał i omijał docs check również w wersji 1.3, należy dokonać porównania i patchować podstawiając w pamięci pod rejestr di
adres o zaledwie sześć bajtów mniejszy.
Kombinowałem samodzielnie, ale o asmie mam nikłe pojęcia, a o TSR'ach w ogóle. Kod plików crack*.asm w oryginale powstał dzięki dołączonemu Sourcerowi z dekompilacji oryginalnego cracka (jest on zawarty w pliku orgcrack.com w C:\POLANIE). Jedyne co w nim zmieniłem to zanopowałem wkurzające czekanie na dowolny klawisz (tekst musiał zostać, ale o tym napiszę za chwilę poniżej). W samym kodzie przearanżowałem jedynie układ tekstu w instrukcjach z db
.
Co chce osiągnąć? Mamy poniższy kod. Dodałem stałą [?] data_7f
. I teraz chciałbym, aby kod ten działał tak, że jeżeli porównanie po instrukcji mov di,data_7e
się nie powiedzie, to pod di, zostanie podstawiony adres ze stałej data_7f
i wtedy zostanie wykonane porównanie. W przypadku stawierdzenia pomyślnej wartości pod adresami ze stałych data_7e
lub data_7f
ma nastapić podstawienie pod di
prawidłowej stałej (data_7e
lub data_7f
) i nastąpić patchowanie w pamięci poniżej. Po czym zdjęcie ze stosu i zakonczenie, tak aby nie powodowało to problemów.
Z czym mam problem? Otóż moje wszelkie kombinacje z kodem, sprawiały albo zamrażanie się DOSBoxa (pomagało tylko Ctrl+F9 lub wyjście przez zamnięcie okienka po minimalizacji przez Alt+Enter). Innym razem patch nie działal ani na wersji 1.1 ani na 1.3 gry albo powodował, że się ona wcale nie uruchomiła po załadowaniu TSR'a (albo jakiś błąd albo dźwięk w tle i czarny ekran z tekstami jak po wyłaczeniu NC). A ja chciałbym z Waszą pomocą zrobić TSR uniwersalny obsługujący jednocześnie obie wersje gry.
Dodatkowo zmniejszenie lub zwiększenie długości tekstu po instrukcjach db
powoduje, że TSR się albo nie unloaduje po ponownym uruchomieniu albo też zamraża DOSBox'a. To też przydało by się poprawić. Jeżeli wiecie jak. Docelowo chciałbym tekst zmodyfikować i w kod wstawić tekst z pliku C:\ASM\tc.asc - z użyciem instrukcji db
i móc go wyświetlić bez problemów, zachowując możliwośc unloadowania. Dodatkowo tak napisać kod aby instrukcja jne loc_2
nie generowała błędu kompilacji (za pewne przez skok dalszy niż $FF instrukcji niżej, z czym też miałem problem).
Przepraszam za rozpisanie się. Jakby co dołaczam sam kod oryginalnego TSR'a wzbogacony o stałą data_7f
i liczę na Waszą pomoć i wskazówki. Tych, którzy piszą/pisali w asm i znają trochę TASM oraz pamiętają coś z DOS'a. Ja googlowałem za kursami ASM, ale znalazłem bardzo pobieżnie kursy z przykładami, których nie mam czasu całych studiować, chociaż to co doczytałem na nic konkretnego mnie nie naprowadziło.
Ja chętnie pomagam w problemach z Delphi / Pascalem, kiedy umiem, ale tutaj bez pomocy doświadczonych za wiele nie wskóram. A że lubie ogólny OldSkool i stare gry oraz te dawne czasy, to postanowiłem pokombinować :) Z góry dziękuję za pomoc w skutecznej modyfikacji kodu. A DOSBox'a z narzędziami oraz grą dołączyłem po to, aby ułatwić Wam kompilowanie kodu pod DOS'em i testowanie go z tą grą.
data_7e equ 398h
data_7f equ 392h
seg_a segment byte public
assume cs:seg_a, ds:seg_a
org 100h
crack proc far
start:
jmp real_start
data_1 db 'POLANIE crack by JdA/RoR/BoB 1996', 0Dh, 0Ah
db '=================================', 0Dh, 0Ah, 0Dh, 0Ah
db 'Crack installed in memory. '
db 'Run program again to uninstall.', 0Dh, 0Ah, 0Dh, 0Ah
db 0Dh, 0Ah, 'Notes:', 0Dh, 0Ah
db '------', 0Dh, 0Ah
db 'This is an old-school TSR crack. '
db 'Enjoy and read NFO for more details...', 0Dh, 0Ah
db 'Press any key to continue...', 0Dh, 0Ah, '$'
data_2 db 'POLANIE crack succesfully uninstalled.', 0Dh, 0Ah, '$'
data_3 db 0, 0
data_4 dw 0
data_5 dw 0, 0
crack endp
int_10h_entry proc far
cmp ax,13h
jne loc_2
pop word ptr cs:data_3
pop cs:data_4
push cs:data_4
push word ptr cs:data_3
push es
push di
push bx
push ax
push dx
mov ax,cs:data_4
sub ax,3E7h
mov es,ax
mov di,data_7e
cmp word ptr es:[di],568Ah
jne loc_1
mov byte ptr es:[di],8Ah
mov byte ptr es:[di+1],0D0h
mov byte ptr es:[di+2],80h
mov byte ptr es:[di+3],0EAh
mov byte ptr es:[di+4],64h
mov byte ptr es:[di+5],88h
mov byte ptr es:[di+6],56h
mov byte ptr es:[di+7],0FEh
mov byte ptr es:[di+8],0B6h
mov byte ptr es:[di+9],0
mov byte ptr es:[di+0Ah],0EBh
mov byte ptr es:[di+0Bh],27h
loc_1:
pop dx
pop ax
pop bx
pop di
pop es
loc_2:
jmp dword ptr cs:data_5
real_start:
push cs
pop ds
mov ax,3510h
int 21h
mov ax,234h
cmp ax,bx
je loc_3
mov word ptr data_5,bx
mov word ptr data_5+2,es
mov dx,offset int_10h_entry
mov ax,2510h
int 21h
mov ax,3
int 10h
mov dx,offset data_1
mov ah,9
int 21h
mov dx,2AAh
int 27h
loc_3:
mov dx,es:[bx-4]
mov ds,es:[bx-2]
mov ax,2510h
int 21h
mov ah,49h
int 21h
push cs
pop ds
mov ax,3
int 10h
mov dx,offset data_2
mov ah,9
int 21h
mov ax,4C00h
int 21h
int_10h_entry endp
seg_a ends
end start
No chyba, że ktoś wie na przykłąd jak coś działającego identycznie jak opisałem napisać w Turbo Pascalu i ma jakieś kody z dawnych czasów oraz wskazówki to chętnie spojrzę. Bo na necie są różne TSR'y w TP, ale nie można ich kompletnie unloadować (to może nie aż taki problem), ale nie wiem jak szukać, porównać i spatchować pod TP pamięć o takim samym adresie jak robi to ten TSR. Wiadomo pod Windowsem nie ma z tym problemu :)