Anzeigen einer verschlüsselten Ansicht oder einer gespeicherten Prozedur

27

Ich arbeite an einer Drittanbieter-Datenbank.

Wenn ich versuche, die Definition einer Ansicht durch Klicken mit der rechten Maustaste anzuzeigen, CREATE TOund dann zu NEW QUERY EDIT WINDOW, wird eine Fehlermeldung angezeigt:

Diese Eigenschaft ist für dieses Objekt möglicherweise nicht vorhanden oder kann aufgrund unzureichender Zugriffsrechte nicht abgerufen werden. Der Text ist verschlüsselt.

goofyui
quelle
Bei Bedarf können Sie auch einen SQL-Profiler-Trace ausführen und auf diese Weise erfassen, was der SP-SQL-Code tut.
Pimp Juice IT
Ist es möglich, die verschlüsselte tsql durch SQL Profiler zu bekommen? @PimpJuiceIT
wenzzzel
@wenzzzel Ich glaube, es ist, aber ich erinnere mich nicht genau, um Ihnen mit 100% Genauigkeit zu sagen, aber ich glaube, wenn er mit einem verschlüsselten SP vorbei ist, habe ich einen Profiler-Trace ausgeführt, um zu sehen, was benötigt wurde. Derzeit werden keine Umgebungen unterstützt, in denen ich dies bestätigen kann, aber ich glaube, Sie können sehen, was mit der Profilablaufverfolgung ausgeführt wird, auch wenn es sich um einen verschlüsselten Prozess handelt.
Pimp Juice IT
Okay, ich bin mir da nicht so sicher, -- Encrypted text
denn

Antworten:

12

Ein weiteres Drittanbieter-Tool, mit dem Sie verschlüsselte Objekte im laufenden Betrieb entschlüsseln können, ist die SQL-Eingabeaufforderung von Red Gate: http://www.red-gate.com/products/sql-development/sql-prompt/features

Bewegen Sie den Mauszeiger über die gespeicherte Prozedur, um das entschlüsselte Erstellungsskript anzuzeigen.

Haftungsausschluss: Dieses Tool ist kommerziell (mit einer 14-tägigen kostenlosen Testversion) und ich arbeite für Red Gate.

Michael
quelle
18

Ich habe eine ziemlich detaillierte Beschreibung zu diesem Problem hier .

Kurz gesagt, das Objekt ist nicht wirklich verschlüsselt, sondern verschleiert. Daher können wir das Original zurückholen. Die Methode ist etwas umständlich, besteht aber aus folgenden Schritten:

  1. Stellen Sie über die dedizierte Administratorverbindung eine Verbindung zur Instanz her
  2. Wählen Sie den verschleierten Code wie folgt aus:

    SELECT @secret = imageval
    FROM   sys.sysobjvalues
    WHERE  objid = OBJECT_ID(@object_name);
  3. Ersetzen Sie das Objekt durch ein anderes Objekt mit demselben Namen, derselben object_id und derselben Länge in Bytes (z. B. mit ALTER PROCEDURE).

  4. Holen Sie sich den neu verschleierten Code auf die gleiche Weise wie oben
  5. XOR die drei Werte zusammen (verschleiertes Original, Ersatz und verschleierter Ersatz)

Das gibt Ihnen den ursprünglichen Code. Wie Kin bereits erwähnt hat, kann dies jedoch Unterstützung und sogar rechtliche Auswirkungen haben. Fragen Sie daher zunächst Ihren Anwalt.

Sebastian Meine
quelle
14

Der Modultext wird mit einer RC4- Stream-Verschlüsselung verschlüsselt .

Der RC4-Initialisierungsschlüssel wird aus dem SHA-1- Hash von:

  • Die GUID der Datenbankfamilie (von sys.database_recovery_status )
    Von uniqueidentifier in binary konvertiert (16)
  • Die Objekt-ID des Moduls (aus den Katalogansichten).
    Von Ganzzahl in Little-Endian- Binär (4) konvertiert.
  • Die Objekt-Sub-ID
    des Moduls. Von Smallint in Little-Endian- Binär (2) konvertiert .

