Autor Beitrag
Ares
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: So 15.01.06 16:11 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 150



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 150



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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.
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: 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

_________________
Ein Nutzer der Ecke ;-)
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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.

_________________
In the beginning was the word.
And the word was content-type: text/plain.