![]() |
Wie sicher ist wm_copydata
Hallo zusammen,
ich verschicke nur mal als Beispiel per Timer die Datum/Uhrzeit
Delphi-Quellcode:
und empfange den in einem anderen Programm in Form2
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;
Delphi-Quellcode:
Meine Fragen sind nun:
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;
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 |
AW: Wie sicher ist wm_copydata
Zitat:
Nimm einfach
Delphi-Quellcode:
Da der gesendete String #0-terminiert ist sollte das klappen.
sText := PWideChar(Message.CopyDataStruct.lpData);
Zitat:
Zitat:
Zitat:
|
AW: Wie sicher ist wm_copydata
Delphi-Quellcode:
-> Chars, nicht Size
SetString(sText, PWideChar(Message.CopyDataStruct.lpData), Message.CopyDataStruct.cbData div 2 - 1);
oder
Delphi-Quellcode:
(du hast ja zum Glück eine #0 am Ende mitgegeben)
sText := PWideChar(Message.CopyDataStruct.lpData);
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. ![]() |
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 |
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 |
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 |
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:
übergeben.
CopyDataStruct.dwData
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.
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. |
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. |
AW: Wie sicher ist wm_copydata
Zitat:
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. |
AW: Wie sicher ist wm_copydata
Zitat:
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 01:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz