AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wie sicher ist wm_copydata

Ein Thema von norwegen60 · begonnen am 18. Mai 2022 · letzter Beitrag vom 23. Mai 2022
Antwort Antwort
Seite 1 von 2  1 2   
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#1

Wie sicher ist wm_copydata

  Alt 18. Mai 2022, 09:19
Hallo zusammen,

ich verschicke nur mal als Beispiel per Timer die Datum/Uhrzeit
Delphi-Quellcode:
procedure TForm1.ti1Timer(Sender: TObject);
var
  aCopyData: TCopyDataStruct;
  aHwnd: hwnd;
  sText: WideString;

begin
  sText := 'H' + DateTimeToStr(now);

  aCopyData.dwData := 17268;
  aCopyData.cbData := (Length(sText) + 1) * SizeOf(WideChar);
  aCopyData.lpData := PWideChar(sText);

  // Fenster anhand des Titelzeilentext suchen
  aHwnd:= FindWindowByTitle('Form2');

  if aHwnd<> 0 then
    SendMessage(aHwnd, WM_CopyData, WParam(Handle), LParam(@aCopyData))
end;
und empfange den in einem anderen Programm in Form2
Delphi-Quellcode:
procedure TForm2.WMCopyData(var Message: TWMCopyData);
var
  sText: String;

begin
  if (Message.CopyDataStruct.dwData = 17268) then
    // anzuzeigenden Text aus den Parametern generieren
    SetString(sText, PWideChar(Message.CopyDataStruct.lpData), Message.CopyDataStruct.cbData)
  else
    sText := 'Nichts für mich dabei';

  // Empfangenen Text ausgeben
  la1.Caption := sText;
end;
Meine Fragen sind nun:
  • Ist der Code so korrekt incl. Behandlung des Strings?
  • Kann es je nach System/Umgebung Probleme mit Firewall/Virenscanner/Windows-Versionen geben?
  • Kann es sein, dass andere Anwendungen den Text abfangen? Hier meine ich eher aus Versehen, nicht bewusster Versuch, Messages abzuhören. Und es soll ein recht eindeutiger Form-Name verwendet werden.
  • Kann man die Message auch an den Handle eines Programms schicken und nicht direkt an ein Form?

Es geht mir weniger um die Sicherheit der Daten gegen fremden Zugriff sondern darum, wie sicher die Daten gehandelt werden.

Danke für euer Feedback
Gerd

