Autor Beitrag
cherrymoon69
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 28.02.08 22:11 
Hallo,

ich programmiere grad einen Spieletrainer zu lernzwecken.

Wenn ich eine Adresse im Speicher ändere erfolgt genau der Effekt den ich haben möchte, nämlich, das Geld friert ein.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button1Click(Sender: TObject);   //Geld einfieren
const v1 = $90;
begin
    WindowName  :=  FindWindow(nil,WindowTitle);
          If  WindowName  =  0  then MessageDlg('...erst spiel starten...dann trainer starten =)',  mtwarning,[mbOK],0);
    ThreadId  :=  GetWindowThreadProcessId(WindowName,@ProcessId);
    HandleWindow  :=  OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
    GetMem(buf,1);
        buf^  :=  Chr(v1);
              WriteProcessMemory(HandleWindow,ptr($480802),buf,1,write); //es wird der speicher umgeschrieben
              WriteProcessMemory(HandleWindow,ptr($480803),buf,1,write);
              WriteProcessMemory(HandleWindow,ptr($480804),buf,1,write);
              WriteProcessMemory(HandleWindow,ptr($480805),buf,1,write);
              WriteProcessMemory(HandleWindow,ptr($480806),buf,1,write);
              WriteProcessMemory(HandleWindow,ptr($480807),buf,1,write);
        FreeMem(buf);
    closehandle(HandleWindow);
    MessageDlg('Geld ist eingefroren',  mtwarning,[mbOK],0);
end;



Aber, wenn ich das rückgängig machen möchte, dann stürzt das Spiel sofort ab.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button2Click(Sender: TObject);    // Geld einfrieren aufheben
var
Value1: Cardinal;
begin
    Value1 := $D99EF41B0000;
       WindowName  :=  FindWindow(nil,WindowTitle);
          If  WindowName  =  0  then MessageDlg('...erst spiel starten...dann trainer starten =)',  mtwarning,[mbOK],0);
    ThreadId  :=  GetWindowThreadProcessId(WindowName,@ProcessId);
    HandleWindow  :=  OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
      GetMem(buf,1);
                      WriteProcessMemory(HandleWindow,ptr($480802),@Value1,6,write); //es wird der speicher umgeschrieben

        FreeMem(buf);
    closehandle(HandleWindow);
    MessageDlg('Geld ist nicht mehr eingefroren',  mtwarning,[mbOK],0);

end;

Das verstehe ich nicht. ich schreibe doch lediglich den alten Wert wieder an seine Stelle. D)9EF41B0000.

Wo ist da der Fehler?

In einem anderen Forum habe ich mal gelesen, das er die letzt 2 Bytes 00 00 nicht schreiben würde. liegt es daran?

Weiß jemand weiter?

Danke


Markus

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1338
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Fr 29.02.08 00:18 
Ich könnte ja jetzt sagen, wer für so ein Problem WriteProcessMemory verwendet, hat nicht besseres verdient. Aber, ich sage es nicht 8)

Wie kommst du auf die statischen Adressen?
Und wie auf den Wert den du da dann reinpackst? Mal versucht dem Wert reinzuschreiben den du dort vorm überschreiben rausgelesen hast? (lesen musst).

Wenn du 6 Byte auf einmal schreiben willst brauchst du auch was mindestens 6 Byte groß ist!
Also am besten ein statisches Array das 6 Byte groß ist und die Werte aufnimmt.


