Comment afficher une vue cryptée ou une procédure stockée

27

Je travaille sur une base de données tierce.

Lorsque j'essaie d'afficher la définition d'une vue en cliquant avec le bouton droit, CREATE TOpuis sur NEW QUERY EDIT WINDOW, j'obtiens une erreur:

Cette propriété peut ne pas exister pour cet objet ou peut ne pas être récupérable en raison de droits d'accès insuffisants. Le texte est crypté.

goofyui
la source
Si nécessaire, vous pouvez également exécuter une trace du profileur SQL et capturer également ce que fait le SP SQL.
Pimp Juice IT
Est-il possible d'obtenir le tsql chiffré via le profileur SQL? @PimpJuiceIT
wenzzzel
@wenzzzel Je crois que oui, mais je ne me souviens pas exactement de vous le dire avec une précision de 100%, mais je crois qu'après un SP chiffré, j'ai exécuté une trace de profileur pour voir ce qui était nécessaire. Je ne prends en charge aucun environnement au moment où je peux le confirmer, mais je pense que vous pouvez voir ce qui est exécuté avec la trace de profil même si elle provient d'un processus crypté.
Pimp Juice IT
D'accord, je ne suis pas si sûr de cela parce que tout ce que je reçois est-- Encrypted text
wenzzzel

Réponses:

12

Un autre outil tiers que vous pourriez utiliser pour déchiffrer des objets chiffrés à la volée est l'invite SQL de Red Gate: http://www.red-gate.com/products/sql-development/sql-prompt/features

En survolant la procédure stockée, vous pourrez alors voir le script de création décrypté.

Avertissements: cet outil est commercial (avec un essai gratuit de 14 jours) et je travaille pour Red Gate.

Michael
la source
18

J'ai une description assez détaillée sur ce problème ici .

Bref, l'objet n'est pas vraiment chiffré, mais plutôt obscurci. Par conséquent, nous pouvons récupérer le dos d'origine. La méthode est un peu impliquée mais elle consiste en ces étapes:

  1. Connectez-vous à l'instance à l'aide de la connexion d'administration dédiée
  2. Sélectionnez le code obscurci comme ceci:

    SELECT @secret = imageval
    FROM   sys.sysobjvalues
    WHERE  objid = OBJECT_ID(@object_name);
  3. Remplacez l'objet par un autre qui porte le même nom id_objet et la même longueur en octets (par exemple en utilisant ALTER PROCEDURE)

  4. Obtenez le code nouvellement obscurci de la même manière que ci-dessus
  5. XOR les trois valeurs ensemble (original obscurci, remplacement et remplacement obscurci)

Cela vous donnera le code d'origine. Cependant, comme Kin l'a mentionné, il peut y avoir un soutien et même des implications juridiques à ce sujet, alors assurez-vous de consulter d'abord votre avocat.

Sebastian Meine
la source
14

Le texte du module est crypté à l'aide d'un chiffrement de flux RC4 .

La clé d'initialisation RC4 est calculée à partir du hachage SHA-1 de:

  • Le GUID de famille de base de données ( à partir sys.database_recovery_status )
    reconverti uniqueidentifier à binaire (16)
  • ID d'objet du module (à partir des vues de catalogue)
    Converti d'un entier en binaire petit-boutien (4)
  • Du module sous-ID d'objet
    converti de smallint à little-endian binaire (2) .

Le sous-ID d'objet du module est:

  • 1 pour une procédure stockée non numérotée; ou
  • Numéro de procédure pour une procédure stockée numérotée (obsolète); ou
  • 0 sinon.

Un utilisateur disposant de privilèges appropriés peut ensuite déchiffrer le module en:

  1. Obtention du binaire chiffré à partir de sys.sysobjvalues (à l'aide du DAC)
  2. Calcul de la clé RC4 comme détaillé ci-dessus
  3. Exécution de l'algorithme RC4 standard bien connu sur le binaire
  4. Conversion du résultat du binaire en nvarchar (max)

Plus de détails et une implémentation complète du code dans mon article:

Les internes de WITH ENCRYPTION

Paul White dit GoFundMonica
la source
Je pense que c'est l'approche la plus simple et non commerciale où l'installation d'un outil tiers n'est pas une solution réalisable.
John Eisbrener
12

Vous pouvez vous connecter à SQL Server à l'aide de la connexion administrateur dédiée (DAC), puis afficher le texte SQL de la procédure stockée. Connectez-vous au DAC en utilisant:

admin:Your_Servername

Vous pouvez trouver toutes les étapes nécessaires dans cette réponse sur Stack Overflow de Martin Smith .

Une autre alternative consiste à utiliser certains scripts tiers comme mentionné dans Décryptage des procédures stockées, vues et fonctions chiffrées dans SQL Server 2005, 2008 et R2

En guise de remarque - s'il s'agit d'une base de données tierce et si vous la faites sur prod, le vendeur la prendra-t-il en charge? Il peut y avoir une bonne raison de chiffrer les SP ou les vues. Il est probablement préférable de faire une sauvegarde, puis de jouer avec.

Kin Shah
la source
8

Si vous souhaitez prévisualiser le script DDL d'origine ou décrypter un objet crypté, vous pouvez consulter ApexSQL Decrypt

C'est un outil autonome gratuit, avec une option pour l'intégrer dans SSMS, prévisualiser le script DDL original. En outre, vous pouvez déchiffrer des objets situés sur plusieurs serveurs en une seule fois. Un autre outil qui peut vous aider est le dbForge SQL Decryptor

McRobert
la source
0

Une méthode que j'utilise souvent pour décrypter plusieurs procédures stockées à la fois ...

Utilisez la comparaison SQL de RedGate et comparez votre base de données avec une base de données vide (ou toute base de données que vous connaissez n'aura pas les procédures stockées). Créez un script de déploiement et copiez-le dans SSMS. Trouvez et remplacez AVEC CHIFFREMENT avec un espace blanc. Remplacez ensuite CREATE PROCEDURE par ALTER PROCEDURE. Exécutez le script RedGate sur la base de données d'origine et vous avez supprimé tout le cryptage des procédures stockées.

J'avais une base de données avec plus de 400 procédures stockées et bien que l'invite SQL soit pratique, cela ne valait pas la peine de faire un clic droit, copier, coller contre plus de 400 procédures stockées. En utilisant RedGate SQL Compare, j'ai pu supprimer le chiffrement de mes 400+ procédures stockées en 10 minutes environ du début à la fin.

Aaron Hurst
la source