Join Date: Jul 2013
Posts: 10
|
Hallo miteinander,
Ich arbeite seit langer Zeit an dem alten Spiel KKND2: Krossfire. Da ich den Quellcode des Spieles leider nicht besitze, programmiere ich die Funktion größtenteils auf eigene Faust um. Folgende Sachen habe ich bereits erreicht:
- NoCD Patch - Singleplayer Suicid bei Checksum Change gepatcht (Memory Selfcheck) - Random Crash bei Checksum Change gepatcht (CreateFileA) - Win/Lose Trigger fail bei Checksum Change gepatcht (Memory Selfcheck) - alle Daten werden Lokal von der Festplatte geladen - Die Werte des Einheiten Editors wurden erhöht - Die Registry wird nichtmehr beim Spielstart abgefragt (Diverse Probleme innerhalb der Community) - Im Multiplayer zeigt er eine kleine Messagebox über das Ingame Chat System an das der Modloader aktiv ist (Kleine Spielerei nur)
Zum verständnis: Es handelt sich hierbei nicht um einen Hack sondern um einen Mod welchen jeder Spieler auf seinem Rechner installiert hat. Demnächst mit Autoupdate
Bevor ich allerdings anfange das Spiel mit diversen Mods zu versehen, möchte ich noch einige Probleme beheben bei dennen ich derzeit nicht weiter weiß.
meine Todo List:
- Auflösung erhöhen - Alternative lösung für mehr Maps in Multiplayer - DSound Hooken für MP3 Support - Startkapital ändern
Lange rede kurzer Sinn, ich zeige euch am besten einfach meine Probleme:
Problem 1: Höhere Auflösung
In KKND sind genau 3 Auflösungen vorgegeben: 640x480 | 800x600 | 1024x768 Ich habe über OllyDBG in den Hex Werten die Angaben auf: 1024x768 | 1280x1024 | 1440x 900 geändert. (Höhere Auflösungen sehen unschön aus und bereiten Probleme z.b. das der Mauszeiger flackert und ein paar cm versetzt zu der eigentlichen Position dargestellt wird. Ausserdem zoomt durch eine FullHD Auflösung die Karte viel zu sehr raus... aber das nur als Randinfo .) Sobald jedoch die Auflösung höher als 1024x768 geht treten Ingame Probleme auf:
Das Spiel startet ganz normal. Die neue Auflösung wurde korrekt übernommen. Wenn ich jetzt jedoch versuche mit der Maus über die Bauleiste zu fahren die bei jedem Spiel rechts am Rand zu sehen ist, stürzt das Spiel genau an der Stelle ab wo die Bauleiste normalerweise sein müsste mit 1024x768.
Es handelt sich also um eine "unsichtbare" weitere Bauleiste. Wenn ich ganz unten am Rand mit der Maus entlang fahre kann ich problemlos auf die eigentliche Bauleiste navigieren und benutzen. Das passiert eben weil die "unsichtbare" Bauleiste immernoch mit 768 Pixeln berechnet wird und nicht mit 900 Pixeln.
Jetzt aber das Problem:
TEXT Code: 0043B9B0 /$ E8 2B4DFEFF CALL 004206E0 ; [noregkey.004206E0 0043B9B5 |. 85C0 TEST EAX,EAX 0043B9B7 |. 74 09 JZ SHORT 0043B9C2 0043B9B9 |. 8178 1C 80164 CMP DWORD PTR DS:[EAX+1C],00401680 ; Entry point 0043B9C0 |. 75 02 JNE SHORT 0043B9C4 0043B9C2 |> 33C0 XOR EAX,EAX 0043B9C4 \> C3 RETN
Bei dem Punkt 43B9B9 Bleibt der Code hängen da er über den EAX einen ungültigen Parameter übergeben bekommen hat. Dieser Codefetzen ist dafür zuständig zu Überprüfen ob die Maus über der Bauleiste ist. Wenn ich den CMP Befehl mit NOP ersetze wird die "unsichtbare" Bauleiste durch die änderung des Mauszeigers sichtbar wie er normal nur direkt über der Bauleiste sich ändert. Wenn ich den "unsichtbaren" Button anklicke dann stürzt das Spiel ebenfalls ab.
Der Check Code callt in der Ersten Zeile direkt die folgende Prozedur:
TEXT Code: 004206E0 /$ 85C9 TEST ECX,ECX ; noregkey.004206E0(guessed void) 004206E2 |. 7C 28 JL SHORT 0042070C 004206E4 |. 85D2 TEST EDX,EDX 004206E6 |. 7C 24 JL SHORT 0042070C 004206E8 |. 3B0D 8C9A4E00 CMP ECX,DWORD PTR DS:[4E9A8C] 004206EE |. 7D 1C JGE SHORT 0042070C 004206F0 |. 3B15 889A4E00 CMP EDX,DWORD PTR DS:[4E9A88] 004206F6 |. 7D 14 JGE SHORT 0042070C 004206F8 |. C1F9 05 SAR ECX,5 004206FB |. 8D0449 LEA EAX,[ECX*2+ECX] 004206FE |. C1E0 05 SHL EAX,5 00420701 |. C1FA 05 SAR EDX,5 00420704 |. 8B8490 807E4E MOV EAX,DWORD PTR DS:[EDX*4+EAX+4E7E80] 0042070B |. C3 RETN 0042070C |> 33C0 XOR EAX,EAX 0042070E \. C3 RETN
Die Funktion macht im prinzip nichts weiter als den Wert von einer dritten Funktion zu übernehmen, zu Überprüfen ob die Maus auf der Bauleiste ist, dann die Werte mit 2 Variablen vergleichen, und über die SAR befehle einfach so lange 0'en davor zu schieben bis das Programm auf einen 3-4 Stelligen Wert kommt der dann an die oben genannte CMP Funktion zur weiterverarbeitung übergeben wird.
Meine erste Theorie war das durch den SAR Befehl ggf. eine Stelle zuviel verschoben wird da ja auch die Auflösung in der Breite erheblich größer ist. Diese Theorie brauchte mich dann letztendlich zu der Hauptfunktion. Das hier ist die Funktion die den CMP Befehl anruft:
Diese wird hier nur in Teilen angegeben um nicht den ganzen Beitrag vollzumüllen:
TEXT Code: 00442FB0 /$ 55 PUSH EBP 00442FB1 |. 8BEC MOV EBP,ESP 00442FB3 |. 83EC 14 SUB ESP,14 00442FB6 |. A1 78AA4F00 MOV EAX,DWORD PTR DS:[4FAA78] 00442FBB |. 53 PUSH EBX 00442FBC |. 56 PUSH ESI 00442FBD |. 57 PUSH EDI 00442FBE |. 8B40 08 MOV EAX,DWORD PTR DS:[EAX+8] 00442FC1 |. 8BF9 MOV EDI,ECX 00442FC3 |. 83C0 18 ADD EAX,18 00442FC6 |. 8955 F4 MOV DWORD PTR SS:[LOCAL.3],EDX 00442FC9 |. 8B4F 24 MOV ECX,DWORD PTR DS:[EDI+24] 00442FCC |. 8945 FC MOV DWORD PTR SS:[LOCAL.1],EAX 00442FCF |. 33C0 XOR EAX,EAX 00442FD1 |. 897D F8 MOV DWORD PTR SS:[LOCAL.2],EDI 00442FD4 |. 8947 24 MOV DWORD PTR DS:[EDI+24],EAX 00442FD7 |. 8947 30 MOV DWORD PTR DS:[EDI+30],EAX 00442FDA |. 8947 2C MOV DWORD PTR DS:[EDI+2C],EAX 00442FDD |. 8B35 E8B14F00 MOV ESI,DWORD PTR DS:[4FB1E8] 00442FE3 |. 81FE E8B14F00 CMP ESI,OFFSET 004FB1E8 00442FE9 |. 894D F0 MOV DWORD PTR SS:[LOCAL.4],ECX 00442FEC |. BB 03000000 MOV EBX,3 00442FF1 |. 74 73 JE SHORT 00443066 00442FF3 |> 66:8B46 10 MOV AX,WORD PTR DS:[ESI+10] 00442FF7 |. 66:85C0 TEST AX,AX 00442FFA |. 0F8F 040E0000 JG 00443E04 00443000 |. 0FBF56 08 MOVSX EDX,WORD PTR DS:[ESI+8] 00443004 |. 8B5E 04 MOV EBX,DWORD PTR DS:[ESI+4] 00443007 |. B9 88B24F00 MOV ECX,OFFSET 004FB288 0044300C |. 8915 89B24F00 MOV DWORD PTR DS:[4FB289],EDX 00443012 |. C705 8DB24F00 MOV DWORD PTR DS:[4FB28D],4 0044301C |. C605 88B24F00 MOV BYTE PTR DS:[4FB288],0E 00443023 |. E8 88CBFFFF CALL 0043FBB0 ; [noregkey.0043FBB0 00443028 |. 8B06 MOV EAX,DWORD PTR DS:[ESI] 0044302A |. 8B4E 04 MOV ECX,DWORD PTR DS:[ESI+4] 0044302D |. 8948 04 MOV DWORD PTR DS:[EAX+4],ECX 00443030 |. 8B56 04 MOV EDX,DWORD PTR DS:[ESI+4] 00443033 |. 8B06 MOV EAX,DWORD PTR DS:[ESI] 00443035 |. 8902 MOV DWORD PTR DS:[EDX],EAX 00443037 |. 8B0D 00B24F00 MOV ECX,DWORD PTR DS:[4FB200] 0044303D |. 890E MOV DWORD PTR DS:[ESI],ECX 0044303F |. A0 10B34F00 MOV AL,BYTE PTR DS:[4FB310] 00443044 |. 8935 00B24F00 MOV DWORD PTR DS:[4FB200],ESI 0044304A |. 8BF3 MOV ESI,EBX 0044304C |. 84C0 TEST AL,AL 0044304E |. 74 07 JZ SHORT 00443057 00443050 |. FEC8 DEC AL 00443052 |. A2 10B34F00 MOV BYTE PTR DS:[4FB310],AL 00443057 |> BB 03000000 MOV EBX,3 0044305C |> 8B36 MOV ESI,DWORD PTR DS:[ESI] 0044305E |. 81FE E8B14F00 CMP ESI,OFFSET 004FB1E8 00443064 |.^ 75 8D JNE SHORT 00442FF3 00443066 |> 8BCF MOV ECX,EDI 00443068 |. E8 631F0000 CALL 00444FD0 0044306D |. 8B47 20 MOV EAX,DWORD PTR DS:[EDI+20] 00443070 |. 6A 01 PUSH 1 ; /Arg3 = 1 00443072 |. 68 000000C0 PUSH C0000000 ; |Arg2 = C0000000 00443077 |. 50 PUSH EAX ; |Arg1 00443078 |. E8 13C10200 CALL 0046F190 ; \noregkey.0046F190 0044307D |. 83C4 0C ADD ESP,0C 00443080 |. E8 AB05FFFF CALL 00433630 ; [noregkey.00433630 00443085 |. 85C0 TEST EAX,EAX 00443087 |. 75 73 JNZ SHORT 004430FC 00443089 |. B9 C8B04F00 MOV ECX,OFFSET 004FB0C8 0044308E |. E8 0DC7FFFF CALL 0043F7A0 ; [noregkey.0043F7A0 00443093 |. B9 0B000000 MOV ECX,0B 00443098 |. E8 A388FFFF CALL 0043B940 ; [noregkey.0043B940 0044309D |. 8A48 12 MOV CL,BYTE PTR DS:[EAX+12] 004430A0 |. 80E1 06 AND CL,06 004430A3 |. 80F9 06 CMP CL,6 004430A6 |. 75 1C JNE SHORT 004430C4 004430A8 |. 33D2 XOR EDX,EDX 004430AA |. 8915 48B24F00 MOV DWORD PTR DS:[4FB248],EDX 004430B0 |. 8915 4CB24F00 MOV DWORD PTR DS:[4FB24C],EDX 004430B6 |. 8915 50B24F00 MOV DWORD PTR DS:[4FB250],EDX 004430BC |. 8915 54B24F00 MOV DWORD PTR DS:[4FB254],EDX 004430C2 |. EB 0A JMP SHORT 004430CE 004430C4 |> B9 48B24F00 MOV ECX,OFFSET 004FB248 004430C9 |. E8 22EAFEFF CALL 00431AF0 ; [noregkey.00431AF0 004430CE |> 8B45 F4 MOV EAX,DWORD PTR SS:[LOCAL.3] 004430D1 |. 85C0 TEST EAX,EAX 004430D3 |. 74 27 JZ SHORT 004430FC 004430D5 |. E8 06DBFDFF CALL 00420BE0 ; [noregkey.00420BE0 004430DA |. 85C0 TEST EAX,EAX 004430DC |. 75 1E JNZ SHORT 004430FC 004430DE |. 8B15 DCB04F00 MOV EDX,DWORD PTR DS:[4FB0DC] 004430E4 |. 8B0D D8B04F00 MOV ECX,DWORD PTR DS:[4FB0D8] 004430EA |. C1FA 08 SAR EDX,8 004430ED |. C1F9 08 SAR ECX,8 004430F0 |. E8 BB88FFFF CALL 0043B9B0 ; [noregkey.0043B9B0 004430F5 |. 85C0 TEST EAX,EAX 004430F7 |. 74 03 JZ SHORT 004430FC
Meine Theorie schien mit dieser Prozedur garnichtmehr so falsch zu sein. Er errechnet die beiden X Y Werte, schreibt sie auf 004430DE in die Variablen und schiebt sie dann über SAR einfach 8 Stellen nach rechts. Dadurch das der Wert jetzt größer ist kommt am ende Datenmüll dabei raus. In der Praxis kann das aber eigentlich auch nicht sein denn sonst hätte ich vermutlich garnicht erst die unsichtbare Bauleiste.
Da ich hier keine Warez verbreiten möchte gebe ich die EXE nur auf Anfrage heraus. Ich würde mich allerdings sehr freuen wenn mir jemand helfen kann. Die anderen Probleme sind erstmal nebensächlich und darauf komme ich später nocheinmal zu sprechen
Ich bin für jede Idee oder Tipp dankbar.
|