Wobei ich die gesammte Idee nicht sonderlich Intelligent finde. (Wenn du da belohnen willst dann darf das Spiel nicht schon vorher vorhanden sein, sondern muss von dir gestartet werden. Besser noch, von dir geschrieben sein.
Dann könntest du auch eine weniger bescheidene Technik zum blockieren des Spiels verwenden.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
cherrymoon69 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 29.02.08 00:54 
ok. du hast deinen standpunkt deutlich gemacht.

aber wirklich geholfen hast du mir nicht. ich programmiere noch nicht lange. deswegen kann ich immer hilfe gebrauchen.

die adresse ist ein pointer, welche ich mit tsearch ermittelt habe. wenn ich die 6 bytes noppe friert das geld ein. denn die tatsächliche adresse, auf der das geld liegt, ist jedesmal eine andere.

so funktioniert es ganz gut. bis auf das aufheben. ich will das ganze verstehen. und daraus lernen.

kannst du mir denn eine bessere variante nennen? bitte mit etwas code. sonst werde ich das wohl nicht verstehen und kann es nicht nachvollziehen.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 29.02.08 01:12 
Sorry, aber eine korrekte Lösung hat Dir user profile iconSinspin in seinem Post bereits gesagt, ergo: Lesen hilft.

Reserviere einen Puffer von 6 Bytes (z.B. mit einem statischen Array) und trage in diesem die zu schreibenden Daten ein.
Ferner: Lese die Daten aus dem Programm aus, die später zurückgeschrieben werden sollten ...

Und wenn ich mal Recht in der Annahme gehe, patchst Du einen CALL auf eine Funktion, die das Verändern des Geldes ausführt ... dieser Aufruf wird sich wahrscheinlich bei unterschiedlichen Varianten des Spieles ändern. Wenn da dann das falsche zurückgeschrieben wird, wundert mich solch ein Absturz reichlich wenig.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 29.02.08 11:43 
user profile iconcherrymoon69 hat folgendes geschrieben:
ich programmiere grad einen Spieletrainer zu lernzwecken.


user profile iconcherrymoon69 hat folgendes geschrieben:
aber wirklich geholfen hast du mir nicht. ich programmiere noch nicht lange. deswegen kann ich immer hilfe gebrauchen.


Meinst du nicht auch, dass es sinnvoller wäre, erstmal mit etwas leichterem anzufangen und sich erstmal die Grundlagen sowohl in der Programmiersprache als auch bezüglich der Windows Interna und der Windows-API anzueignen?
cherrymoon69 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 29.02.08 16:28 
wie seit ihr denn drauf?

ist dieses forum nur für supertypen???

es hat doch wohl jeder mal angefangen, oder?

der eine meint es wäre wohl keine gute idee mit so etwas zu starten, der andere meint das ich nicht das recht hätte an einem spiel etwas zu ändern, welches ich nicht selber geschrieben habe...


also echt.

das geht doch niemanden etwas an. ich habe eine frage gestellt, dazu habe ich meinen wissensstand erläutert.

ich gehe davon aus, dass manmir vernünftig, auf mein wissen zugeschnitten, antwortet.

wenn das in diesem forum nicht möglich ist, dann sollte man jemanden wie mich gar nicht erst aufnehmen, sondern die frage, ob man profi ist, am anfang der registrierung stellen und alle anderen zurückweisen.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 29.02.08 16:36 
Hallo cherrymoon89!

Um Missverständnisse zu vermeiden: es geht hier nicht darum, dass man ein "Profi" sein muss, um hier Fragen stellen zu dürfen. Es geht darum, dass dir mit Recht mitgeteilt wurde, dass du das Spiel nicht ändern darfst, wenn du es nicht selbst geschrieben hast.

user profile iconcherrymoon69 hat folgendes geschrieben:
also echt.das geht doch niemanden etwas an.

Doch, das tut es, und zwar in letzter Konsequenz Tino. Wenn dir hier geantwortet wird und du die Antworten dazu nutzt, gesetzeswidrige Handlungen zu begehen (z.B. ein Spiel manipulieren, das du nicht selbst geschrieben hast), kann Tino eventuell teilweise dafür haftbar gemacht werden. Daher geht es uns sehr wohl etwas an, ob das Spiel von dir ist oder nicht. Außerdem ist Code dieser Art ohne die Kenntnis über seinen Verwendungszweck gefährlich, da das Topic auch von Usern genutzt werden kann, gesetzeswidrige Handlungen zu begehen.

Du solltest das also auch von dieser Seite her sehen und nicht gleich anfangen, ausfallend zu werden.
AXMD
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 29.02.08 16:38 
Natürlich hat jedermann mal angefangen und jedermann hat auch festgestellt, dass es mehr Sinn macht mit den Grundlagen anzufangen. Klar sollte man auch mal Herausforderungen angehen, allerdings sollte sie dem Wissenstand entsprechen.

Zitat:
ich gehe davon aus, dass manmir vernünftig, auf mein wissen zugeschnitten, antwortet.

Genau das ist das Problem. Um dir helfen zu können, setzt es nun mal voraus, dass ein gewisser Wissenstand da ist, sonst macht das ganze keinen Sinn, weil du unsere Antworten nicht verstehst. Und damit ist weder dir noch uns geholfen.

Zitat:
der andere meint das ich nicht das recht hätte an einem spiel etwas zu ändern

Du kannst ein einer Exe-Datei so viel ändern wie du willst, auch wenn die Lizenz was anderes besagt. Was du nicht darfst, ist die modifizierte Exe-Datei zu veröffentlichen nach deutschem Recht. Auch kannst du natürlich auch Trainer oder sonstiges dafür entwickeln, du solltest dir nur der möglichen Folgen bewußt sein, wenn sie von dir oder anderen eingesetzt werden.
cherrymoon69 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 29.02.08 18:35 
also. wenn ihr das ausfallend nennt? wo war ich denn ausfallend?rainer zu tausenden im internet.

habe nur meine meinung gesagt und nicht ausfallend geworden.

ich verändere kein programm an sich. schon gar keine exe.

ich schreibe nur zur laufzeit einen wert in den ram. das ist alles.

und das ist nicht verboten. ausserdem mache ich das für mich. es gibt diese trainer zu tausenden im internet.

ich will das aber selber machen. um es auch zu verstehen.

ich lerne sehr wohl etwas dabei. denn ich schaue mir den code genau an und experimentiere damit rum. dadurch lerne ich. natürlich arbeite ich auch diverse tuturials durch.

aber die trainersache liegt mir am herzen.

versteht ihr das nicht? es ist doch besser es selber zu machen und zu lernen, als das trainermakerkit runterzuladen und das selbe zu machen und dumm zu bleiben.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 29.02.08 20:40 
das is sehr lobenswert das du sagst ok das will ich selbst machen und wir wollen dir auch helfen aber um unsere Hilfe zu verstehen brauchst du einen gewissen wissenstand. Wir können dir nicht Delphi von grund auf erlernen. Dazu gibts nämlich auch tutorials die das können. (-> Crashkurs)

insofern kann ich dir auch nur raten dich mal etwas genauer in die materie einzuarbeiten. man kann nicht gleich bei 100 anfangen. Bill Gates hat sicher auch nicht sofort mit windows angefangen sondern mit kleinen programmen.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
cherrymoon69 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 29.02.08 20:50 
das verstehe ich zum teil. die tuturials arbeite ich ja durch.

und das mit dem array habe ich auch verstanden. setze es gleich mal um.

viel mehr hätte ich gerne ein statement dazu:

Zitat: Ich könnte ja jetzt sagen, wer für so ein Problem WriteProcessMemory verwendet, hat nicht besseres verdient. Aber, ich sage es nicht.

wie wäre denn ein besserer ansatz???
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1338
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Fr 29.02.08 22:17 
user profile iconSinspin hat folgendes geschrieben:
Ich könnte ja jetzt sagen, wer für so ein Problem WriteProcessMemory verwendet, hat nicht besseres verdient. Aber, ich sage es nicht 8)

