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!

user profile icon0xCC 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;
//Gesamtlaenge = 2*NamensLaenge+4;
  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);
  //So kommt man wieder an des Namen
  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.