Cómo ver una vista encriptada o un procedimiento almacenado

27

Estoy trabajando en una base de datos de terceros.

Cuando trato de ver la definición de una vista haciendo clic derecho CREATE TOy luego en NEW QUERY EDIT WINDOW, aparece un error:

Es posible que esta propiedad no exista para este objeto o que no se pueda recuperar debido a derechos de acceso insuficientes. El texto está encriptado.

goofyui
fuente
Si es necesario, también puede ejecutar un seguimiento del perfilador SQL y capturar lo que el SP SQL está haciendo de esta manera también.
Pimp Juice IT
¿Es posible obtener el tsql cifrado a través del perfilador sql? @PimpJuiceIT
wenzzzel
@wenzzzel Creo que sí, pero no recuerdo exactamente decírtelo con un 100% de precisión, pero creo que en el pasado con un SP encriptado, ejecuté un seguimiento del generador de perfiles para ver qué se necesitaba. No puedo admitir ningún entorno en el momento en que pueda confirmar esto, pero creo que puede ver lo que se ejecuta con el seguimiento del perfil, incluso si proviene de un proceso cifrado.
Pimp Juice IT
De acuerdo, no estoy tan seguro de eso porque todo lo que obtengo es-- Encrypted text
wenzzzel

Respuestas:

12

Otra herramienta de terceros que podría usar para descifrar objetos cifrados sobre la marcha es el mensaje SQL de Red Gate: http://www.red-gate.com/products/sql-development/sql-prompt/features

Al pasar el cursor sobre el procedimiento almacenado, podrá ver el script de creación descifrado.

Descargos de responsabilidad: esta herramienta es comercial (con una prueba gratuita de 14 días) y trabajo para Red Gate.

Miguel
fuente
18

Tengo una descripción bastante detallada sobre este problema aquí .

En resumen, el objeto no está realmente encriptado, sino más bien ofuscado. Por lo tanto, podemos recuperar el original de vuelta. El método es un poco complicado pero consta de estos pasos:

  1. Conéctese a la instancia utilizando la conexión de administrador dedicada
  2. Seleccione el código ofuscado como este:

    SELECT @secret = imageval
    FROM   sys.sysobjvalues
    WHERE  objid = OBJECT_ID(@object_name);
    
  3. Reemplace el objeto con otro que tenga el mismo nombre, el mismo object_id y la misma longitud en bytes (por ejemplo, usando ALTER PROCEDURE)

  4. Obtenga el código recién ofuscado de la misma manera que arriba
  5. XOR los tres valores juntos (original ofuscado, reemplazo y reemplazo ofuscado)

Eso te dará el código original. Sin embargo, como Kin mencionó, puede haber apoyo e incluso implicaciones legales para hacerlo, así que asegúrese de consultar primero a su abogado.

Sebastian Meine
fuente
14

El texto del módulo se cifra utilizando un cifrado de flujo RC4 .

La clave de inicialización RC4 se calcula a partir del hash SHA-1 de:

  • El GUID de la familia de bases de datos (de sys.database_recovery_status )
    Convertido de uniqueidentifier a binary (16)
  • El ID del objeto del módulo (de las vistas del catálogo)
    Convertido de entero a binario little-endian (4)
  • La ID de objeto del módulo
    convertida de smallint a little-endian binary (2) .

La ID del objeto del módulo es:

  • 1 para un procedimiento almacenado sin numerar; o
  • El número de procedimiento para un procedimiento almacenado numerado (en desuso); o
  • 0 de lo contrario.

Un usuario con privilegios adecuados puede descifrar el módulo de la siguiente manera:

  1. Obteniendo el binario encriptado de sys.sysobjvalues (usando el DAC)
  2. Calcular la clave RC4 como se detalla arriba
  3. Ejecutar el conocido algoritmo estándar RC4 en el binario
  4. Convertir el resultado de binario a nvarchar (max)

Más detalles y una implementación de código completo en mi artículo:

Lo interno de WITH ENCRYPTION

Paul White dice GoFundMonica
fuente
Creo que este es el enfoque más directo y no comercial en el que instalar una herramienta de terceros no es una solución factible.
John Eisbrener
12

Puede conectarse a SQL Server utilizando la Conexión de administrador dedicada (DAC) y luego ver el texto sql del procedimiento almacenado. Conéctese al DAC usando:

admin:Your_Servername

Puede encontrar los pasos completos necesarios en esta respuesta en Stack Overflow de Martin Smith .

Otra alternativa es utilizar algunos scripts de terceros como se menciona en Descifrar procedimientos almacenados cifrados, vistas, funciones en SQL Server 2005, 2008 y R2

Como nota al margen : si se trata de una base de datos de terceros y si lo hace en producción, ¿lo respaldará el proveedor? Puede haber una buena razón para cifrar los SP o las vistas. Probablemente sea mejor hacer una copia de seguridad y luego jugar con eso.

Kin Shah
fuente
8

Si desea obtener una vista previa de la secuencia de comandos DDL original o descifrar un objeto cifrado, puede consultar Descifrar ApexSQL

Es una herramienta independiente gratuita, con una opción para integrarlo en SSMS, previsualizar el script DDL original. Además, puede descifrar objetos ubicados en varios servidores en un turno. Una herramienta más que puede ayudarlo es dbForge SQL Decryptor

McRobert
fuente
0

Un método que uso a menudo para descifrar varios procedimientos almacenados a la vez ...

Use la comparación SQL de RedGate y compare su base de datos con una base de datos vacía (o cualquier base de datos que sepa que no tendrá los procedimientos almacenados). Cree un script de implementación y cópielo en SSMS. Encuentre y reemplace CON ENCRIPTACIÓN con espacios en blanco. Luego cambie el PROCEDIMIENTO DE CREACIÓN a ALTERAR PROCEDIMIENTO. Ejecute el script RedGate contra la base de datos original y ha eliminado todo el cifrado de procedimientos almacenados.

Tenía una base de datos con más de 400 procedimientos almacenados y, aunque SQL Prompt es útil, no valía la pena hacer clic derecho, copiar y pegar en más de 400 procedimientos almacenados. Utilizando RedGate SQL Compare, pude eliminar el cifrado de mis más de 400 procedimientos almacenados en aproximadamente 10 minutos, de principio a fin.

Aaron Hurst
fuente