Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[Delphi] Basis Patch-Script werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:
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 :+ )

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Weet je zeker dat het probleem in je patch programma zit en niet in de patch zelf? Je zou het nog eens met een hexeditor of disassembler kunnen controleren.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Heb ik gedaan mey Olly.

Het heeft ook zeker gewerkt, dat is nu juist het vreemde.

  • Andre_J
  • Registratie: September 2005
  • Laatst online: 07:32
Als je de wijziging in Olly doet gaat het wel begrijp ik.
Heb je de file na wijzing in delphi gecontroleerd of werkelijk maar 1 byte veranderd is ?
File compare ?

Verwijderd

Topicstarter
Nog niet need. Misschien dat maar eens doen. :)

Verwijderd

Topicstarter
Heb gekeken. Er is gewoon niets veranderd. Dit betekent dusdat het wel degelijk aan de code ligt.

Iemand die mij kan helpen? :)

  • MicroWhale
  • Registratie: Februari 2000
  • Laatst online: 14-11 08:31

MicroWhale

The problem is choice

FlushBuffer, Close, etc...

Write wil niet zeggen dat er meteen in de file een byte weggeschreven is... Eerst zeker weten dat je het hard hebt weggeschreven, daarna de patchcheck doen.

Het enige belangrijke is dat je vandaag altijd rijker bent dan gisteren. Als dat niet in centen is, dan wel in ervaring.


Verwijderd

Topicstarter
Hoe kan ik na de write kijken of het hard is weggeschreven?
Via FlushBuffer?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wilde gok: je hebt Windows File Protection aan staan ;) Die restored doodleuk ("windows"-) bestanden die aangepast worden.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Wist niet eens dat dat bestond.
Is er aan manier om die via Delphi af te zetten? Ook controleren of deze aan/uit staat zou handig zijn. :)

Zelf ook al eens even googlen. :)

Ook nog extra vraagje,
Als ik die Disable & dan Patch en daarna weer Enable, gaat hij dan nog altijd de patched ongedaan maken? Of hoelang moet er gewacht worden met opnieuw enablen?

-- Edit --
Gevonden hoe enabled/disabled moet worden & kan ook checken.

Maar wat MrWilliams zei:
quote: MrWilliams
FlushBuffer, Close, etc...

Write wil niet zeggen dat er meteen in de file een byte weggeschreven is... Eerst zeker weten dat je het hard hebt weggeschreven, daarna de patchcheck doen.
zou ik voor de zekerheid ook graag kunnen toepassen. Kwestie van dat als ik nu mijn applicatie open, de de Patch-Status als 'Patched' aangegeven staat. Vreemd, aangezien hij nog niet gepatched is in Olly.
Daarvan heb ik nog niet gevonden hoe ik dat fix.
Beetje hulp? O-)

[ Voor 79% gewijzigd door Verwijderd op 14-08-2008 18:40 ]


Verwijderd

Verwijderd schreef op woensdag 13 augustus 2008 @ 09:52:
Dit ging zeer gemakkelijk door op VA 1004E57 de $74 in $EB te veranderen. (JE naar JMP)
Ik ben geen lowlevel held, maar in je Delphi code benader je positie $00004257. Weet je zeker dat die 2 corresponderen? Oftewel, zit je misschien niet de juiste byte te patchen?
Da's vrij simpel te debuggen: een breakpoint zetten op de Read(FB, a) regel in CheckPatchStatus, en als a daarna (bij een ongepatchte versie) geen $74 bevat, zit je niet op de goeie plek te patchen.

En verder: 't is natuurlijk onnodig om CheckPatchStatus 2x aan te roepen, als 'ie de eerste keer False teruggeeft, wordt dat de 2e keer echt niet anders.
Dus:
Delphi:
1
2
3
4
5
6
7
8
  if not CheckPatchStatus then
  begin
    lblPatchStatus.Caption := 'Not Patched';
  end
  else
  begin
    lblPatchStatus.Caption := 'Patched!';
  end;

En in CheckPatchStatus return je False voor zowel de situatie als je een $74 tegenkomt als wanneer er iets anders dan $EB staat. Ik zou in 't laatste geval (geen $74 of $EB) een exception raisen, want je verwacht op die plek alleen 1 van die 2 waardes.

  • MicroWhale
  • Registratie: Februari 2000
  • Laatst online: 14-11 08:31

MicroWhale

The problem is choice

Verwijderd schreef op donderdag 14 augustus 2008 @ 18:08:
Wist niet eens dat dat bestond.
Is er aan manier om die via Delphi af te zetten? Ook controleren of deze aan/uit staat zou handig zijn. :)

Zelf ook al eens even googlen. :)

Ook nog extra vraagje,
Als ik die Disable & dan Patch en daarna weer Enable, gaat hij dan nog altijd de patched ongedaan maken? Of hoelang moet er gewacht worden met opnieuw enablen?

-- Edit --
Gevonden hoe enabled/disabled moet worden & kan ook checken.

Maar wat MrWilliams zei:
[...]
zou ik voor de zekerheid ook graag kunnen toepassen. Kwestie van dat als ik nu mijn applicatie open, de de Patch-Status als 'Patched' aangegeven staat. Vreemd, aangezien hij nog niet gepatched is in Olly.
Daarvan heb ik nog niet gevonden hoe ik dat fix.
Beetje hulp? O-)
In jouw voorbeeld gebruik je een file of byte. De enige manier om daarmee iets te garanderen is CloseFile en daarna een Reset() om te kijken of het klopt.

Zonder die CloseFile zit die ene byte van jou nog in de applicatiecache. Die schrijft pas iets weg (lees: geeft door aan OS) als je boven een bepaalde grootte komt (is ook instelbaar, maar niet aankomen): De write buffer.

Bij het gebruik van een TStream kun je WriteBuffer() gebruiken om je applicatiecache geforceerd te flushen naar het OS.

dus:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure PatchFile(patchFileName : string); // proc van gemaakt, wel zo netjes.
var
FB : File Of Byte;
a : Byte;
begin
AssignFile(FB , patchFileName);
Reset(FB);
Seek(FB, $00004257);
a := $EB;
Write(FB, a);
CloseFile(FB); // <---- hier zit het verschil!
end;

procedure TForm1.btnPatchClick(Sender: TObject);
begin
  PatchFile(pbSource); //waar komt pbSource vandaan? beetje vaag...
  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;
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
function CheckPatchStatus: boolean;
var
FB : File Of Byte;
a : Byte;
begin
a := 0;
AssignFile(FB , pbSource);
Reset(FB);
Seek(FB, $00004257);
Read(FB, a);
result := (a = $EB); // iets kortere notatie.
end;
closefile(FB);
end;


... zou een iets nettere oplossing zijn. (ik heb geen delphi meer, dus ik kan het niet testen). Ik zeg iets netter omdat hier totaal geen rekening gehouden is met exceptions. Problemen met files of toegang wordt dus niet afgevangen. Bovendien zou ik zelf liever TStream of TFileStream gebruiken.

[ Voor 3% gewijzigd door MicroWhale op 18-08-2008 13:17 ]

Het enige belangrijke is dat je vandaag altijd rijker bent dan gisteren. Als dat niet in centen is, dan wel in ervaring.

Pagina: 1