Hola, chicos,
¿Estás bien?

En esta publicación, demostraré cómo exportar el ensamblado de un CLR en SQL Server como una DLL y realizar ingeniería inversa en el código fuente de C#. La primera vez que necesité usar esta característica fue cuando ya había un ensamblado creado y compilado en la base de datos y necesitaba cambiar el código fuente de un procedimiento, pero la versión que había en la base de datos no parecía ser la misma que la de TFS (Team Foundation Server).

Cómo exportar el ensamblado de un CLR del banco a DLL

El primer paso para realizar esta actividad es exportar el ensamblado de la base de datos a DLL. Para hacer esto, necesitará identificar el nombre del ensamblado y ejecutar uno de los scripts siguientes.

Identificar el nombre del ensamblaje

Exportar el ensamblado a DLL con OLE Automation

Una forma de exportar el ensamblado a DLL es utilizar OLE Automation. Para hacer esto, use el siguiente código:

-- Habilitando o OLE Automation (Se já está habilitando, não precisa executar)
EXECUTE SP_CONFIGURE 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO

EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE
GO

DECLARE @IMG_PATH VARBINARY(MAX)
DECLARE @ObjectToken INT

SELECT
    @IMG_PATH = A.content
FROM
    sys.assembly_files      A   WITH(NOLOCK)
    JOIN sys.assemblies     B   WITH(NOLOCK) ON A.assembly_id = B.assembly_id
WHERE
    A.file_id = 1
    AND B.name = 'tSQLtCLR' -- nome do assembly

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, 'C:\Teste\myassembly.dll', 2 -- Nome do seu assembly
EXEC sp_OAMethod @ObjectToken, 'Close'
EXEC sp_OADestroy @ObjectToken  

-- Desativando o OLE Automation (Execute apenas se não estava ativado antes)
EXEC sp_configure 'Ole Automation Procedures', 0;
RECONFIGURE WITH OVERRIDE
GO

EXECUTE SP_CONFIGURE 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
GO

Exportar el ensamblado a DLL con CLR

Otra forma de exportar el ensamblado a DLL es utilizar el propio CLR.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void stpAssembly_Backup(SqlString Ds_Servidor, SqlString Ds_Database, SqlString Ds_Assembly, SqlString Ds_Diretorio_Destino)
    {
        
        var sql = "SELECT AF.content FROM " + Ds_Database.Value + @".[sys].assembly_files AF JOIN " + Ds_Database.Value + ".[sys].assemblies A ON AF.assembly_id = A.assembly_id where AF.file_id = 1 AND A.name = @assemblyname";

        using (var conn = new SqlConnection(Servidor.Localhost.Replace("LOCALHOST", Ds_Servidor.Value)))
        {

            conn.Open();

            using (var cmd = new SqlCommand(sql, conn))
            {

                var param = new SqlParameter("@assemblyname", SqlDbType.VarChar) { Value = Ds_Assembly.Value };
                cmd.Parameters.Add(param);

                using (var dr = cmd.ExecuteReader())
                {

                    dr.Read();

                    var bytes = dr.GetSqlBytes(0);
                    var nomeArquivo = Ds_Diretorio_Destino.Value + "/" + Ds_Assembly.Value + ((!Ds_Assembly.Value.ToLower().Contains(".dll")) ? ".dll" : "");

                    using (var bytestream = new FileStream(nomeArquivo, FileMode.CreateNew))
                    {
                        bytestream.Write(bytes.Value, 0, (int) bytes.Length);
                    }

                }
            }
        }
        
    }

}

Ejemplo de uso:

EXEC CLR.dbo.stpAssembly_Backup 
    @Ds_Servidor = N'vm-dba', -- nvarchar(max)
    @Ds_Database = N'BI', -- nvarchar(max)
    @Ds_Assembly = N'tSQLtCLR', -- nvarchar(max)
    @Ds_Diretorio_Destino = N'C:\Teste\' -- nvarchar(max)

Resultado:

Cómo realizar ingeniería inversa de DLL al código fuente

Una vez que haya exportado con éxito el ensamblaje de su biblioteca CLR a un archivo DLL, puede realizar ingeniería inversa del código fuente. Para hacer esto, existen varias herramientas, pero sugiero la herramienta JetBrains dotPeek.

Una vez instalada, puede abrir la herramienta dotPeek, hacer clic en el menú y seleccionar la opción “Abrir…”.

Ahora que su CLR aparecerá en la lista, simplemente haga clic en el botón resaltado en la imagen a continuación, o haga clic derecho en la biblioteca y seleccione la opción "Exportar a proyecto" o acceda al menú Archivo > "Exportar a proyecto".

Seleccione dónde desea guardar el código fuente y podrá dejar marcadas las opciones predeterminadas.

Listo. dotPeek realizó ingeniería inversa en su DLL y regeneró el código fuente original, como se muestra en el siguiente ejemplo:

Vale la pena señalar que algunos formatos, espacios y comentarios no se recuperan mediante la ingeniería de respaldo, ya que se pierden cuando se compila el código. Además, esta técnica sólo se aplica a archivos DLL que no se han sometido al proceso de ofuscación (cifrado del código fuente).

Eso es todo, amigos.
Espero que te haya gustado esta publicación.

¡Abrazo!

Base de datos de SQL Server cómo exportar, guardar, exportar el ensamblado desde un CLR como DLL y realizar ingeniería inversa al código fuente C# csharp desensamblado ingeniería inversa JetBrains dotPeek

Base de datos de SQL Server cómo exportar, guardar, exportar el ensamblado desde un CLR como DLL y realizar ingeniería inversa al código fuente C# csharp desensamblado ingeniería inversa JetBrains dotPeek