AW: DFM-Dateien verschlüsseln?
Klingt kompliziert. Ich habe das jetzt anders aber schlechter gemacht. Funktioniert trotzdem.
|
AW: DFM-Dateien verschlüsseln?
Und wie hast du es gemacht? :roll:
|
AW: DFM-Dateien verschlüsseln?
Meine Methode ist überhauptnicht kompliziert.
Man nehme: 'nen FileStream und lese in den die EXE ein. Lasse die MD5-Checksumme erstellen. Gehe ans Ende des FileStreams. Schreibe die MD5-Checksumme. Die EXE wird dadurch um die 16 Byte der MD5-Checksumme "länger". Zum Prüfen: Man nehme: 'nen FileStream und lese in den die EXE ein. Lasse die MD5-Checksumme über den FileStream, abzüglich der letzten 16 Byte, erstellen. Lese die 16 Byte der EXE. Vergleiche diese 16 Byte mit der MD5-Checksumme. Bei Übereinstimmung ist alles ok, ansonsten halt beliebige Reaktion auf die Veränderung durchführen. |
AW: DFM-Dateien verschlüsseln?
Dfm2Pas kann Ressourcen aus EXE auslesen.
|
AW: DFM-Dateien verschlüsseln?
Zitat:
TestStreamFormat ObjectTextToResource ObjectResourceToText ObjectBinaryToText ObjectTextToBinary
Delphi-Quellcode:
Vorher aber natürlich das Laden der DFM unterbinden, siehe TCustomForm.Create .
Stream := TResourceStream.Create(...);
Form := TXyzForm.Create; Form.ReadComponent(Stream); Bzw. durch eine leere Dummy-Ressource ersetzen, dann darf aber nichts in OnCreate auf die Form zugeifen. Oder beim Create der TForm vorgaukeln es wäre im FormDesigner.
Delphi-Quellcode:
Ich weiß, Instance.Create ist eigentlich "falsch" und es müsste Class.Create heißen, aaaaaaaaaber ... siehe NewInstance :angle:
Form := TXyzForm(TXyzForm.NewInstance);
// csDesigned in Form setzen Form.Create(Self); // csDesigned in Form entfernen Form.ReadComponent(Stream); Form.OnCreate(Form); // OnCreate wurde vorher aber auch schon einmal im Create aufgerufen Und das Verschlüssen dann natürlich von außen. (eine zweite EXE im AfterBuild aufrufen, die das macht) UpdateResource usw. Statt die Form selber zu laden/entschlüsseln, könnte man auch die Resource-APIs hooken, dort entschlüsseln und das Laden der DFM weiterhin ganz normal TForm erledigen lassen welches dabei die entschlüsselte Ressource bekommt. Weniger Aufwändiger ist nur das Hashen, statt dem Verschlüsseln. |
AW: DFM-Dateien verschlüsseln?
Es ist ja schön, dass sich da so viele Leute Gedanken darüber machen. Ok, einen MD5-Hash für die Exe zu erstellen um zu prüfen ob nichts verändert wurde (Lizenzumgehung oder was weiß ich) ist ja ok.
Aber @a.def: Schreibst du wirklich ein so tolles und einzigartiges Programm als das es sich lohnt das zu klauen und zu kopieren? Ich meine ich habe damit keine Erfahrung weil ich bisher immer nur Software für mich privat oder für unsere Firma entwickelt habe. Verkauft oder öffentlich zur Verfügung gestellt wurde da aber noch nichts. Aber muss man sich da wirklich Gedanken drum machen? Wenn jemand dein Programm wirklich knacken will und den Aufwand betreibt, die Ressourcen zu ändern, dann wird er bestimmt auch noch die MD5 Prüfung außer Betrieb nehmen (können). Nur meine Meinung. Kann natürlich alles ganz anders sein. |
AW: DFM-Dateien verschlüsseln?
Aus meiner Sicht ist das 'ne interessante Spielerei.
Ernsthaft benötigen tue ich das nicht. |
AW: DFM-Dateien verschlüsseln?
Es sei denn, die IDE verabschiedet sich weil sie die DFM Datei nicht mehr lesen kann. Dann wäre es vielleicht interessant wenn man das Formular direkt aus Quellcode erstellen koennte, dann eventuell auch mit Verschlüsselung
|
AW: DFM-Dateien verschlüsseln?
Zitat:
|
AW: DFM-Dateien verschlüsseln?
Aktuelle Delphi-Versionen bieten eine interessante Schnittstelle, mit der man nach dem Lesen der DFM noch weitere DFM-Resourcen auf das Form loslassen kann. Das wird z.B. in FMX zur Verwaltung der platform-spezifischen Eigenschaften eines Forms verwendet, ist aber keineswegs auf FMX beschränkt.
Es gibt zwei Herangehensweisen:
In diesem Beispiel verwende ich den override-Mechanismus, um eine (hier in Textform vorliegende) DFM-Beschreibung beim Laden in das Form zu injizieren. Da es sich hier faktisch um ein geerbtes Form handelt, müssen die Instanzen alle
Delphi-Quellcode:
sein. Durch ein temporär erstelltes vererbtes Form, das nicht in die Exe eingelinkt wird, kann man den verändeten DFM-Inhalt auch recht einfach herleiten.
inherited
Delphi-Quellcode:
Hier noch die Original-DFM als Text:
type
TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); protected procedure GetDeltaStreams(Proc: TGetStreamProc); override; end; const cDFM = 'inherited Form1: TForm1' + sLineBreak + ' Left = 0' + sLineBreak + ' Top = 0' + sLineBreak + ' Caption = ''Form1''' + sLineBreak + ' ClientHeight = 299' + sLineBreak + ' ClientWidth = 635' + sLineBreak + ' Color = clBtnFace' + sLineBreak + ' Font.Charset = DEFAULT_CHARSET' + sLineBreak + ' Font.Color = clWindowText' + sLineBreak + ' Font.Height = -11' + sLineBreak + ' Font.Name = ''Tahoma''' + sLineBreak + ' Font.Style = []' + sLineBreak + ' OldCreateOrder = False' + sLineBreak + ' PixelsPerInch = 96' + sLineBreak + ' TextHeight = 13' + sLineBreak + ' inherited Button1: TButton' + sLineBreak + ' Left = 392' + sLineBreak + ' Top = 48' + sLineBreak + ' Width = 75' + sLineBreak + ' Height = 25' + sLineBreak + ' Caption = ''Button1''' + sLineBreak + ' TabOrder = 0' + sLineBreak + ' OnClick = Button1Click' + sLineBreak + ' end' + sLineBreak + ' inherited Memo1: TMemo' + sLineBreak + ' Left = 392' + sLineBreak + ' Top = 168' + sLineBreak + ' Width = 185' + sLineBreak + ' Height = 89' + sLineBreak + ' Lines.Strings = (' + sLineBreak + ' ''Der Brite Richard Browning hat am ''' + sLineBreak + ' ''Rande der Technology, ''' + sLineBreak + ' ''Entertainment and Design ''' + sLineBreak + ' ''conference in Vancouver seinen ''' + sLineBreak + ' ''"Daedalus Suit" im Rahmen einer ''' + sLineBreak + ' ''Live-Demo vorgestellt. Der Anzug ''' + sLineBreak + ' ''besteht aus einem verst''#228''rkenden ''' + sLineBreak + ' ''Exoskelett, das mit sechs ''' + sLineBreak + ' ''D''#252''sentriebwerken best''#252''ckt ist. ''' + sLineBreak + ' ''Momentan taugt das Ganze f''#252''r eine ''' + sLineBreak + ' ''Flugdauer von bis zu 10 Minuten, ''' + sLineBreak + ' ''berichtet BBC online.'')' + sLineBreak + ' TabOrder = 1' + sLineBreak + ' end' + sLineBreak + 'end'; procedure TForm1.GetDeltaStreams(Proc: TGetStreamProc); var stream: TMemoryStream; strS: TStringStream; begin inherited; strS := TStringStream.Create(cDFM); try stream := TMemoryStream.Create; try ObjectTextToBinary(strS, stream); stream.Position := 0; Proc(stream); finally stream.Free; end; finally strS.Free; end; end;
Code:
object Form1: TForm1
Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 299 ClientWidth = 635 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 40 Top = 24 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end object Memo1: TMemo Left = 40 Top = 55 Width = 185 Height = 89 TabOrder = 1 end end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz