2009-04-30 4 views

답변

20

짧은 대답은 명백한 것 이상으로 할 수있는 일이 많지 않다는 것입니다.

당신이 고려하는 것이 좋습니다 명백한 일 (약 어려움이 증가하고 타당성을 감소의 순서)는 다음과 같습니다 : 공격 할 DLL이없는

  • 정적 링크 있도록.
  • 모든 기호를 제거하십시오.
  • .DEF 파일과 가져 오기 라이브러리를 사용하여 내보내기 ID로만 익명 내보내기를 알 수 있습니다.
  • DLL을 리소스에 보관하고 실행 중에 만 파일 시스템에 표시합니다 (적절하지 않은 이름으로, 심지어 런타임에 생성 될 수도 있음).
  • 실제 메소드에 대한 함수 포인터 테이블에 대해 비밀 키 (더 나은 지식, 비밀 지식 증명)를 교환하는 팩토리 메소드 뒤에 숨겨진 모든 실제 함수를 숨 깁니다.
  • 리버스 엔지니어링을 방지하기 위해 맬웨어 세계에서 빌린 안티 디버깅 기술을 사용하십시오. (AV 도구로 인해 오탐 (false positive)이 발생할 가능성이 높습니다.

관계없이 충분히 결정된 사용자는 여전히 사용 방법을 알아낼 수 있습니다. 괜찮은 디스어셈블러는 필요한 모든 정보를 신속하게 제공합니다.

DLL이 실제로 COM 개체이거나 악성 프로그램 인 경우에는 의도 한 용도를 벗어나지 않고 제거 할 수없는 많은 양의 런타임 형식 정보가 있습니다.

EDIT : C# 및 .NET이 C로 작성된 순수 Win32 DLL이 아닌 환경임을 암시하기 위해 다시 태그를 지정 했으므로 위의 내용을 "You can not, but .."로 수정해야합니다. "

컴파일 소스의 제공이 필수적이지만 유용한 소스를 제공하고 싶지 않은 환경을 다루기 위해서는 오랫동안 난독 화 도구에 대한 시장이있었습니다. 해당 시장에서 재생되는 C# 제품이 있으며 적어도 하나 이상이 끼어 든 것처럼 보입니다.

어셈블리를로드하려면 프레임 워크에서 많은 노력이 필요하기 때문에 몇 가지 컨트롤을 사용하는 권한 비트가있을 수 있습니다. 정직한 공급자 및 어셈블리 소비자. 나는이 방법들이 제공하는 진정한 보안에 대한 논의를 보지 못했으며, 그들이 결정적인 공격에 얼마나 효과적으로 대처하고 있는지 간단히 알지 못한다.

많은 유스 케이스가 당신의 유스 케이스에 달려 있습니다. 일상적인 사용을 막으려 고한다면, 아마도 당신에게 적합한 솔루션을 찾을 수있을 것입니다. 리버스 엔지니어링과 재사용으로부터 귀중한 영업 비밀을 보호하려는 경우 매우 행복하지 않을 수 있습니다.

3

당신은 당신의 실행 파일을 포함하고, 런타임에 추출을 LoadLibrary 및 그것으로 호출 할 수 있습니다. 또는 어떤 종류의 공유 ​​키를 사용하여 첨부 파일을 암호화/해독하고 위와 동일하게 수행 할 수 있습니다.

나는 정말로 공유하고 싶지 않다면 그것을 컴파일하는 것과 같은 솔루션을 이미 고려했다고 가정하고 있습니다. 누군가가 정말로 그것에 도달하기를 원한다면, 그것을 할 수있는 많은 방법이 있습니다.

+0

.NET exe 파일도 어셈블리이므로 참조 할 수 있습니다. –

+0

이 해결책은 무엇입니까? – Josh

+0

불행히도, 우회하는 아주 쉬운 해결책이다. 일단 어셈블리를로드하면 어셈블리를 메모리에서 덤프하는 것은 매우 쉽습니다. 따라서 누구나 "암호화 된"어셈블리를 사용할 수 있습니다. –

5

StrongNameIdentityPermissionAttribute을 살펴보십시오. 어셈블리에 대한 액세스를 선언 할 수 있습니다. 좋은 코드 보호 도구 (예 : CodeVeil (면책 조항 CodeVeil을 판매 함))와 결합하면 매우 만족할 것입니다.

12

DRM 지지자와 동일한 문제가 있습니다. 당신의 프로그램 (당신이 DLL을 실행할 수 있도록하고자하는) 일부 사용자 계정으로 실행 가능한 경우

, 다음 을 분리에서 해당 사용자로 로그인 할 수 충분히 판단 프로그래머를 중지 할 수 있습니다 아무것도 없다 암호 해독을 수행하고이를 사용하여 DLL을 암호 해독하고 실행하는 코드.

물론이 리버스 엔지니어링을 수행하는 것이 불편할 수 있으며, 충분할 수도 있습니다.

+2

+1은 허용되지 않으므로 +1합니다. – RBerteig

1

그럼 당신은 "내부"또는 "내부 보호"와 같은 "공공"의 모든 클래스를 표시 할 수있는 당신에게 [어셈블리 어셈블리를 표시합니다 : InternalsVisibleTo ("")] 특성 및 표시된 어셈블리를 제외한 모든 사용자가 내용을 볼 수 있습니다.

+0

Reflection은 개인 유형/멤버까지도 사용할 수 있습니다. –

+0

당신은 InternalsVisibleTo 애트리뷰트를 적용하더라도 Reflector.Net이 여전히 코드를 노출 할 수 있다는 것을 의미합니까? – Jon

+0

예. 누군가는 디스어셈블러를 사용하여 InternalsVisibleTo 속성의 내용을보고 같은 이름의 어셈블리를 만들어 액세스 할 수 있습니다. –

1

. 닷넷 리액터를 사용해 보셨습니까? 나는 최근에 그것을 보았다. 어떤 사람들은 위대하다고 말하지만 나는 아직도 그것을 테스트하고 있습니다.

관련 문제