2009-07-14 1 views
1

Ich habe eine COM inproc DLL, die wir in unserem Produkt verwenden. Nun, wenn jemand herausfindet, welche Schnittstelle und APIs wir aus der DLL enthüllt haben, können diese APIs leicht aufgerufen werden.Wie kann ich jemanden davon abhalten, meine COM-Schnittstellen-APIs aufzurufen?

Gibt es eine Möglichkeit, zu verhindern, dass unbekannte Anwendungen meine APIs aufrufen?

Können wir eine Signatur in COM hinzufügen?

+0

Um relevantere Antworten zu erhalten, sollten Sie angeben, welche Sprache/Technologie sowohl für den COM-Server als auch für mögliche Clients verwendet wird. – sharptooth

+0

Ich benutze C++ für beide Clients und Server – anand

+0

ATL oder ähnliches? Dann können Sie einfach die "frühe Bindung, keine Typelib" -Weise gehen - das wird einfach funktionieren und niemand wird in der Lage sein zu untersuchen, welche Schnittstellen Sie haben. – sharptooth

Antwort

3

Die formale Methode zum Steuern der Verwendung Ihres Objekts besteht in der Implementierung von IClassFactory2 in der Klassenfactory, die Ihre COM-Objekte erstellt.

Hier ist ein Link auf MSDN, der die Schnittstelle erklärt.

IClassFactory2 at MSDN

Der Vorteil einer Implementierung zu schaffen ist, dass niemand eine Instanz ohne Löschen der Hürden der Registrierung durch IClassFactory2 holen kann.

Der Nachteil ist, dass Sie alle Orte, an denen Sie ein Objekt erstellen, überprüfen müssen, um sicherzustellen, dass sie nicht beschädigt sind. Das Erstellen von Instanzen wird mühsamer, obwohl einige Sprachen bereits Möglichkeiten haben, den Prozess weniger schmerzhaft zu machen (zB VB6).

Wenn Sie versuchen, ein Objekt mit vielen Instanziierungsaktivitäten zu schützen, möchten Sie möglicherweise die Methode von Mastermind zum Hinzufügen eines Schlüsselparameters verwenden oder eine Methode zum Entsperren Ihrer Schnittstellen hinzufügen, die korrekt aufgerufen werden muss bevor die Komponente dahinter verwendet werden kann.

1

Nichts hindert Sie daran, den Methoden einen "Schlüssel" -Parameter hinzuzufügen, der nur zurückkehrt, wenn der Schlüssel falsch ist.

Sehr einfach, aber für Anfänger.

+0

Nun, ich denke, jemand ist engagiert, um den Aufruf der API's zu finden, dann kann der Schlüssel leicht rückgängig gemacht werden. Andere Lösungen? – anand

0

Anders als irgendeine Art von "Schlüssel" -Param können Sie nicht verhindern, dass Neugierige Ihre Funktion entdecken und sie dann anrufen. Alles was es braucht, ist ein Debugger und etwas Geduld. Um vollkommen sicher zu sein, müssten Sie eine Art Zertifikat benötigen, das autorisierter Code erhalten könnte, aber alle anderen könnten nicht, aber das würde bedeuten, dass Ihr Code das Zertifikat verifizieren müsste.

2

Sie könnten Ihre Schnittstellen direkt von IUnknown (ohne IDispatch) erben lassen und die Typbibliothek nicht in die DLL einschließen. Auf diese Weise werden nur diejenigen, die Zugriff auf die Typbibliothek haben, in der Lage sein zu finden, welche Schnittstellen unterstützt werden, und die einzige andere Möglichkeit zum Ermitteln der Schnittstellen besteht darin, nur zu erraten. Wenn Sie diesen Weg gehen, möchten Sie möglicherweise auch die Anzahl der Klassen, die der Registrierung ausgesetzt sind (die mit CoCreateInstance() erstellt werden können) und stattdessen eine Reihe von Factory-Methoden einer dedizierten, der Registrierung ausgesetzten Klasse verwenden.

Dies bedeutet, dass nur die frühe Bindung von vtable mit Ihrer Komponente funktioniert. Sie können auch das Standard-Marshaling mit dieser Komponente nicht verwenden (da keine Typbibliothek enthalten ist). Und das ist kein wirklicher Schutz, nur eine Möglichkeit, Dinge zu verbergen.