Entwickler-Ecke
Sonstiges (Delphi) - Text in Compilierter EXE ändern
Ares - So 15.01.06 16:11
Titel: Text in Compilierter EXE ändern
Hallo!
Ich habe ein kleines Tool geschrieben, dass ich als Shareware verkaufen möchte. Damit das Programm nicht beliebig weiter gegeben wird, wenn man es sich einmal gekauft hat, würde ich darin gerne einen Hinweis "Gekauf von Herrn Mustermann" anbringen.
Dafür müsste ich nur für jeden Kunden das Programm neu compilieren, was natürlich etwas sehr aufwendig wäre. Ich habe mir daher folgendes überlegt:
Ich schreibe in das Label irgendeinen Dummy-String und compiliere das Programm dann damit. Anschließend suche ich mit einem Hex-Editor die Stelle an der der String in der EXE zu finden ist. Nun schreibe ich ein kleines Tool, dass die EXE an dieser Stelle so verändert, dass dort der Mustermann-Hinweis steht.
Mein Problem: Ich weiß nicht besonders viel darüber, wie EXE-Dateien aufgebaut sind, und ob so eine Änderunge einfach möglich ist. Vielleicht veränderte ich damit ja irgendeine Checksumme der EXE und das Programm funktioniert nicht mehr, oder etwas in der Richtung? Also kann ich den String einfach austauschen (natürlich verausgesetzt der Dummy String und der Namensstring sind gleich lang)?
Wenn das generell möglich ist, bleibt noch eine andere Frage: Wenn ich das Programm nun weiterentwickeln und eine neue Version herausbringe. Wie groß ist dann die Wahrscheinlichkeit, dass die Stelle des Dummy-Strings in der EXE gleich bleibt? Wahrscheinlich 0 oder?
Für eure Tipps wäre ich euch wirklich dankbar!
0xCC - So 15.01.06 16:20
schreib einfach was in der art in die exe :
const mystring = #1#1#1#1#1 usw ca 255 mal
den bereich öffnest dann mitm hexed und schreibst den namen drüber, abgeschlossen mit #0
kaputtgehen kann nix ausser du prüfst programmintern nach ner checksumme
würde dir anraten, den namen verschlüsselt in die datei zu schreiben
Ares - So 15.01.06 17:08
Danke für deine Tipps!
0xCC hat folgendes geschrieben: |
würde dir anraten, den namen verschlüsselt in die datei zu schreiben |
Ja, werd ich machen. Das diese Methode kein allzu wirksamer Schutz gegen echte Cracker ist, ist mir bewusst. Die lassen sich aber eh nicht abschrecken. Herr Müller von nebenan wird es sich aber wahrscheinlich zweimal überlegen ein Programm mit seinem Namen weiter zu geben.
Wie sieht es mit neuen Versionen aus? Behält der String in der EXE sein Offset oder muss man nach jeder kleinen änderungen am Programm auch ein neues Offsett angeben?
0xCC - So 15.01.06 17:11
das offset kann sich ändern,
mach dir also einfach ein prog das in deiner exe nach 255*#1 sucht und dort den namen drüberpatcht
Horst_H - So 15.01.06 17:24
Hallo,
wahrscheinlich (sicher) wird sich die Position aendern.
Hier meine Version mit ein wenig Verschluesselung.
Der Text erscheint nochmals verschluesselt.
Deren Position sollte auch nicht so dicht beieinander sein.
Delphi-Quelltext
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| procedure TForm1.Button1Click(Sender: TObject); const DateiLaenge = 100; DateiPos = 57; NamensLaenge = 16; DateiName ='C:test.xex'; var FS : TFileStream; i,RandStart : integer; strText, strErsatzText : string; begin randomize;
IF Not(FileExists(DateiName)) then begin FS := TFIleStream.Create(DateiName,fmCreate); strtext := StringOfChar('-',DateiLaenge); FS.Write(strText[1],length(strText)); FS.Free; end; FS := TFIleStream.Create(DateiName,fmOpenReadWrite); FS.Position := DateiPos; RandStart := randseed; strtext := StringOfChar(' ',NamensLaenge); strErsatzText := Edit1.Text; Move(strErsatzText[1],strText[1],length(strErsatzText)); strErsatzText := strText; For i := 1 to NamensLaenge do strErsatzText[i] := chr(ord(strErsatzText[i]) XOR random(256)); FS.Write(Pointer(@RandStart)^,SizeOf(RandStart)); FS.Write(strText[1],NamensLaenge); FS.Write(strErsatzText[1],NamensLaenge); Fs.Free;
Memo1.lines.LoadFromFile(DateiName); FS := TFIleStream.Create('C:test.xex',fmOpenRead); FS.Position := DateiPos; FS.Read(Pointer(@RandStart)^,SizeOf(RandStart)); FS.Read(strText[1],NamensLaenge); FS.Read(strErsatzText[1],NamensLaenge);
RandSeed := RandStart; For i := 1 to NamensLaenge do strErsatzText[i] := chr(ord(strErsatzText[i]) XOR random(256)); Memo1.lines.Add('Original '+strText); Memo1.lines.Add('Kontrolle '+strErsatzText); FS.Free;
end; |
Gruss Horst
Martin1966 - Di 17.01.06 10:27
Ob du nun ein Tool schreibst welches du jedes Mal aufrufen musst um den Namen des Kunden dort einzugeben damit Deine kompilierte Anwendung dann automatisch geändert wird ODER ob Du Deine Anwendung jedesmal einfach per F9 oder sogar in einem automatisierten Build ablauf neu erzeugst ist doch fast egal. Oder?
Jedefalls würde ich die zweite Variante bevorzugen. Erstelle doch einfach eine Textdatei die in Deinem Programm inkludiert wird. In diese Textdatei brauchst du dann nur den Kundennamen eingeben und Dein Programm neukompilieren.
Lg Martin
matze - Di 17.01.06 17:45
ginge es nicht, einen ressourcestring in das Programm einzufügen und dann beim weitergeben muss man einfach diese Ressource ändern.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!