暗号化されたビューまたはストアドプロシージャを表示する方法


27

サードパーティのデータベースに取り組んでいます。

右クリックしてビューの定義を表示しようとするCREATE TONEW QUERY EDIT WINDOW、エラーが発生します:

このオブジェクトにはこのプロパティが存在しないか、アクセス権が不十分なために取得できない可能性があります。テキストは暗号化されます。


必要に応じて、SQLプロファイラトレースを実行し、SP SQLがこの方法で行っていることをキャプチャすることもできます。
Pimp Juice IT

sqlプロファイラを介して暗号化されたtsqlを取得することは可能ですか?@PimpJuiceIT
ウェンツェル

@wenzzzel信じていますが、100%の正確さであなたに伝えることを正確に思い出すことはできませんが、暗号化されたSPで過去を信じているので、必要なものを確認するためにプロファイラートレースを実行しました。私はこれを確認できる環境をサポートしていませんが、暗号化されたプロセスからのものであっても、プロファイルトレースで何が実行されているかを見ることができると信じています。
ポン引きジュースIT

さて、私はそう確かその原因について、すべてのI GETではありませんよ-- Encrypted text
wenzzzel

回答:


12

暗号化されたオブジェクトをその場で復号化するために使用できる別のサードパーティツールは、Red GateのSQLプロンプトです:http : //www.red-gate.com/products/sql-development/sql-prompt/features

ストアドプロシージャにカーソルを合わせると、復号化された作成スクリプトが表示されます。

免責事項:このツールは商用(14日間の無料トライアル付き)であり、Red Gateで働いています。


18

私はこの問題についてかなり詳細に説明しています

要するに、オブジェクトは実際には暗号化されておらず、むしろ難読化されています。したがって、元のバックを取得できます。この方法は少し複雑ですが、次の手順で構成されています。

  1. Dedicated Admin Connectionを使用してインスタンスに接続します
  2. 次のように難読化されたコードを選択します。

    SELECT @secret = imageval
    FROM   sys.sysobjvalues
    WHERE  objid = OBJECT_ID(@object_name);
  3. オブジェクトを、同じ名前で同じobject_idと同じ長さ(バイトを使用ALTER PROCEDURE)を持つ別のオブジェクトで置き換えます

  4. 上記と同じ方法で新しく難読化されたコードを取得します
  5. 3つの値を一緒にXOR(難読化された元の、置換、難読化された置換)

これで元のコードが得られます。しかし、Kinが述べたように、これを行うことでサポートや法的意味合いさえあるかもしれないので、まず弁護士に相談してください。


14

モジュールテキストは、RC4ストリーム暗号を使用して暗号化されます。

RC4初期化キーは、次のSHA-1ハッシュから計算されます。

  • データベースファミリーGUID(からsys.database_recovery_status
    から変換されたUNIQUEIDENTIFIERバイナリ(16)
  • モジュールのオブジェクトID(カタログビュー
    から)整数からリトルエンディアンバイナリに変換(4)
  • モジュールのオブジェクトサブID smallintからリトルエンディアンbinary(2)に
    変換されました。

モジュールのオブジェクトサブIDは次のとおりです。

  • 番号なしのストアドプロシージャの場合は1。または
  • (廃止予定の)番号付きストアドプロシージャのプロシージャ番号。または
  • それ以外の場合は0。

適切な特権を持つユーザーは、次の方法でモジュールを復号化できます。

  1. sys.sysobjvaluesから暗号化されたバイナリを取得(DACを使用)
  2. 上記のRC4キーの計算
  3. バイナリで有名な標準RC4アルゴリズムを実行する
  4. 結果をバイナリからnvarchar(max)に変換する

私の記事の詳細と完全なコード実装:

の内部 WITH ENCRYPTION


これは、サードパーティのツールをインストールするのが現実的なソリューションではない、最も簡単で非営利的なアプローチだと思います。
ジョン・イスブレナー

12

専用管理者接続(DAC)を使用してSQL Serverに接続し、ストアドプロシージャのSQLテキストを表示できます。以下を使用してDACに接続します。

admin:Your_Servername

あなたには必要に応じて、完全な手順を見つけることができますスタックオーバーフロー上のこの回答マーティン・スミス

別の代替方法は、「暗号化されたストアドプロシージャ、ビュー、SQL Server 2005、2008、およびR2の関数の暗号化解除」で説明したサードパーティのスクリプトを使用することです

サイドノートとして -それがサードパーティのデータベースであり、prodでそれを行う場合、ベンダーはそれをサポートしますか?SPまたはビューを暗号化する正当な理由があるかもしれません。おそらくバックアップを取り、それをいじるのが良いでしょう。


8

元のDDLスクリプトをプレビューするか、暗号化されたオブジェクトを復号化する場合は、ApexSQL Decryptをチェックアウトできます。

これは無料のスタンドアロンツールで、SSMSに統合し、元のDDLスクリプトをプレビューするオプションがあります。また、複数のサーバーにあるオブジェクトを一度に復号化できます。あなたを助けることができるもう1つのツールは、dbForge SQL Decryptorです


0

一度に複数のストアドプロシージャを復号化するためによく使用する方法...

RedGateのSQL Compareを使用して、データベースを空のデータベース(またはストアドプロシージャがないことがわかっているデータベース)と比較します。展開スクリプトを作成し、SSMSにコピーします。WITH ENCRYPTIONを検索して空白に置き換えます。次に、CREATE PROCEDUREをALTER PROCEDUREに変更します。元のデータベースに対してRedGateスクリプトを実行すると、すべてのストアドプロシージャの暗号化が削除されました。

400以上のストアドプロシージャを持つデータベースがあり、SQLプロンプトは便利ですが、400以上のストアドプロシージャに対して右クリック、コピー、貼り付けをする時間はありませんでした。RedGate SQL Compareを使用して、開始から終了まで約10分で400以上のストアドプロシージャから暗号化を削除できました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.