Как просмотреть зашифрованное представление или хранимую процедуру

27

Я работаю над сторонней базой данных.

Когда я пытаюсь просмотреть определение представления, щелкнув правой кнопкой мыши CREATE TOи затем NEW QUERY EDIT WINDOW, я получаю сообщение об ошибке:

Это свойство может не существовать для этого объекта или не может быть извлечено из-за недостаточных прав доступа. Текст зашифрован.

goofyui
источник
При необходимости вы также можете запустить трассировку профилировщика SQL и зафиксировать действия SP SQL.
Сок Pimp IT
Можно ли получить зашифрованный TSQL через SQL Server Profiler? @PimpJuiceIT
Венццель
@ Wenzzzel Я верю, что это так, но я не помню точно, чтобы сказать вам со 100% точностью, но я верю, что в прошлом он с зашифрованным SP, я запустил трассировку профилировщика, чтобы увидеть, что было нужно. Я не поддерживаю какие-либо среды в то время, когда могу это подтвердить, но я верю, что вы можете видеть, что запускается с трассировкой профиля, даже если это происходит в зашифрованном процессе.
Сок Pimp IT
Хорошо, я не уверен в этом, потому что все, что я получаю,-- Encrypted text
Венцзель

Ответы:

12

Другим сторонним инструментом, который вы можете использовать для расшифровки зашифрованных объектов на лету, является SQL-подсказка Red Gate: http://www.red-gate.com/products/sql-development/sql-prompt/features

Наведя указатель мыши на хранимую процедуру, вы сможете увидеть расшифрованный скрипт создания.

Отказ от ответственности: этот инструмент является коммерческим (с 14-дневной бесплатной пробной версией), и я работаю на Red Gate.

Майкл
источник
18

У меня есть довольно подробное описание этой проблемы здесь .

Короче говоря, объект не зашифрован, а запутан. Поэтому мы можем получить оригинал обратно. Метод немного сложен, но состоит из следующих шагов:

  1. Соединитесь с экземпляром, используя выделенное административное соединение
  2. Выберите запутанный код следующим образом:

    SELECT @secret = imageval
    FROM   sys.sysobjvalues
    WHERE  objid = OBJECT_ID(@object_name);
  3. Замените объект другим объектом с таким же именем, идентичным object_id и одинаковой длиной в байтах (например, используя ALTER PROCEDURE)

  4. Получите только что запутанный код, как описано выше.
  5. XOR три значения вместе (запутанный оригинал, замена и запутанная замена)

Это даст вам оригинальный код. Однако, как упоминал Кин, это может иметь поддержку и даже юридические последствия, поэтому обязательно проконсультируйтесь со своим адвокатом.

Себастьян Майн
источник
14

Текст модуля зашифрован с использованием потокового шифра RC4 .

Ключ инициализации RC4 вычисляется из хэша SHA-1 :

  • Семьи баз данных GUID (от sys.database_recovery_status )
    конвертирован из UniqueIdentifier в двоичный (16)
  • Идентификатор объекта модуля (из представлений каталога)
    Преобразован из двоичного числа с прямым порядком байтов (4)
  • Субидентификатор объекта модуля
    Преобразован из smallint в двоичный код с прямым порядком байтов (2) .

Суб-идентификатор объекта модуля:

  • 1 для ненумерованной хранимой процедуры; или
  • Номер процедуры для (устаревшей) пронумерованной хранимой процедуры; или
  • 0 иначе

Пользователь с соответствующими привилегиями может затем расшифровать модуль следующим образом:

  1. Получение зашифрованного двоичного файла из sys.sysobjvalues (с использованием DAC)
  2. Вычисление ключа RC4, как описано выше
  3. Запуск хорошо известного стандартного алгоритма RC4 на двоичном
  4. Преобразование результата из двоичного файла в nvarchar (max)

Более подробная информация и полная реализация кода в моей статье:

Внутренние органы WITH ENCRYPTION

Пол Уайт говорит, что GoFundMonica
источник
Я думаю, что это самый простой, некоммерческий подход, когда установка стороннего инструмента не является возможным решением.
Джон Айсбренер
12

Вы можете подключиться к SQL Server, используя выделенное соединение администратора (DAC), а затем просмотреть текст sql хранимой процедуры. Подключитесь к ЦАП, используя:

admin:Your_Servername

Вы можете найти полные шаги , необходимые в этом ответе на переполнение стека с помощью Мартина Смита .

Другой альтернативой является использование некоторых сторонних сценариев, как указано в разделе Расшифровка зашифрованных хранимых процедур, представлений, функций в SQL Server 2005, 2008 и R2

В качестве дополнительного примечания - если это сторонняя база данных, и если вы делаете это на Prod, будет ли поставщик поддерживать ее? Там может быть хорошая причина для шифрования SP или просмотров. Вероятно, лучше сделать резервную копию, а затем возиться с этим.

Кин Шах
источник
8

Если вы хотите просмотреть исходный сценарий DDL или расшифровать зашифрованный объект, вы можете проверить ApexSQL Decrypt

Это бесплатный автономный инструмент с возможностью его интеграции в SSMS, предварительного просмотра оригинального сценария DDL. Также вы можете дешифровать объекты, расположенные на нескольких серверах, за один ход. Еще один инструмент, который может вам помочь, это dbForge SQL Decryptor

МакРоберт
источник
0

Метод, который я часто использую для расшифровки нескольких хранимых процедур одновременно ...

Используйте сравнение SQL RedGate и сравните свою базу данных с пустой базой данных (или любая известная вам база данных не будет иметь хранимых процедур). Создайте сценарий развертывания и скопируйте в SSMS. Найдите и замените WITH ENCRYPTION пробелами. Затем измените ПРОЦЕДУРУ СОЗДАНИЯ на ИЗМЕНЕНИЕ ПРОЦЕДУРЫ. Запустите скрипт RedGate для исходной базы данных, и вы удалили все шифрованные хранимые процедуры.

У меня была база данных с 400+ хранимыми процедурами, и, хотя SQL Prompt удобен, не стоило моего времени щелкать правой кнопкой мыши, копировать и вставлять более 400 хранимых процедур. Используя RedGate SQL Compare, я смог удалить шифрование из моих 400+ хранимых процедур примерно за 10 минут до начала.

Аарон Херст
источник