Hallo iedereen!
Lang geleden dat ik hier ben geweest, maar daar zal nu wel weer verandering in komen.
Nu,
Na alle vakanties ben ik dus opnieuw begonnen met het amateurprogrammeren/reverse engineeren. Als een leuk projectje heb ik hetvolgende bedacht; een Pinball Hacker. Hoho, 'Hacker', dat klinkt niet iets voor op T.net, maar het is niets illegaals of iets in die aard hoor.
De bedoeling ervan is simpelweg de in Windows NT/XP (weet niet voor Vista) Space Cadet pinball 'hacken'. Het meest voor de hand liggende is natuurlijk de mogelijkheid om highscores mee naar je hand te zetten, en daar ben ik dus mee begonnen. Het is niet moeilijk te vinden waar deze bewaard worden; in het Registry natuurlijk, zeer gemakkelijk om iets te bouwen dat enkele Registry Keys veranderd, daar ligt ook het probleem niet.
Om het de mensen met een klein beetje kennis van computers niet al te gemakkelijk te maken vals te spelen, zit er er kleine validatie voor de highscores in pinball. Deze validatie kijkt aan de hand van enkele berekeningetjes na of er niet met de highscore werd gefoefeld. Op het eerste gezicht lijkt het of de validatie simpelweg de som van alle scores is, een lege score geld als -999. Dit blijkt na enkele manuele tests echter niet zo te zijn. Daar komt het reverse engineeren aan te pas.
Het is natuurlijk geen probleem om te vinden waar nu juist deze validatie zich bevind, om het mijzelf gemakkelijker te maken dacht ik gewoon de validatie te omzeilen via een simpele Patch. Dit ging zeer gemakkelijk door op VA 1004E57 de $74 in $EB te veranderen. (JE naar JMP)
hierdoor springt Pinball altijd over de code die de highscores leegmaakt indien de validatie niet klopt. een zogenaamde 'Plain-Stupid-Patch', maar hij werkt wel.
Nog altijd geen probleem tegen gekomen eigenlijk, laat ik dan maar eens naar de Point gaan.
Ik wou dus deze Patch in mijn Delphi applicatie toevoegen, dit is het gemakkelijkste via de basis Open/Seek/Write/Close procedure. Hier is mijn code:
Hier is de CheckPatchStatus functie (die er eigenlijk niet echt toe doet):
Maar dit blijkt op een of andere manier niet te werken. Ook heb ik bij het starten van mijn applicatie een Check geplaatst via de CheckPatchStatus functie. Ook al staat deze op Patched, de Highscores worden toch gecleared.
Het vreemde is dat het voordien wél heeft gewerkt. Misschien ligt het aan de Delphi code?
Indeen het toch aan de Pach zelf ligt, mag deze tread verplaatst worden naar Software Engineering & Architecture
Ik hoop dat iemand mij hierbij kan helpen. Indien er nog vragen zijn; Shoot.
(Owjah, ik ben nog maar 15, vandaar het 'kinderachtige' projectje
)
Lang geleden dat ik hier ben geweest, maar daar zal nu wel weer verandering in komen.
Nu,
Na alle vakanties ben ik dus opnieuw begonnen met het amateurprogrammeren/reverse engineeren. Als een leuk projectje heb ik hetvolgende bedacht; een Pinball Hacker. Hoho, 'Hacker', dat klinkt niet iets voor op T.net, maar het is niets illegaals of iets in die aard hoor.
De bedoeling ervan is simpelweg de in Windows NT/XP (weet niet voor Vista) Space Cadet pinball 'hacken'. Het meest voor de hand liggende is natuurlijk de mogelijkheid om highscores mee naar je hand te zetten, en daar ben ik dus mee begonnen. Het is niet moeilijk te vinden waar deze bewaard worden; in het Registry natuurlijk, zeer gemakkelijk om iets te bouwen dat enkele Registry Keys veranderd, daar ligt ook het probleem niet.
Om het de mensen met een klein beetje kennis van computers niet al te gemakkelijk te maken vals te spelen, zit er er kleine validatie voor de highscores in pinball. Deze validatie kijkt aan de hand van enkele berekeningetjes na of er niet met de highscore werd gefoefeld. Op het eerste gezicht lijkt het of de validatie simpelweg de som van alle scores is, een lege score geld als -999. Dit blijkt na enkele manuele tests echter niet zo te zijn. Daar komt het reverse engineeren aan te pas.
Het is natuurlijk geen probleem om te vinden waar nu juist deze validatie zich bevind, om het mijzelf gemakkelijker te maken dacht ik gewoon de validatie te omzeilen via een simpele Patch. Dit ging zeer gemakkelijk door op VA 1004E57 de $74 in $EB te veranderen. (JE naar JMP)
hierdoor springt Pinball altijd over de code die de highscores leegmaakt indien de validatie niet klopt. een zogenaamde 'Plain-Stupid-Patch', maar hij werkt wel.
Nog altijd geen probleem tegen gekomen eigenlijk, laat ik dan maar eens naar de Point gaan.
Ik wou dus deze Patch in mijn Delphi applicatie toevoegen, dit is het gemakkelijkste via de basis Open/Seek/Write/Close procedure. Hier is mijn code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| procedure TForm1.btnPatchClick(Sender: TObject); var FB : File Of Byte; a : Byte; begin AssignFile(FB , pbSource); Reset(FB); Seek(FB, $00004257); a := $EB; Write(FB, a); if CheckPatchStatus = false then begin lblPatchStatus.Caption := 'Not Patched'; lblPatchStatus.Font.Color := clRed; end else if CheckPatchStatus = true then begin lblPatchStatus.Font.Color := clLime; lblPatchStatus.Caption := 'Patched!'; end; closefile(FB); end; |
Hier is de CheckPatchStatus functie (die er eigenlijk niet echt toe doet):
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| function CheckPatchStatus: boolean; var FB : File Of Byte; a : Byte; begin a := 0; AssignFile(FB , pbSource); Reset(FB); Seek(FB, $00004257); Read(FB, a); if a = $74 then result := false else if a = $EB then result := true else begin result := false; end; closefile(FB); end; |
Maar dit blijkt op een of andere manier niet te werken. Ook heb ik bij het starten van mijn applicatie een Check geplaatst via de CheckPatchStatus functie. Ook al staat deze op Patched, de Highscores worden toch gecleared.
Het vreemde is dat het voordien wél heeft gewerkt. Misschien ligt het aan de Delphi code?
Indeen het toch aan de Pach zelf ligt, mag deze tread verplaatst worden naar Software Engineering & Architecture
Ik hoop dat iemand mij hierbij kan helpen. Indien er nog vragen zijn; Shoot.
(Owjah, ik ben nog maar 15, vandaar het 'kinderachtige' projectje