Como exibir uma exibição criptografada ou procedimento armazenado


27

Estou trabalhando em um banco de dados de terceiros.

Quando tento visualizar a definição de uma visualização clicando com o botão direito do mouse CREATE TOe , em seguida NEW QUERY EDIT WINDOW, em , estou recebendo um erro:

Esta propriedade pode não existir para este objeto ou pode não ser recuperável devido a direitos de acesso insuficientes. O texto está criptografado.


Se necessário, você também pode executar um rastreamento do criador de perfil SQL e capturar o que o SP SQL está fazendo dessa maneira também.
Pimp Juice IT

É possível obter o tsql criptografado através do sql profiler? @PimpJuiceIT
wenzzzel 24/03

@ wenzzzel Acredito que sim, mas não me lembro exatamente para lhe dizer com 100% de precisão, mas acredito que ele passou por um SP criptografado, corri um rastreio de perfil para ver o que era necessário. Não sou compatível com nenhum ambiente no momento em que posso confirmar isso, mas acredito que você pode ver o que é executado com o rastreamento de perfil, mesmo que seja proveniente de um processo criptografado.
Pimp Juice IT

Ok, eu não tenho tanta certeza sobre isso porque tudo o que recebo é-- Encrypted text
wenzzzel 24/03

Respostas:


12

Outra ferramenta de terceiros que você pode usar para descriptografar objetos criptografados rapidamente é o SQL Prompt do Red Gate: http://www.red-gate.com/products/sql-development/sql-prompt/features

Passar o mouse sobre o procedimento armazenado permitirá que você veja o script de criação descriptografado.

Isenções de responsabilidade: esta ferramenta é comercial (com uma avaliação gratuita de 14 dias) e eu trabalho na Red Gate.


18

Eu tenho uma descrição bastante detalhada sobre esse problema aqui .

Em resumo, o objeto não é realmente criptografado, mas ofuscado. Portanto, podemos recuperar o original de volta. O método está um pouco envolvido, mas consiste nas seguintes etapas:

  1. Conecte-se à instância usando a Conexão de administrador dedicado
  2. Selecione o código ofuscado assim:

    SELECT @secret = imageval
    FROM   sys.sysobjvalues
    WHERE  objid = OBJECT_ID(@object_name);
  3. Substitua o objeto por outro que tenha o mesmo nome id_do_objeto e o mesmo comprimento em bytes (por exemplo, usando ALTER PROCEDURE)

  4. Obtenha o código recentemente ofuscado da mesma maneira que acima
  5. XOR os três valores juntos (original ofuscado, substituição e substituição ofuscada)

Isso fornecerá o código original. No entanto, como Kin mencionou, pode haver apoio e até implicações legais para fazer isso; consulte seu advogado primeiro.


14

O texto do módulo é criptografado usando uma cifra de fluxo RC4 .

A chave de inicialização do RC4 é calculada a partir do hash SHA-1 de:

  • A família de bancos de dados GUID (de sys.database_recovery_status )
    Convertido de uniqueidentifier em binário (16)
  • O ID do objeto do módulo (das visualizações de catálogo)
    Convertido de número inteiro em binário little-endian (4)
  • O sub ID do objeto do módulo
    Convertido de binário smallint para little-endian (2) .

O sub ID do objeto do módulo é:

  • 1 para um procedimento armazenado não numerado; ou
  • O número do procedimento para um procedimento armazenado numerado (descontinuado); ou
  • 0 caso contrário.

Um usuário com privilégios adequados pode descriptografar o módulo:

  1. Obtendo o binário criptografado de sys.sysobjvalues (usando o DAC)
  2. Computando a tecla RC4 conforme detalhado acima
  3. Executando o conhecido algoritmo RC4 padrão no sistema binário
  4. Convertendo o resultado de binário em nvarchar (max)

Mais detalhes e uma implementação completa do código no meu artigo:

Os internos de WITH ENCRYPTION


Acho que essa é a abordagem mais direta e não comercial, em que a instalação de uma ferramenta de terceiros não é uma solução viável.
John Eisbrener

12

Você pode conectar-se ao SQL Server usando o DAC (Dedicated Administrator Connection) e exibir o texto sql do procedimento armazenado. Conecte-se ao DAC usando:

admin:Your_Servername

Você pode encontrar as etapas completas necessárias nesta resposta no Stack Overflow de Martin Smith .

Outra alternativa é usar alguns scripts de terceiros, conforme mencionado em Descriptografando procedimentos armazenados criptografados, exibições, funções no SQL Server 2005, 2008 e R2

Como observação lateral - se for um banco de dados de terceiros e se você o fizer no prod, o fornecedor o apoiará? Pode haver um bom motivo para criptografar os SPs ou visualizações. Provavelmente é melhor fazer um backup e depois mexer com isso.


8

Se você deseja visualizar o script DDL original ou descriptografar um objeto criptografado, consulte o ApexSQL Decrypt

É uma ferramenta autônoma gratuita, com uma opção para integrá-lo ao SSMS, visualizar o script DDL original. Além disso, você pode descriptografar objetos localizados em vários servidores de uma vez. Mais uma ferramenta que pode ajudá-lo é o dbForge SQL Decryptor


0

Um método usado com freqüência para descriptografar vários procedimentos armazenados de cada vez ...

Use o SQL Compare da RedGate e compare seu banco de dados com um banco de dados vazio (ou qualquer banco de dados que você conheça não terá os procedimentos armazenados). Crie um script de implantação e copie para o SSMS. Encontre e substitua WITH ENCRYPTION pelo espaço em branco. Em seguida, mude o CREATE PROCEDURE para ALTER PROCEDURE. Execute o script RedGate no banco de dados original e você removeu toda a criptografia de procedimento armazenado.

Eu tinha um banco de dados com mais de 400 procedimentos armazenados e, embora o SQL Prompt seja útil, não valeu a pena clicar com o botão direito do mouse, copiar e colar nos mais de 400 procedimentos armazenados. Usando o RedGate SQL Compare, consegui remover a criptografia dos meus mais de 400 procedimentos armazenados em aproximadamente 10 minutos do início ao fim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.