Die Objekt-Sub-ID des Moduls lautet:

  • 1 für eine nicht nummerierte gespeicherte Prozedur; oder
  • Die Prozedurnummer für eine (veraltete) gespeicherte Prozedur mit Nummer. oder
  • 0 sonst.

Ein entsprechend privilegierter Benutzer kann das Modul dann entschlüsseln, indem er:

  1. Abrufen der verschlüsselten Binärdatei aus sys.sysobjvalues (mithilfe des DAC)
  2. Berechnung der RC4-Taste wie oben beschrieben
  3. Ausführen des bekannten Standard-RC4-Algorithmus auf der Binärdatei
  4. Konvertieren des Ergebnisses von binär nach nvarchar (max)

Weitere Details und eine vollständige Code-Implementierung in meinem Artikel:

Die Interna von WITH ENCRYPTION

Paul White sagt GoFundMonica
quelle
Ich denke, dies ist der einfachste, nichtkommerzielle Ansatz, bei dem die Installation eines Tools von Drittanbietern keine praktikable Lösung ist.
John Eisbrener
12

Sie können über die Dedicated Administrator Connection (DAC) eine Verbindung zu SQL Server herstellen und dann den SQL-Text der gespeicherten Prozedur anzeigen. Stellen Sie eine Verbindung zum DAC her, indem Sie Folgendes verwenden:

admin:Your_Servername

Die vollständigen Schritte in dieser Antwort finden Sie unter Stack Overflow von Martin Smith .

Eine andere Alternative ist die Verwendung einiger Skripts von Drittanbietern, wie in Entschlüsseln von verschlüsselten gespeicherten Prozeduren, Ansichten und Funktionen in SQL Server 2005, 2008 und R2 beschrieben

Als Randnotiz : Wenn es sich um eine Datenbank eines Drittanbieters handelt und Sie dies auf Anfrage tun, wird der Anbieter dies unterstützen? Es kann einen guten Grund geben, die SPs oder Ansichten zu verschlüsseln. Es ist wahrscheinlich besser, ein Backup zu machen und dann damit herumzuspielen.

Kin Shah
quelle
8

Wenn Sie eine Vorschau des ursprünglichen DDL-Skripts anzeigen oder ein verschlüsseltes Objekt entschlüsseln möchten, können Sie ApexSQL Decrypt auschecken

Es ist ein kostenloses eigenständiges Tool mit der Option, es in SSMS zu integrieren und eine Vorschau des ursprünglichen DDL-Skripts anzuzeigen. Außerdem können Sie Objekte, die sich auf mehreren Servern befinden, in einer Runde entschlüsseln. Ein weiteres Tool, das Ihnen helfen kann, ist dbForge SQL Decryptor

McRobert
quelle
0

Eine Methode, die ich oft verwende, um mehrere gespeicherte Prozeduren gleichzeitig zu entschlüsseln ...

Verwenden Sie SQL Compare von RedGate und vergleichen Sie Ihre Datenbank mit einer leeren Datenbank (oder jede Datenbank, von der Sie wissen, dass sie nicht über die gespeicherten Prozeduren verfügt). Erstellen Sie ein Bereitstellungsskript und kopieren Sie es in SSMS. Suchen und ersetzen Sie WITH ENCRYPTION durch Leerzeichen. Ändern Sie dann das CREATE PROCEDURE in ALTER PROCEDURE. Führen Sie das RedGate-Skript für die ursprüngliche Datenbank aus, und Sie haben die Verschlüsselung aller gespeicherten Prozeduren entfernt.

Ich hatte eine Datenbank mit über 400 gespeicherten Prozeduren, und obwohl SQL Prompt praktisch ist, hat es sich nicht gelohnt, mit der rechten Maustaste zu klicken, zu kopieren und gegen über 400 gespeicherte Prozeduren einzufügen. Mit RedGate SQL Compare konnte ich die Verschlüsselung meiner über 400 gespeicherten Prozeduren in ungefähr 10 Minuten entfernen.

Aaron Hurst
quelle