Geändert von norwegen60 (18. Mai 2022 um 10:07 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Wie sicher ist wm_copydata

  Alt 18. Mai 2022, 13:10
Hallo zusammen,
Delphi-Quellcode:
procedure TForm2.WMCopyData(var Message: TWMCopyData);
var
  sText: String;

begin
  if (Message.CopyDataStruct.dwData = 17268) then
    // anzuzeigenden Text aus den Parametern generieren
    SetString(sText, PWideChar(Message.CopyDataStruct.lpData), Message.CopyDataStruct.cbData)
  else
    sText := 'Nichts für mich dabei';

  // Empfangenen Text ausgeben
  la1.Caption := sText;
end;
Meine Fragen sind nun:

Ist der Code so korrekt incl. Behandlung des Strings?
Nein. cbData enthält die Zahl der Bytes in lpData^, SetString erfordert aber die Zahl der Zeichen.
Nimm einfach
 sText := PWideChar(Message.CopyDataStruct.lpData); Da der gesendete String #0-terminiert ist sollte das klappen.

Zitat:
Kann es je nach System/Umgebung Probleme mit Firewall/Virenscanner/Windows-Versionen geben?
Glaube ich nicht, aber glauben heißt nicht wissen .
Zitat:
Kann es sein, dass andere Anwendungen den Text abfangen? Hier meine ich eher aus Versehen, nicht bewusster Versuch, Messages abzuhören. Und es soll ein recht eindeutiger Form-Name verwendet werden.
Es gibt globale message hooks, die auch wm_copydata mitbekommen, also ja, das kann passieren. Wenn es um kritische Daten geht solltest Du sie also verschlüsseln.
Zitat:
Kann man die Message auch an den Handle eines Programms schicken und nicht direkt an ein Form?
Man kann Messages nur an Window- oder Threadhandles schicken, wobei ein Ziel-Thread eine Message Loop oder Equivalent (MsgWaitFor...) haben muss.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#3

AW: Wie sicher ist wm_copydata

  Alt 18. Mai 2022, 13:11
SetString(sText, PWideChar(Message.CopyDataStruct.lpData), Message.CopyDataStruct.cbData div 2 - 1); -> Chars, nicht Size
oder
sText := PWideChar(Message.CopyDataStruct.lpData); (du hast ja zum Glück eine #0 am Ende mitgegeben)



Berechtigungen?

z.B. empfängt ein Process mit höheren Rechten viele Massages standardmäßig garnicht, wenn sie von einem Prozess mit geringeren Rechten oder aus einem anderen Benutzerkontext kommen.
https://docs.microsoft.com/en-us/pre...-and-integrity
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Mai 2022 um 15:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Wie sicher ist wm_copydata

  Alt 18. Mai 2022, 14:34
Ich habe vor einer Weile mal ein paar Wrapperklassen rund um diese Problematik geschrieben. Da ist es zwar der Server, der die Strings versendet, aber vielleicht kannst du davon ja was abgucken.

Hier der Interface Part (komplette Projektgruppe im Anhang):
Delphi-Quellcode:
unit IPCMessaging.Types;

interface

uses
  Winapi.Messages, Winapi.Windows,
  System.Classes, System.SysUtils, System.Generics.Collections;

type
  TDataMessageEvent = procedure(Sender: TObject; const AValue: string) of object;

type
  TIPCMessagingListener = class
  private const
    cUnregister = 0;
    cRegister = 1;
    cBroadcast = 2;
  private
    FClientMessageID: Cardinal;
    FServerMessageID: Cardinal;
    FWindowHandle: HWND;
  strict protected
    procedure HandleClientMessage(ASender: HWND; AData: Integer); virtual;
    procedure HandleDataMessage(ASender: HWND; const AValue: string); virtual;
    procedure HandleServerMessage(ASender: HWND; AData: Integer); virtual;
    procedure SendClientMessage(ARecipient: HWND; AData: Integer);
    procedure SendDataMessage(ARecipient: HWND; const AValue: string);
    procedure SendServerMessage(ARecipient: HWND; AData: Integer);
    procedure WndProc(var Msg: TMessage);
  public
    constructor Create;
    destructor Destroy; override;
  end;

  TIPCMessagingServer = class(TIPCMessagingListener)
  private
    FClientHandles: TList<HWND>;
    FData: string;
    procedure SetData(const Value: string);
  strict protected
    procedure HandleClientMessage(ASender: HWND; AData: Integer); override;
    procedure SendData;
  public
    constructor Create;
    destructor Destroy; override;
    property Data: string read FData write SetData;
  end;

  TIPCMessagingClient = class(TIPCMessagingListener)
  private
    FOnDataMessage: TDataMessageEvent;
    FServerHandle: HWND;
  strict protected
    procedure DataMessage(const AValue: string); virtual;
    procedure HandleDataMessage(ASender: HWND; const AValue: string); override;
    procedure HandleServerMessage(ASender: HWND; AData: Integer); override;
  public
    constructor Create;
    destructor Destroy; override;
    property OnDataMessage: TDataMessageEvent read FOnDataMessage write FOnDataMessage;
  end;

implementation
Angehängte Dateien
Dateityp: zip IPCMessaging.zip (107,5 KB, 24x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wie sicher ist wm_copydata

  Alt 19. Mai 2022, 05:22
Hallo zusammen,

Danke für eure Antworten. Das hat mir sehr geholfen.

Dass meine Stringermittlung nicht ganz stimmt hatte ich gemerkt als ich mir sText im Debugger angeschaut habe. Die Anzeige selber war ja gut da nur bis zu #0 angezeigt wurde.

Die Wrapperklasse schau ich mir an.

Danke noch mal

Grüße
Gerd
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wie sicher ist wm_copydata

  Alt 19. Mai 2022, 11:09
MessageHooks:
klar, könnten Andere es abfangen
oder sie lesen einfach den ProzessSpeicher einer der beiden Anwendungen aus (da ist es egal, wie es übergeben wird ... gibt ja noch dutzende andere Möglichkeiten von IPC)


Was die "Sicherheit" betreffend "nur auf gültige/richtige Messages reagieren" angeht, da kannst du zusätzlich zum dwData
noch weitere Daten ins lpData mit aufnehmen.
* z.B. einen Record, also noch irgendeine "bessere" Kennung zu/vor die Daten
* und oder die Daten signieren
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wie sicher ist wm_copydata

  Alt 19. Mai 2022, 12:28
Es geht mir nicht darum, dass unberechtigte die Daten lesen. Es sind reine Messwerte und sie sind unkritisch.
Ich muss aber sicherstellen, dass sie auch immer ankommen.
Um sie eindeutig zuornen zu können, habe ich dem Fensternamen eine 5stellige Nummer angehängt und die wird auch mit CopyDataStruct.dwData übergeben.
Es sollte also ziemlich sicher sein, dass ich nur Messdaten auswerte die für das Fenster bestimmt sind.

Und wozu das Ganze:
Es gibt eine Hauptanwendung, die normalerweise mit einem Messgerät verbunden ist.
Jetzt kann es aber sein, dass eine Hilfsanwendung auch mit demselben Messgerät kommunizieren muss.
  1. Wenn die Hauptanwendung gestartet wird und die Hilfsanwendung schon mit dem Messgerät verbunden ist, breche ich den Start ab und sage das die Hilfsanwendung erst beendet werden muss.
  2. Wenn die Hilfsanwendung gestartet wird und die Hauptanwendung schon mit dem Messgerät verbunden ist, kommuniziere ich über die Messages mit der Hauptanwendung. Wenn zulässig gibt die die Befehle ans Messgerät weiter und wieder zurück.
  3. Wenn nur die Hilfsanwendung gestartet wird, verbindet die sich direkt mit dem Messgerät.
Da die Hauptanwendung incl. Kommunikation per (mehrerer DLL's) zum Messgerät schon lange existiert, wollte ich den Eingriff dort so klein wie möglich halten.
Die komplette Werteübergabe erfolgt schon seit Jahrzehnten per Strings.

Und es sieht gut aus. Erste Tests laufen bisher problemlos.

In einer anderen Anwendung arbeite ich seit Jahren mit CreateNamedPipe und ConnectNamedPipe. Da kam es aber immer wieder vor, dass ich bei Windows-Versions-Wechseln was anpassen musste. Auch gibt es hin und wieder aufhänger die ich bisher nicht nachvollziehen konnte. Von daher wollte ich das hier vemeiden.

Geändert von norwegen60 (19. Mai 2022 um 12:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#8

AW: Wie sicher ist wm_copydata

  Alt 19. Mai 2022, 12:34
Bei PostMessage ist es schwerer zu erkennen, aber SendMessage sagt dir ja, ob es angekommen/verarbeitet wurde.
(nja, ob das Programm intern die Message verwirft, das bekommst nur mit, wenn dort dann auch ein entsprechender Result-Wert gesetzt wird)

Es muß nur jemand die Rückgabe(n) auswerten, also das was im MSDN unter "Return value" und "Remarks" erwähnt wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: Wie sicher ist wm_copydata

  Alt 20. Mai 2022, 10:59
Zitat:
Um sie eindeutig zuornen zu können
Ob du diese eindeutig zuornen kannst weiß ich nicht
Aber wenn du diese eindeutig zuordnen willst würde ich eine Konstante in Erwägung ziehen dieser einen aussagekräftigen Namen verpassen
damit du auch in 10 Jahren noch weist wofür diese steht.

WM_COPYDATA ist sicher hatte noch nie irgendwelche Probleme diesbezüglich.
Der Vorteil zudem ist das man unabhängig ist und sogar zwischen 32 und 64Bit Anwendungen kommunizieren kann.

Geändert von venice2 (20. Mai 2022 um 12:21 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.812 Beiträge
 
Delphi 12 Athens
 
#10

AW: Wie sicher ist wm_copydata

  Alt 22. Mai 2022, 15:18
Bei PostMessage ist es schwerer zu erkennen, aber SendMessage sagt dir ja, ob es angekommen/verarbeitet wurde.
(nja, ob das Programm intern die Message verwirft, das bekommst nur mit, wenn dort dann auch ein entsprechender Result-Wert gesetzt wird)

Es muß nur jemand die Rückgabe(n) auswerten, also das was im MSDN unter "Return value" und "Remarks" erwähnt wird.
Nur: SendMessage wartet, bis der Empfänger die Botschaft verarbeitet hat.
Falls das empfangende Programm aber irgendwie in eine Endlosschleife geraten sein sollte
wäre dann auch der Sender blockiert, was vermutlich nicht gewünscht wäre...
Es gibt halt selten Vorteile ohne Nachteile.
Man könnte natürlich auch noch eine Verbindung in die gegenrichtugn aufbauen über die bestätigungsmeldungen gesendet werden
und jedem Datenpaket eine eindeutige ID geben... Das könnte man dann Asynchron aufbauen.

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:57 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