Frage

Ich habe eine Anordnung, die sollte nicht von jeder Anwendung verwendet werden, um andere als die bestimmten ausführbaren Datei. Bitte geben Sie mir ein paar Anweisungen, dies zu tun.

War es hilfreich?

Lösung

Sie können die Montage und die ausführbare Datei mit dem gleichen Schlüssel signieren und dann einen Scheck im Konstruktor der Klassen setzen Sie schützen möchten:

public class NotForAnyoneElse {
  public NotForAnyoneElse() {
    if (typeof(NotForAnyoneElse).Assembly.GetName().GetPublicKeyToken() != Assembly.GetEntryAssembly().GetName().GetPublicKeyToken()) {
      throw new SomeException(...);
    }
  }
}

Andere Tipps

In .Net 2.0 oder besser, alles intern machen, und dann Friend-Assemblys verwenden

http://msdn.microsoft.com/en-us/library/ 0tke9fxk.aspx

Das wird nicht aufhören Reflexion. Ich möchte von unten einige der Informationen integrieren. Wenn Sie unbedingt jemanden brauchen, um zu verhindern Aufruf, wahrscheinlich die beste Lösung ist:

  1. ILMerge die .exe und .dll
  2. verschleiern die endgültige .exe

Sie können auch den Call-Stack prüfen und die Montage für jeden Anrufer und stellen Sie sicher, dass sie alle mit dem gleichen Schlüssel wie die Assembly signiert sind.

100% vollständig unmöglich, ohne durch einige Reifen zu springen.

Einer der Vorteile der Verwendung des .NET ist die Fähigkeit, Reflexion zu verwenden, dh eine Baugruppe laden und sie kontrollieren, dynamisch Methoden aufrufen, etc. Dies ist, was Interop zwischen VB.NET und F # möglich macht.

Da jedoch der Code ist in einer verwalteten Assembly, die bedeutet, dass jemand einen Verweis auf den Code hinzufügen und seine öffentlichen Methoden aufrufen oder es mithilfe von Reflektion laden und rufen private Methoden . Auch wenn Sie Ihren Code ‚verschleiern‘, werden die Menschen noch in der Lage sein, Reflexion zu verwenden und Ihren Code aufrufen. da alle werden jedoch die Namen etwas maskiert tun ist prohibitavely schwierig.

Wenn Sie Ihren .NET-Code in einer Art und Weise versenden müssen, die von der Ausführung es andere Menschen verhindert, könnten Sie in der Lage sein, Ihre binären ngen (kompilieren zu x86) und die Binärdateien, versandt.

Ich weiß nicht, die Besonderheiten Ihrer Situation, aber Verschleierung sollte gut genug sein.

Sie könnten auch einen Blick auf die Verwendung von Netz ausführbare Packer und Kompressor.

Dies geschieht Ihre Baugruppen und Ihre Exe-Datei und packt sie in eine einzige ausführbare Datei, so dass sie ohne ein wenig nicht sichtbar für die Außenwelt sind um zu graben.

Meine Vermutung ist, dass dies ausreichend ist, den Zugang für die meisten .net Programmierer zu verhindern.

Ein großer Vorteil des .netz Ansatzes ist, dass es Sie nicht benötigen, um Ihren Code zu ändern. Ein weiterer Vorteil ist, dass es wirklich Installationsprozess vereinfacht.

Sie sollten Lage sein, alles intern scoped zu machen, und verwenden Sie dann die InternalsVisibleTo nur, dass eine Baugruppe Zugriff auf die internen Verfahren zu gewähren Attribut.

Der Code Access Security Attribut, das @ Charles Graham erwähnt ist StrongNameIdentityPermissionAttribute

Wie einige Leute schon erwähnt haben, verwenden Sie das Attribut InternalsVisibleTo und alles als interne markieren. Dies wird natürlich nicht Schutz vor Reflexion.

Eine Sache, die erwähnt has not worden ist ILMerge Ihre Baugruppen in Ihr Haupt-EXE / DLL / was auch immer, dies wird die Barriere für die Einreise ein bisschen nach oben (die Leute Ihre assemby nicht in der Lage sein zu sehen, auf einer eigenen Sitzung gefragt werden, verwiesen) , aber wird nicht die Reflexion Route stoppen ..

UPDATE: Auch IIRC hat ILMerge eine Funktion, wo es die fusionierte Baugruppen automaticaly internalisieren können, die Sie InternalsVisibleTo überhaupt nicht bedeuten würde, müssen Sie mit

Ich bin mir nicht sicher, ob dies für Sie eine verfügbare Allee ist, aber vielleicht können Sie die Assembly mithilfe von WCF oder ASP.NET Web-Service hosten und eine Art von Authentifizierungsschema (LDAP, public / rpivate Schlüsselpaar verwenden usw. nur erlaubt Clients) eine Verbindung zu gewährleisten. Dies würde halten Sie Ihre Montage physisch aus der Hand jemand anderem und Sie können kontrollieren, wer ihm verbindet. Nur so ein Gedanke.

Sie könnten in der Lage sein, dies auf der Versammlung in den Code Access Security Richtlinien festlegen.

Sie können Verschleierung verwenden.

Das wird sich:

int MySecretPrimeDetectionAlgorithm(int lastPrimeNumber);

In etwas unleserlich wie:

int Asdfasdfasdfasdfasdfasdfasdf(int qwerqwerqwerqwerqwerqwer);

Andere werden noch in der Lage sein, Ihre Assembly zu verwenden, aber es wird schwierig sein, jeden vernünftigen zu machen.

Es klingt wie Sie für einen Schutz oder Verdunkelung Werkzeug suchen. Zwar gibt es kein Allheilmittel ist, empfehlen die Schutz-Tool I Smartassembly . Einige Alternativen sind Salamander Obfuscator , Dotfuscator und Xenocode .

Leider, wenn Sie Ihre Bytes jemandem geben zu lesen ... wenn sie genug Zeit und Mühe haben, können sie Ihren Code laden finden und aufrufen. Um präventiv einen Kommentar antworten ich sehe, Sie fragen häufig: Salamander Code verhindern wird, vor einer direkt in den Reflektor Werkzeug geladen, aber ich hatte schon bessere. (ZB: zuverlässigere) Erfahrungen mit Smartassembly

Hoffe, das hilft. :)

Wenn die Assembly ein Web-Service zum Beispiel ist, Sie die benannte ausführbare sicherstellen könnten in der SOAP-Nachricht einen geheimen Wert übergibt.

Sie einfach einen Passcode erforderlich bei der Verwendung eines Funktionsaufruf gesendet werden, und wenn es dann nicht funktioniert nichts zugelassen wurde, wie .setAuthorizeCode ( ‚123456‘) dann in jedem einzelnen Ort, die verwendet werden können es, wenn authorizeCode ! = 123456 dann Fehler auszutreten werfen oder einfach nur ... Es klingt nicht wie eine gute Antwort für die Wiederverwendbarkeit aber das ist genau der Punkt.

Das einzige Mal, es verwendet werden könnte, ist von Ihnen und wenn Sie hart Code der authorise Code in das Programm.

Nur ein Gedanke könnte sein, was Sie suchen, oder könnten Sie etwas Besseres zu begeistern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top