AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DFM-Dateien verschlüsseln?

Ein Thema von a.def · begonnen am 30. Apr 2017 · letzter Beitrag vom 1. Mai 2017
Antwort Antwort
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#1

AW: DFM-Dateien verschlüsseln?

  Alt 1. Mai 2017, 10:43
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
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
744 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: DFM-Dateien verschlüsseln?

  Alt 1. Mai 2017, 11:10
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.
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.061 Beiträge
 
Delphi 12 Athens
 
#3

AW: DFM-Dateien verschlüsseln?

  Alt 1. Mai 2017, 11:16
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 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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#4

AW: DFM-Dateien verschlüsseln?

  Alt 1. Mai 2017, 12:46
Das entwickelt sich zu einer schönen Übung sehe ich gerade.
Ich habe mittlerweile alles hinbekommen außer..
ich schaffe es nicht die Datei abzüglich der letzten 16 Bytes einzulesen. Ich bekomme nur Chinesisch

Delphi-Quellcode:
// Dateiinhalt:
// TESTTESTTEST_d0f980502943ec62a52e0a44280a5066

 aFileStream := TFileStream.Create(sFile, fmOpenRead or fmShareDenyWrite);
 try
  // Get hash of the original file content without the hash we appended before
  aFileStream.Seek(32 * SizeOf(Char), soFromEnd); // gehe an die End-Position-32 Zeichen (also bis zum _)
  SetLength(s, aFileStream.Position * SizeOf(Char)); // setze die Länge von s auf Länge von "TESTTESTTEST_"
  aFileStream.Read(s[1], Length(s) * SizeOf(Char));
  ShowMessage(s); // Chinesisch?
 finally
  aFileStream.Free;
 end;
Alles andere klappt. Die letzten 32 Zeichen lese ich so aus
Delphi-Quellcode:
  SetLength(sOut, 32 * SizeOf(Char));
  aFileStream.Position := aFileStream.Size - Length(sOut);
  aFileStream.Read(sOut[1], Length(sOut) * SizeOf(Char));
  // sOut enthält nun d0f980502943ec62a52e0a44280a5066

Geändert von a.def ( 1. Mai 2017 um 12:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.173 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: DFM-Dateien verschlüsseln?

  Alt 1. Mai 2017, 12:50
Du weißt aber schon das unter XE8 SizeOf(Char) = 2 ist, oder?
Und wenn man einen Binären Inhalt in einen (Unicode) String liest kann (nach Betrachtung der Wahrscheinlichkeit) nur Chinesisch raus kommen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#6

AW: DFM-Dateien verschlüsseln?

  Alt 1. Mai 2017, 12:52
Das SizeOf(Char) 2 ist weiß ich. Aber wenn ich ich zum Auslesen 16*SizeOf(Char) verwende statt 32 bekomme ich ein falsches Ergebnis und nicht d0f980502943ec62a52e0a44280a5066
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: DFM-Dateien verschlüsseln?

  Alt 1. Mai 2017, 12:57
Ich würd' für die MD5-Checksumme kein Char sondern Byte nehmen.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#8

AW: DFM-Dateien verschlüsseln?

  Alt 1. Mai 2017, 13:06
Ich bin jetzt soweit, dass es funktioniert. Nur von Char auf Byte habe ich noch nicht umgestellt, da das irgendwie nicht klappt.
Delphi-Quellcode:
 // Calculate the hash of a files content and append it to the file
 aFileStream := TFileStream.Create(sFile, fmOpenReadWrite or fmShareDenyNone);
 try
  aFileStream.Position := 0;
  SetLength(s, aFileStream.Size);
  aFileStream.Read(s[1], Length(s));
  // hash berechnen

  aFileStream.Position := aFileStream.Size;
  aFileStream.Write(s[1], Length(s) * SizeOf(Char));
 finally
  aFileStream.Free;
 end;
Delphi-Quellcode:
 aFileStream := TFileStream.Create(sFile, fmOpenRead or fmShareDenyWrite);
 try
  // Get the hash of the original file content (without the hash we appended before)
  aFileStream.Position := 0;
  SetLength(s, aFileStream.Size - (32 * SizeOf(Char)));
  aFileStream.Read(s[1], Length(s));
  // hash berechnen

  // Get hash from stream end
  SetLength(sOut, 32 * SizeOf(Char));
  aFileStream.Position := aFileStream.Size - Length(sOut);
  aFileStream.Read(sOut[1], Length(sOut));
 finally
  aFileStream.Free;
 end;

Geändert von a.def ( 1. Mai 2017 um 13:35 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 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