Come visualizzare una vista crittografata o una procedura memorizzata


27

Sto lavorando su un database di terze parti.

Quando provo a visualizzare la definizione di una vista facendo clic con il pulsante destro del mouse CREATE TOe quindi a NEW QUERY EDIT WINDOW, visualizzo un errore:

Questa proprietà potrebbe non esistere per questo oggetto o potrebbe non essere recuperabile a causa di diritti di accesso insufficienti. Il testo è crittografato.


Se necessario, è anche possibile eseguire una traccia del profiler SQL e acquisire anche ciò che SP SQL sta facendo in questo modo.
Pimp Juice IT

È possibile ottenere lo tsql crittografato tramite il profiler sql? @PimpJuiceIT
wenzzzel

@wenzzzel Credo di si, ma non ricordo esattamente di dirtelo con una precisione del 100%, ma credo che nel passato con un SP crittografato, ho eseguito una traccia del profiler per vedere cosa fosse necessario. Al momento non posso supportare alcun ambiente in cui posso confermarlo, ma credo che tu possa vedere cosa viene eseguito con la traccia del profilo anche se proviene da un processo crittografato.
Pimp Juice IT

Ok, non sono così sicuro di quella causa, tutto ciò che ottengo è-- Encrypted text
wenzzzel, il

Risposte:


12

Un altro strumento di terze parti che è possibile utilizzare per decrittografare gli oggetti crittografati al volo è il prompt SQL di Red Gate: http://www.red-gate.com/products/sql-development/sql-prompt/features

Passare il mouse sopra la procedura memorizzata ti consentirà quindi di visualizzare lo script di creazione decrittografato.

Disclaimer: questo strumento è commerciale (con una prova gratuita di 14 giorni) e lavoro per Red Gate.


18

Ho una descrizione abbastanza dettagliata di questo problema qui .

In breve, l'oggetto non è realmente crittografato, ma piuttosto offuscato. Pertanto possiamo recuperare il dorso originale. Il metodo è un po 'coinvolto ma consiste in questi passaggi:

  1. Connettersi all'istanza utilizzando la Connessione amministratore dedicata
  2. Seleziona il codice offuscato in questo modo:

    SELECT @secret = imageval
    FROM   sys.sysobjvalues
    WHERE  objid = OBJECT_ID(@object_name);
  3. Sostituisci l'oggetto con un altro che abbia lo stesso nome stesso object_id e la stessa lunghezza in byte (ad es. Usando ALTER PROCEDURE)

  4. Ottieni il codice appena offuscato come sopra
  5. XOR i tre valori insieme (originale offuscato, sostituzione e sostituzione offuscata)

Questo ti darà il codice originale. Tuttavia, come menzionato Kin, potrebbe esserci supporto e persino implicazioni legali nel fare questo, quindi assicurati di consultare prima il tuo avvocato.


14

Il testo del modulo viene crittografato utilizzando un codice di flusso RC4 .

La chiave di inizializzazione RC4 viene calcolata dall'hash SHA-1 di:

  • Il GUID della famiglia di database (da sys.database_recovery_status )
    Convertito da uniqueidentifier in binario (16)
  • L' ID oggetto del modulo (dalle viste del catalogo)
    Convertito da intero a binario little-endian (4)
  • L' ID secondario oggetto del modulo
    convertito da binario smallint a little-endian (2) .

L'ID secondario oggetto del modulo è:

  • 1 per una stored procedure non numerata; o
  • Il numero di procedura per una procedura memorizzata numerata (obsoleta); o
  • 0 altrimenti.

Un utente adeguatamente privilegiato può quindi decrittografare il modulo:

  1. Ottenere il file binario crittografato da sys.sysobjvalues (utilizzando il DAC)
  2. Calcolo della chiave RC4 come descritto sopra
  3. Esecuzione del noto algoritmo RC4 standard sul binario
  4. Conversione del risultato da binario a nvarchar (max)

Maggiori dettagli e un'implementazione completa del codice nel mio articolo:

Gli interni di WITH ENCRYPTION


Penso che questo sia l'approccio più semplice, non commerciale, in cui l'installazione di uno strumento di terze parti non è una soluzione fattibile.
John Eisbrener,

12

È possibile connettersi a SQL Server utilizzando DAC (Dedicated Administrator Connection), quindi visualizzare il testo sql della procedura memorizzata. Connettersi al DAC utilizzando:

admin:Your_Servername

Puoi trovare tutti i passaggi necessari in questa risposta su Stack Overflow di Martin Smith .

Un'altra alternativa è quella di utilizzare alcuni script di terze parti come indicato in Decrittografia di stored procedure, viste, funzioni crittografate in SQL Server 2005, 2008 e R2

Come nota a margine : se si tratta di un database di terze parti e se lo si fa su prod, il fornitore lo supporterà? Potrebbe esserci un buon motivo per crittografare gli SP o le visualizzazioni. Probabilmente è meglio fare un backup e poi giocherellare con quello.


8

Se si desidera visualizzare l'anteprima dello script DDL originale o decrittografare un oggetto crittografato, è possibile controllare ApexSQL Decrypt

È uno strumento autonomo gratuito, con un'opzione per integrarlo in SSMS, visualizzare l'anteprima dello script DDL originale. Inoltre, è possibile decrittografare oggetti situati su più server in un turno. Un altro strumento che può aiutarti, è dbForge SQL Decryptor


0

Un metodo che uso spesso per decrittografare più stored procedure alla volta ...

Usa RedGate's SQL Compare e confronta il tuo database con un database vuoto (o qualsiasi database che conosci non avrà le procedure memorizzate). Crea uno script di distribuzione e copia in SSMS. Trova e sostituisci CON ENCRYPTION con spazi bianchi. Quindi modificare CREATE PROCEDURE in ALTER PROCEDURE. Esegui lo script RedGate sul database originale e avrai rimosso tutta la crittografia della procedura memorizzata.

Avevo un database con oltre 400 stored procedure e, sebbene SQL Prompt sia utile, non valeva la pena dedicare un clic destro, copiare, incollare su oltre 400 stored procedure. Utilizzando RedGate SQL Compare sono stato in grado di rimuovere la crittografia dalle mie oltre 400 procedure memorizzate in circa 10 minuti dall'inizio alla fine.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.