Extraindo um conjunto SQLCLR

4

Um de nossos aplicativos internos possui um assembly SQLCLR que está enfrentando problemas no momento. O desenvolvedor está tendo problemas para recriar o problema usando a versão que está armazenada em nosso sistema de controle de origem, então ele suspeita que algum código tenha sido liberado e não tenha sido enviado para o controle de origem. Existe uma maneira de extrair um assembly SQLCLR em um arquivo .dll para que ele possa fazer engenharia reversa para análise?

    
por Ed Leighton-Dick 07.05.2010 / 21:40

1 resposta

8

Existe de fato uma maneira - os conjuntos são armazenados na tabela sys.assembly_files em seu banco de dados. Selecione tudo de sys.assembly_files e encontre o assembly_id e execute o seguinte código (alterando o caminho assembly_id e SaveToFile ):

DECLARE @IMG_PATH VARBINARY(MAX)
DECLARE @ObjectToken INT

SELECT @IMG_PATH = content FROM sys.assembly_files WHERE assembly_id = 65536

EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
        EXEC sp_OASetProperty @ObjectToken, 'Type', 1
        EXEC sp_OAMethod @ObjectToken, 'Open'
        EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @IMG_PATH
        EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, 'D:\SqlServerProject1.dll', 2
        EXEC sp_OAMethod @ObjectToken, 'Close'
        EXEC sp_OADestroy @ObjectToken

Para que isso funcione, você precisará ativar o recurso OLE Automation na Configuração da Área de Superfície para Recursos em sua instância do SQL.

Eu peguei este código aqui: link

    
por 07.05.2010 / 22:45