web-dev-qa-db-ja.com

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

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

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

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

27
goofyui

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

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

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

12
michristofides

この問題についてかなり詳しい説明があります ここ

つまり、オブジェクトは実際には暗号化されておらず、難読化されています。したがって、元の状態に戻すことができます。この方法は少し複雑ですが、次の手順で構成されています。

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

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

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

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

18
Sebastian Meine

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

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

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

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

  • 番号のないストアドプロシージャの場合は1。または
  • (非推奨)番号付きストアドプロシージャのプロシージャ番号。または
  • それ以外の場合は0。

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

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

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

WITH ENCRYPTIONの内部構造

14
Paul White 9

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

admin:Your_Servername

必要な完全な手順は、 Stack OverflowMartin Smithこの回答で確認できます。

もう1つの方法は、[////] SQL Server 2005、2008、およびR2 の暗号化されたストアドプロシージャ、ビュー、関数の復号化で説明されているように、サードパーティのスクリプトを使用することです。

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

12
Kin Shah

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

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

8
McRobert

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

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

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

0
Aaron Hurst