Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Wie sicher ist wm_copydata (https://www.delphipraxis.net/210618-wie-sicher-ist-wm_copydata.html)

norwegen60 18. Mai 2022 09:19

Wie sicher ist wm_copydata
 
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

peterbelow 18. Mai 2022 13:10

AW: Wie sicher ist wm_copydata
 
Zitat:

Zitat von norwegen60 (Beitrag 1505977)
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
Delphi-Quellcode:
 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.

himitsu 18. Mai 2022 13:11

AW: Wie sicher ist wm_copydata
 
Delphi-Quellcode:
SetString(sText, PWideChar(Message.CopyDataStruct.lpData), Message.CopyDataStruct.cbData div 2 - 1);
-> Chars, nicht Size
oder
Delphi-Quellcode:
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

Uwe Raabe 18. Mai 2022 14:34

AW: Wie sicher ist wm_copydata
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

norwegen60 19. Mai 2022 05:22

AW: Wie sicher ist wm_copydata
 
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

himitsu 19. Mai 2022 11:09

AW: Wie sicher ist wm_copydata
 
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

norwegen60 19. Mai 2022 12:28

AW: Wie sicher ist wm_copydata
 
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
Delphi-Quellcode:
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.

himitsu 19. Mai 2022 12:34

AW: Wie sicher ist wm_copydata
 
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.

venice2 20. Mai 2022 10:59

AW: Wie sicher ist wm_copydata
 
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.

TurboMagic 22. Mai 2022 15:18

AW: Wie sicher ist wm_copydata
 
Zitat:

Zitat von himitsu (Beitrag 1506079)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr.
Seite 1 von 2  1 2      

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