¿Cómo garantiza una aplicación .net/c# que el DLL llamado no sea reemplazado por una falsificación?
https://www.itsvse.com/thread-4173-1-1.html (Fuente: Arquitecto) La última vez, probamos que la DLL puede ser falsificada por otros y ejecutada, ¿cómo evitarlo?
Introducción emblemática:
Una firma de ensamblador (también conocida como firma de nombre fuerte) otorga a una aplicación o componente una identidad única que otros programas pueden usar para identificar y referenciar explícitamente la aplicación o componente. Un nombre fuerte consiste en el nombre de texto simple del ensamblaje, el número de versión, la información regional (si se proporciona) y un par de claves pública/privada.
Por ejemplo, una denominación fuerte permite a los autores y administradores de aplicaciones especificar la versión exacta de un servicio que será utilizada por componentes compartidos. Esto permite que diferentes aplicaciones especifiquen distintas versiones sin afectar a otras. También puedes usar el nombre fuerte del componente como evidencia de seguridad para generar una relación de confianza entre ambos componentes.
Para firmar fuertemente un ensamblador, no necesitas firmar un certificado digital con el código adquirido, puedes generar un archivo SNK con la herramienta sn que proporciona .NET, y puedes garantizar la firma de tu ensamblador guardando este archivo.
Sin embargo, una firma fuerte para un ensamblador no es lo mismo que una firma digital para un archivo ejecutable (incluso si el ensamblador es un archivo exe). Y MSDN dice claramente que los archivos exe no deben estar firmados con firmas firmas (aunque yo sí lo hice). Una firma digital para un archivo es en realidad adjuntar una firma a cualquier archivo a nivel del sistema de archivos, indicando al sistema operativo quién es el emisor de ese archivo. En el cuadro de propiedades del archivo, puedes ver la pestaña "Firmas Digitales".
Firmamos fuertemente la dll y luego la llamamos con un programa, que puede ejecutarse normalmente, de la siguiente manera:
¿Y si reemplazamos la dll por una dll forjada? Pruébalo y descubre que la ejecución es un error, lo que puede evitar que la dll que llama se forjee (Lo probé, modifiqué el código de la DLL firmado y luego lo regeneré, y la aplicación también puede llamarse normalmente, ¡debería ser así siempre que el programa esté firmado correctamente!)
El error es el siguiente:
Para más información sobre cómo llamar a la depuración en tiempo real (JIT) en lugar de este diálogo, Ver el final de este mensaje.
Texto inusual **************
System.IO.FileLoadException: 未能加载文件或程序集“dllFrom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eb67821f2cf76b4e”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040) Nombre del archivo: "dllFrom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eb67821f2cf76b4e" En TestDll.Form1.button1_Click_1 (Object sender, EventArgs e) En System.Windows.Forms.Control.OnClick(EventArgs e) En System.Windows.Forms.Button.OnClick(EventArgs e) En System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) En System.Windows.Forms.Control.WmMouseUp(Message& m, botón MouseButton, Int32 clics) En System.Windows.Forms.Control.WndProc(Message& m) En System.Windows.Forms.ButtonBase.WndProc(Message& m) En System.Windows.Forms.Button.WndProc(Message& m) En System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) En System.Windows.Forms.Control.ControlControlNativeWindow.WndProc(Message& m) En System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Advertencia: El registro de binding de ensamblador está desactivado. Para habilitar el registro de fallos de ensamblador, establece el valor del registro [HKLM\Software\Microsoft\Fusion!" EnableLog (DWORD) está configurado en 1. Nota: Habrá algunas penalizaciones de rendimiento asociadas al registro de fallos en binding de ensamblaje. Para desactivar esta función, elimina el valor del registro [HKLM\Software\Microsoft\Fusion!] EnableLog]。
Ensamblajes cargados ************** MSCORLIB Versión ensambladora: 4.0.0.0 Versión de Win32: 4.7.2098.0 Compilada por: NET47REL1LAST Código base: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll ---------------------------------------- TestDll Versión ensambladora: 1.0.0.0 Versión de Win32: 1.0.0.0 Código base: file:///C:/Users/itsvse_pc/Desktop/dllForm/TestDll/bin/Debug/TestDll.exe ---------------------------------------- System.Windows.Forms Versión ensambladora: 4.0.0.0 Versión de Win32: 4.7.2094.0 Compilada por: NET47REL1LAST Código base: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll ---------------------------------------- Sistema Versión ensambladora: 4.0.0.0 Versión de Win32: 4.7.2093.0 Compilada por: NET47REL1LAST Código base: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll ---------------------------------------- System.Drawing Versión ensambladora: 4.0.0.0 Versión de Win32: 4.7.2046.0 Compilada por: NET47REL1 Código base: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll ---------------------------------------- System.Configuration Versión ensambladora: 4.0.0.0 Versión de Win32: 4.7.2046.0 Compilada por: NET47REL1 Código base: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll ---------------------------------------- System.Core Versión ensambladora: 4.0.0.0 Versión de Win32: 4.7.2098.0 Compilada por: NET47REL1LAST Código base: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll ---------------------------------------- System.XML Versión ensambladora: 4.0.0.0 Versión de Win32: 4.7.2046.0 Compilada por: NET47REL1 Código base: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll ---------------------------------------- System.Windows.Forms.resources Versión ensambladora: 4.0.0.0 Versión de Win32: 4.7.2046.0 Compilada por: NET47REL1 Código base: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/System.Windows.Forms.resources.dll ---------------------------------------- mscorlib.recursos Versión ensambladora: 4.0.0.0 Versión de Win32: 4.7.2046.0 Compilada por: NET47REL1 Código base: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/mscorlib.resources.dll ----------------------------------------
Depuración de ************** Para habilitar la depuración en tiempo real (JIT), Debe configurarse en la sección system.windows.forms del archivo .config (machine.config) de la aplicación o del ordenador jitDebugging value. También debe estar habilitado al compilar la aplicación Depuración.
Por ejemplo:
<configuration> <system.windows.forms jitDebugging="true" /> </configuration>
Cualquier excepción no gestionada tras la depuración JIT está habilitada se enviará al depurador JIT registrado en esta máquina, En lugar de que se maneje con este diálogo.
|