.net/c# 애플리케이션이 호출된 DLL이 위조로 대체되지 않도록 어떻게 보장하나요?
https://www.itsvse.com/thread-4173-1-1.html (출처: 건축가) 지난번에 DLL이 다른 사람이 위조하고 실행할 수 있다는 테스트를 했는데, 어떻게 막을 수 있을까요?
시그니처 소개:
어셈블리 서명(강력한 이름 서명이라고도 함)은 애플리케이션이나 컴포넌트에 고유한 식별 정보를 부여하여 다른 소프트웨어가 명시적으로 해당 애플리케이션이나 컴포넌트를 식별하고 참조할 수 있게 합니다. 강력한 이름은 어셈블리의 단순 텍스트 이름, 버전 번호, 지역 정보(제공된 경우), 그리고 공개/개인 키 쌍으로 구성됩니다.
예를 들어, 강력한 명명은 애플리케이션 작성자와 관리자가 공유 구성 요소에서 사용할 서비스 버전의 정확한 버전을 지정할 수 있게 합니다. 이로 인해 서로 다른 애플리케이션이 서로 다른 버전을 지정할 수 있으면서도 다른 애플리케이션에는 영향을 주지 않습니다. 또한 컴포넌트의 강력한 이름을 보안 증거로 사용하여 두 컴포넌트 간에 신뢰 관계를 생성할 수도 있습니다.
어셈블리에 강력하게 서명하려면 구매한 코드로 디지털 인증서에 서명할 필요가 없고, .NET에서 제공하는 SN 도구로 SNK 파일을 생성할 수 있으며, 이 파일을 저장해 어셈블리의 서명을 보장할 수 있습니다.
하지만 어셈블리에 대한 강력한 서명은 실행 파일에 대한 디지털 서명과 같지 않습니다(어셈블리가 exe 파일이더라도). 그리고 MSDN에는 exe 파일은 강하게 서명하지 말라고 명확히 되어 있습니다(저는 그렇게 했습니다). 파일에 대한 디지털 서명은 실제로 파일 시스템 수준에서 어떤 파일에 서명을 부착하여 운영체제에 누가 이 파일의 발행자인지 알려주는 것입니다. 파일의 속성 대화상자에서 "디지털 서명" 탭을 볼 수 있습니다.
우리는 dll에 강하게 서명한 후, 다음과 같이 정상적으로 실행할 수 있는 프로그램으로 이를 호출합니다:
만약 DLL을 위조된 DLL로 교체한다면? 테스트해보면 실행이 오류임을 확인해 보면, 호출 dll이 위조되는 것을 효과적으로 막을 수 있습니다 (테스트해보고, 서명된 dll 코드를 수정한 뒤 다시 생성했더니, 프로그램이 올바르게 서명되어 있다면 애플리케이션도 정상적으로 호출할 수 있습니다!!)
오차는 다음과 같습니다:
이 대화 대신 실시간(JIT) 디버깅을 호출하는 방법에 대해 더 알고 싶습니다. 이 메시지 끝을 참조하세요.
특이한 텍스트 **************
System.IO.FileLoadException: 未能加载文件或程序集“dllFrom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eb67821f2cf76b4e”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040) 파일명: "dllFrom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eb67821f2cf76b4e" TestDll.Form1.button1_Click_1에서 (객체 발신자, 이벤트 Args 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) At System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons 버튼, Int32 클릭) In System.Windows.Forms.Control.WndProc(Message& m) In System.Windows.Forms.ButtonBase.WndProc(Message& m) In System.Windows.Forms.Button.WndProc(Message& m) System.Windows.Forms.Control.ControlNativeWindow.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)
경고: 어셈블리 바인딩 로깅이 꺼져 있습니다. 어셈블리 바인딩 실패 기록을 활성화하려면 레지스트리 값 [HKLM\Software\Microsoft\Fusion!"을 설정하세요. EnableLog(DWORD)는 1로 설정되어 있습니다. 참고: 어셈블리 바인딩 실패 로그와 관련된 성능 저하가 발생할 수 있습니다. 이 기능을 끄려면 레지스트리 값 [HKLM\Software\Microsoft\Fusion!]을 제거하세요. EnableLog]
부하 조립체 ************** MSCORLIB 어셈블리 버전: 4.0.0.0 Win32 버전: 4.7.2098.0 제작자: NET47REL1LAST 기본 코드: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll ---------------------------------------- TestDll 어셈블리 버전: 1.0.0.0 Win32 버전: 1.0.0.0 기본 코드: file:///C:/Users/itsvse_pc/Desktop/dllForm/TestDll/bin/Debug/TestDll.exe ---------------------------------------- System.Windows.Forms 어셈블리 버전: 4.0.0.0 Win32 버전: 4.7.2094.0 제작자: NET47REL1LAST 기본 코드: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll ---------------------------------------- 시스템 어셈블리 버전: 4.0.0.0 Win32 버전: 4.7.2093.0 제작자: NET47REL1LAST 기본 코드: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll ---------------------------------------- 시스템.드로잉 어셈블리 버전: 4.0.0.0 Win32 버전: 4.7.2046.0 제작자: NET47REL1 기본 코드: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll ---------------------------------------- 시스템.구성 어셈블리 버전: 4.0.0.0 Win32 버전: 4.7.2046.0 제작자: NET47REL1 기본 코드: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll ---------------------------------------- 시스템.코어 어셈블리 버전: 4.0.0.0 Win32 버전: 4.7.2098.0 제작자: NET47REL1LAST 기본 코드: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll ---------------------------------------- System.Xml 어셈블리 버전: 4.0.0.0 Win32 버전: 4.7.2046.0 제작자: NET47REL1 기본 코드: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll ---------------------------------------- System.Windows.Forms.resources. 어셈블리 버전: 4.0.0.0 Win32 버전: 4.7.2046.0 제작자: NET47REL1 기본 코드: 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 어셈블리 버전: 4.0.0.0 Win32 버전: 4.7.2046.0 제작자: NET47REL1 기본 코드: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/mscorlib.resources.dll ----------------------------------------
JIT 디버깅 ************** 실시간(JIT) 디버깅을 가능하게 하려면, 애플리케이션이나 컴퓨터의 .config 파일(machine.config)의 system.windows.forms 섹션에서 설정해야 합니다 jitDebugging 값입니다. 애플리케이션을 컴파일 시에도 활성화해야 합니다 디버깅.
예를 들어:
<configuration> <system.windows.forms jitDebugging="true" /> </configuration>
JIT 디버깅 후 처리되지 않은 예외가 활성화됩니다 이 머신에 등록된 JIT 디버거로 전송될 것입니다. 이 대화로 처리되는 대신에.
|