Ich würde mal vermuten dass das in meine Richtung geht?

Da ist die Antwort:
user profile iconSinspin hat folgendes geschrieben:

Wobei ich die gesammte Idee nicht sonderlich Intelligent finde. (Wenn du da belohnen willst dann darf das Spiel nicht schon vorher vorhanden sein, sondern muss von dir gestartet werden. Besser noch, von dir geschrieben sein.
Dann könntest du auch eine weniger bescheidene Technik zum blockieren des Spiels verwenden.


Dein Trainer ist das eine. (schöne Idee)
Die Belohnung das andere! (bisher keine schöne Idee)
Da du ja eh nur Spiele anbieten kannst die dir bekannt sind (du fummelst ja drinne rum), kannst du doch auch Spiele verwenden die du selber schreibst, oder zumindest die Quelltexte davon hast.
Und schon kannst du Techniken verwenden die nicht so mords heikle Sachen anstellen!
Dann könnten deine Programme über Dateien, Sockets, Pipes oder SharedMemory miteinander kommunizieren und sich mitteilen was der Spieler gerade darf oder nicht.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
cherrymoon69 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 29.02.08 23:36 
hallo?

ich möchte aber bei meinem lieblingsspiel das geld einfrieren können. das ist es worum es geht. um nix anderes.