OldSchoolHack

Register / Login English

Assembler


icon Assembler #1

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:
  1. 0043B9B0 /$ E8 2B4DFEFF CALL 004206E0 ; [noregkey.004206E0
  2. 0043B9B5 |. 85C0 TEST EAX,EAX
  3. 0043B9B7 |. 74 09 JZ SHORT 0043B9C2
  4. 0043B9B9 |. 8178 1C 80164 CMP DWORD PTR DS:[EAX+1C],00401680 ; Entry point
  5. 0043B9C0 |. 75 02 JNE SHORT 0043B9C4
  6. 0043B9C2 |> 33C0 XOR EAX,EAX
  7. 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:
  1. 004206E0 /$ 85C9 TEST ECX,ECX ; noregkey.004206E0(guessed void)
  2. 004206E2 |. 7C 28 JL SHORT 0042070C
  3. 004206E4 |. 85D2 TEST EDX,EDX
  4. 004206E6 |. 7C 24 JL SHORT 0042070C
  5. 004206E8 |. 3B0D 8C9A4E00 CMP ECX,DWORD PTR DS:[4E9A8C]
  6. 004206EE |. 7D 1C JGE SHORT 0042070C
  7. 004206F0 |. 3B15 889A4E00 CMP EDX,DWORD PTR DS:[4E9A88]
  8. 004206F6 |. 7D 14 JGE SHORT 0042070C
  9. 004206F8 |. C1F9 05 SAR ECX,5
  10. 004206FB |. 8D0449 LEA EAX,[ECX*2+ECX]
  11. 004206FE |. C1E0 05 SHL EAX,5
  12. 00420701 |. C1FA 05 SAR EDX,5
  13. 00420704 |. 8B8490 807E4E MOV EAX,DWORD PTR DS:[EDX*4+EAX+4E7E80]
  14. 0042070B |. C3 RETN
  15. 0042070C |> 33C0 XOR EAX,EAX
  16. 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:
  1. 00442FB0 /$ 55 PUSH EBP
  2. 00442FB1 |. 8BEC MOV EBP,ESP
  3. 00442FB3 |. 83EC 14 SUB ESP,14
  4. 00442FB6 |. A1 78AA4F00 MOV EAX,DWORD PTR DS:[4FAA78]
  5. 00442FBB |. 53 PUSH EBX
  6. 00442FBC |. 56 PUSH ESI
  7. 00442FBD |. 57 PUSH EDI
  8. 00442FBE |. 8B40 08 MOV EAX,DWORD PTR DS:[EAX+8]
  9. 00442FC1 |. 8BF9 MOV EDI,ECX
  10. 00442FC3 |. 83C0 18 ADD EAX,18
  11. 00442FC6 |. 8955 F4 MOV DWORD PTR SS:[LOCAL.3],EDX
  12. 00442FC9 |. 8B4F 24 MOV ECX,DWORD PTR DS:[EDI+24]
  13. 00442FCC |. 8945 FC MOV DWORD PTR SS:[LOCAL.1],EAX
  14. 00442FCF |. 33C0 XOR EAX,EAX
  15. 00442FD1 |. 897D F8 MOV DWORD PTR SS:[LOCAL.2],EDI
  16. 00442FD4 |. 8947 24 MOV DWORD PTR DS:[EDI+24],EAX
  17. 00442FD7 |. 8947 30 MOV DWORD PTR DS:[EDI+30],EAX
  18. 00442FDA |. 8947 2C MOV DWORD PTR DS:[EDI+2C],EAX
  19. 00442FDD |. 8B35 E8B14F00 MOV ESI,DWORD PTR DS:[4FB1E8]
  20. 00442FE3 |. 81FE E8B14F00 CMP ESI,OFFSET 004FB1E8
  21. 00442FE9 |. 894D F0 MOV DWORD PTR SS:[LOCAL.4],ECX
  22. 00442FEC |. BB 03000000 MOV EBX,3
  23. 00442FF1 |. 74 73 JE SHORT 00443066
  24. 00442FF3 |> 66:8B46 10 MOV AX,WORD PTR DS:[ESI+10]
  25. 00442FF7 |. 66:85C0 TEST AX,AX
  26. 00442FFA |. 0F8F 040E0000 JG 00443E04
  27. 00443000 |. 0FBF56 08 MOVSX EDX,WORD PTR DS:[ESI+8]
  28. 00443004 |. 8B5E 04 MOV EBX,DWORD PTR DS:[ESI+4]
  29. 00443007 |. B9 88B24F00 MOV ECX,OFFSET 004FB288
  30. 0044300C |. 8915 89B24F00 MOV DWORD PTR DS:[4FB289],EDX
  31. 00443012 |. C705 8DB24F00 MOV DWORD PTR DS:[4FB28D],4
  32. 0044301C |. C605 88B24F00 MOV BYTE PTR DS:[4FB288],0E
  33. 00443023 |. E8 88CBFFFF CALL 0043FBB0 ; [noregkey.0043FBB0
  34. 00443028 |. 8B06 MOV EAX,DWORD PTR DS:[ESI]
  35. 0044302A |. 8B4E 04 MOV ECX,DWORD PTR DS:[ESI+4]
  36. 0044302D |. 8948 04 MOV DWORD PTR DS:[EAX+4],ECX
  37. 00443030 |. 8B56 04 MOV EDX,DWORD PTR DS:[ESI+4]
  38. 00443033 |. 8B06 MOV EAX,DWORD PTR DS:[ESI]
  39. 00443035 |. 8902 MOV DWORD PTR DS:[EDX],EAX
  40. 00443037 |. 8B0D 00B24F00 MOV ECX,DWORD PTR DS:[4FB200]
  41. 0044303D |. 890E MOV DWORD PTR DS:[ESI],ECX
  42. 0044303F |. A0 10B34F00 MOV AL,BYTE PTR DS:[4FB310]
  43. 00443044 |. 8935 00B24F00 MOV DWORD PTR DS:[4FB200],ESI
  44. 0044304A |. 8BF3 MOV ESI,EBX
  45. 0044304C |. 84C0 TEST AL,AL
  46. 0044304E |. 74 07 JZ SHORT 00443057
  47. 00443050 |. FEC8 DEC AL
  48. 00443052 |. A2 10B34F00 MOV BYTE PTR DS:[4FB310],AL
  49. 00443057 |> BB 03000000 MOV EBX,3
  50. 0044305C |> 8B36 MOV ESI,DWORD PTR DS:[ESI]
  51. 0044305E |. 81FE E8B14F00 CMP ESI,OFFSET 004FB1E8
  52. 00443064 |.^ 75 8D JNE SHORT 00442FF3
  53. 00443066 |> 8BCF MOV ECX,EDI
  54. 00443068 |. E8 631F0000 CALL 00444FD0
  55. 0044306D |. 8B47 20 MOV EAX,DWORD PTR DS:[EDI+20]
  56. 00443070 |. 6A 01 PUSH 1 ; /Arg3 = 1
  57. 00443072 |. 68 000000C0 PUSH C0000000 ; |Arg2 = C0000000
  58. 00443077 |. 50 PUSH EAX ; |Arg1
  59. 00443078 |. E8 13C10200 CALL 0046F190 ; \noregkey.0046F190
  60. 0044307D |. 83C4 0C ADD ESP,0C
  61. 00443080 |. E8 AB05FFFF CALL 00433630 ; [noregkey.00433630
  62. 00443085 |. 85C0 TEST EAX,EAX
  63. 00443087 |. 75 73 JNZ SHORT 004430FC
  64. 00443089 |. B9 C8B04F00 MOV ECX,OFFSET 004FB0C8
  65. 0044308E |. E8 0DC7FFFF CALL 0043F7A0 ; [noregkey.0043F7A0
  66. 00443093 |. B9 0B000000 MOV ECX,0B
  67. 00443098 |. E8 A388FFFF CALL 0043B940 ; [noregkey.0043B940
  68. 0044309D |. 8A48 12 MOV CL,BYTE PTR DS:[EAX+12]
  69. 004430A0 |. 80E1 06 AND CL,06
  70. 004430A3 |. 80F9 06 CMP CL,6
  71. 004430A6 |. 75 1C JNE SHORT 004430C4
  72. 004430A8 |. 33D2 XOR EDX,EDX
  73. 004430AA |. 8915 48B24F00 MOV DWORD PTR DS:[4FB248],EDX
  74. 004430B0 |. 8915 4CB24F00 MOV DWORD PTR DS:[4FB24C],EDX
  75. 004430B6 |. 8915 50B24F00 MOV DWORD PTR DS:[4FB250],EDX
  76. 004430BC |. 8915 54B24F00 MOV DWORD PTR DS:[4FB254],EDX
  77. 004430C2 |. EB 0A JMP SHORT 004430CE
  78. 004430C4 |> B9 48B24F00 MOV ECX,OFFSET 004FB248
  79. 004430C9 |. E8 22EAFEFF CALL 00431AF0 ; [noregkey.00431AF0
  80. 004430CE |> 8B45 F4 MOV EAX,DWORD PTR SS:[LOCAL.3]
  81. 004430D1 |. 85C0 TEST EAX,EAX
  82. 004430D3 |. 74 27 JZ SHORT 004430FC
  83. 004430D5 |. E8 06DBFDFF CALL 00420BE0 ; [noregkey.00420BE0
  84. 004430DA |. 85C0 TEST EAX,EAX
  85. 004430DC |. 75 1E JNZ SHORT 004430FC
  86. 004430DE |. 8B15 DCB04F00 MOV EDX,DWORD PTR DS:[4FB0DC]
  87. 004430E4 |. 8B0D D8B04F00 MOV ECX,DWORD PTR DS:[4FB0D8]
  88. 004430EA |. C1FA 08 SAR EDX,8
  89. 004430ED |. C1F9 08 SAR ECX,8
  90. 004430F0 |. E8 BB88FFFF CALL 0043B9B0 ; [noregkey.0043B9B0
  91. 004430F5 |. 85C0 TEST EAX,EAX
  92. 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.

icon #2

Join Date: Jul 2013

Posts: 10

Ich habe das Problem selbst gelöst, ich habe den Speicher überschritten. Nachdem ich die Variablen auf den neu gewonnenen freien Speicher referenziert habe liefs dann auch. Danke nochmal an KN4CK3R