Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DFM-Dateien verschlüsseln? (https://www.delphipraxis.net/192554-dfm-dateien-verschluesseln.html)

a.def 1. Mai 2017 01:06

AW: DFM-Dateien verschlüsseln?
 
Klingt kompliziert. Ich habe das jetzt anders aber schlechter gemacht. Funktioniert trotzdem.

Luckie 1. Mai 2017 01:39

AW: DFM-Dateien verschlüsseln?
 
Und wie hast du es gemacht? :roll:

nahpets 1. Mai 2017 01:56

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.

mschaefer 1. Mai 2017 04:35

AW: DFM-Dateien verschlüsseln?
 
Dfm2Pas kann Ressourcen aus EXE auslesen.

himitsu 1. Mai 2017 05:40

AW: DFM-Dateien verschlüsseln?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1369547)
Zitat:

Zitat von a.def (Beitrag 1369540)
ein kleiner Test lädt zwar meine DFM-Resource aber ich bekomme nur 2 Zeilen ausgegeben und die noch mit falschen Zeichen:


Warum hatte ich vorher schon geschrieben dass die DFM-Ressourcen in der EXE binär sind?
Delphi-Referenz durchsuchenTestStreamFormat
ObjectTextToResource
Delphi-Referenz durchsuchenObjectResourceToText
ObjectBinaryToText
ObjectTextToBinary

Delphi-Quellcode:
Stream := TResourceStream.Create(...);
Form := TXyzForm.Create;
Form.ReadComponent(Stream);
Vorher aber natürlich das Laden der DFM unterbinden, siehe TCustomForm.Create .
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:
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
Ich weiß, Instance.Create ist eigentlich "falsch" und es müsste Class.Create heißen, aaaaaaaaaber ... siehe NewInstance :angle:

Und das Verschlüssen dann natürlich von außen. (eine zweite EXE im AfterBuild aufrufen, die das macht)
MSDN-Library durchsuchenUpdateResource 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.

Aviator 1. Mai 2017 10:18

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.

nahpets 1. Mai 2017 10:28

AW: DFM-Dateien verschlüsseln?
 
Aus meiner Sicht ist das 'ne interessante Spielerei.
Ernsthaft benötigen tue ich das nicht.

mschaefer 1. Mai 2017 10:43

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

Michael II 1. Mai 2017 11:10

AW: DFM-Dateien verschlüsseln?
 
Zitat:

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
Phantastische Idee - bisher habe ich mich immer gefragt, wie ich Backups meiner Formulardateien erstellen soll, damit ich sie allenfalls bei IDE Ladeproblemen wiederherstellen kann. Jetzt sehe ich endlich einen Weg.

Uwe Raabe 1. Mai 2017 11:16

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:
  1. man überschreibt die Methode GetDeltaStreams
  2. man verdrahtet den (protected) Event OnGetDeltaStreams

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:
inherited
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.

Delphi-Quellcode:
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;
Hier noch die Original-DFM als Text:
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.
Seite 3 von 4     123 4      

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