Hoe garandeert een .net/c#-applicatie dat de geroepen dll niet wordt vervangen door vervalsing?
https://www.itsvse.com/thread-4173-1-1.html (Bron: Architect) De vorige keer testten we dat de dll door anderen vervalst en uitgevoerd kan worden, hoe voorkom je dat?
Signature Introductie:
Een assemblyhandtekening (ook wel een sterke naamhandtekening genoemd) geeft een applicatie of component een unieke identiteit die andere software kan gebruiken om de applicatie of component expliciet te identificeren en te refereren. Een sterke naam bestaat uit de eenvoudige tekstnaam van de assembly, het versienummer, regionale informatie (indien verstrekt) en een publiek/privé sleutelpaar.
Sterke naamgeving stelt applicatiemakers en beheerders bijvoorbeeld in staat om de exacte versie van één dienst te specificeren die door gedeelde componenten zal worden gebruikt. Dit stelt verschillende applicaties in staat om verschillende versies te specificeren zonder andere te beïnvloeden. Je kunt ook de sterke naam van de component gebruiken als beveiligingsbewijs om een vertrouwensrelatie tussen de twee componenten te creëren.
Om een assembly sterk te signeren, hoef je geen digitaal certificaat te ondertekenen met gekochte code, je kunt een SNK-bestand genereren met de sn-tool van .NET, en je kunt de handtekening van je assembly garanderen door dit bestand op te slaan.
Een sterke handtekening voor een assembly is echter niet hetzelfde als een digitale handtekening voor een uitvoerbaar bestand (zelfs als de assembly een exe-bestand is). En MSDN zegt duidelijk dat exe-bestanden niet sterk ondertekend moeten worden (hoewel ik dat wel deed). Een digitale handtekening voor een bestand is eigenlijk het koppelen van een handtekening aan elk bestand op bestandssysteemniveau, waarmee het besturingssysteem wordt aangegeven wie de uitgever van dit bestand is. In het eigenschappenmenu van het bestand zie je het tabblad "Digitale Handtekeningen".
We ondertekenen de dll sterk en roepen deze vervolgens aan met een programma dat normaal kan worden uitgevoerd, als volgt:
Wat als we de dll vervangen door een gesmede dll? Test het en ontdek dat de uitvoering fout is, wat effectief kan voorkomen dat de aanroepende dll wordt vervalst (Ik heb het getest, de ondertekende dll-code aangepast en daarna opnieuw gegenereerd, en de applicatie kan ook normaal worden aangeroepen, zolang het programma correct is ondertekend!!)
De fout is als volgt:
Voor meer informatie over het aanroepen van real-time (JIT) debugging in plaats van deze dialoog, Zie het einde van dit bericht.
Ongebruikelijke tekst **************
System.IO.FileLoadException: 未能加载文件或程序集“dllFrom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eb67821f2cf76b4e”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040) Bestandsnaam: "dllFrom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eb67821f2cf76b4e" In TestDll.Form1.button1_Click_1 (Objectafzender, EventArgs e) In System.Windows.Forms.Control.OnClick(EventArgs e) In System.Windows.Forms.Button.OnClick(EventArgs e) In System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) Op System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons-knop, Int32 klikt) In System.Windows.Forms.Control.WndProc(Message& m) In System.Windows.Forms.ButtonBase.WndProc(Message& m) In System.Windows.Forms.Button.WndProc(Message& m) In System.Windows.Forms.Control.NativeWindow.OnMessage(Message& m) In System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) In System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Waarschuwing: Assembly binding logging is uitgeschakeld. Om assembly binding failure logging in te schakelen, stel je de registerwaarde in [HKLM\Software\Microsoft\Fusion!] EnableLog (DWORD) staat op 1. Opmerking: Er zullen prestatiebeperkingen zijn verbonden aan assembly binding foutregistratie. Om deze functie uit te schakelen, verwijder je de registerwaarde [HKLM\Software\Microsoft\Fusion!] EnableLog]。
Geladen assemblages ************** mscorlib Assemblyversie: 4.0.0.0 Win32-versie: 4.7.2098.0 gebouwd door: NET47REL1LAST Basiscode: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll ---------------------------------------- TestDll Assemblageversie: 1.0.0.0 Win32-versie: 1.0.0.0 Basiscode: file:///C:/Users/itsvse_pc/Desktop/dllForm/TestDll/bin/Debug/TestDll.exe ---------------------------------------- System.Windows.Forms Assemblyversie: 4.0.0.0 Win32-versie: 4.7.2094.0 gebouwd door: NET47REL1LAST Basiscode: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll ---------------------------------------- Systeem Assemblyversie: 4.0.0.0 Win32-versie: 4.7.2093.0 gebouwd door: NET47REL1LAST Basiscode: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll ---------------------------------------- Systeem. Tekening Assemblyversie: 4.0.0.0 Win32-versie: 4.7.2046.0 gebouwd door: NET47REL1 Basiscode: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll ---------------------------------------- Systeem. Configuratie Assemblyversie: 4.0.0.0 Win32-versie: 4.7.2046.0 gebouwd door: NET47REL1 Basiscode: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll ---------------------------------------- System.Core Assemblyversie: 4.0.0.0 Win32-versie: 4.7.2098.0 gebouwd door: NET47REL1LAST Basiscode: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll ---------------------------------------- System.Xml Assemblyversie: 4.0.0.0 Win32-versie: 4.7.2046.0 gebouwd door: NET47REL1 Basiscode: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll ---------------------------------------- System.Windows.Forms.resources Assemblyversie: 4.0.0.0 Win32-versie: 4.7.2046.0 gebouwd door: NET47REL1 Basiscode: 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.resources Assemblyversie: 4.0.0.0 Win32-versie: 4.7.2046.0 gebouwd door: NET47REL1 Basiscode: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/mscorlib.resources.dll ----------------------------------------
JIT Debugging ************** Om real-time (JIT) debugging mogelijk te maken, Het moet worden ingesteld in het system.windows.forms-gedeelte van het .config-bestand (machine.config) van de applicatie of computer jitDebugging-waarde. Het moet ook ingeschakeld zijn bij het compileren van de applicatie Debugging.
Bijvoorbeeld:
<configuration> <system.windows.forms jitDebugging="true" /> </configuration>
Eventuele niet-behandelde uitzonderingen na JIT-debugging zijn ingeschakeld wordt verzonden naar de JIT-debugger die op deze machine is geregistreerd, In plaats van dat deze dialoog het doet.
|