2016-11-09 2 views
3

.net DLL을 환경에로드해야하는 플러그인 시스템을 작성 중입니다. 그들이 포인터 사용 또는 "안전하지 않은"키워드의 다른 사용법을 포함하고 있는지 여부를 알아야합니다. 어셈블리, 모든 메서드, 모든 외부 참조 및 DLL의 모든 CIL 명령에있는 모든 형식을 조회 할 수 있도록 좋은 리플렉션 브라우저를 실행했습니다. 내 지식에 그러나 안전하지 않은 키워드는 DLL을 컴파일 할 수 있는지 여부를 결정하는 데 사용 된 후에 유지되지 않습니다.로드중인 .NET 어셈블리에 안전하지 않은 코드가 있음을 어떻게 발견합니까?

안전하지 않은 태그가있는 메타 데이터가 메타 데이터에 있습니까? 안전하지 않은 특정 CIL 지침이 있습니까? 임의의 DLL에 안전하지 않은 코드가 있는지 확인하는 다른 방법이 있습니까?

물론 안전하지 않은 코드가 유일한 보안 문제는 아니지만 지금 당장 다루려고하는 것입니다.

+1

안전하지 않은 것은 C# 기능이 아니라 .net 하나 –

+0

아, 안타까운 일입니다. C#에서 사용되는 프로그래밍 기능을 감지 할 수있는 방법이 있는지 알고 계십니까? –

+0

내가 아는 그. 당신의 최종 게임은 무엇입니까? –

답변

1

안전하지 않은 코드를 탐지하기 위해이 경험적 방법을 사용합니다. 객체가 고정되어 주소를 가져 오는 고정 블록을 확인하십시오.

이렇게하려면 어셈블리의 메서드를 반영하고 LocalVariableInfos를 가져옵니다. IsPinned 속성 중 하나라도 true이면 메서드가 안전하지 않습니다.

이 작업을 수행하여 놓칠 수있는 안전하지 않은 작업은 고정을 요구하지 않으므로 stackalloc뿐입니다. 스택에 공간을 할당하는 데 사용되는 Localloc opcode가 있는지 메소드 본문을 검사하여이를 파악할 수 있습니다.

로컬 변수에 대한 포인터를 통해 스택에서 값 유형을 조작하는 것은 이러한 점검과 안전하지 않은 유일한 방법입니다. 불행히도 지역 변수의 주소를 가져 오는 것은 많은 일반 작업에 사용되는 일반적인 컴파일러 작업이므로 필터링 할 수 없습니다.

C# 이외의 컴파일러는 정상적인 컴파일 방법의 일부로 자유롭게 사용할 수 있지만 C#의 경우이 방법이 완벽하게 작동해야합니다.

+1

굉장합니다, 고마워요! 나는이 두 가지 경우를 모두 감지하고있다. 이 메소드가 누락 된 경우가 있습니다 ... public unsafe int UnsafeMethod2 (int input) { int * thePointer = (int *) 입력; * thePointer = 42; return * thePointer; } 이 함수는 컴파일하기에 안전하지 않아야하지만 고정 할 필요는 없습니다 (분명히 나쁘다). 나는 단지 "*"가 붙은 모든 타입이 금지되어 있다고 말할 것입니다,하지만 저는 당신이이 사건에 관심이 있고 다른 생각들을 가질 수 있다고 생각했습니다. –

+1

남자, 그 형식을 코드를 얻을 수 없습니다 ... –

+0

@JesseJoudrey - 값 형식 인수 및 로컬 변수의 주소를 취하는 것이 C# 컴파일러가 가끔씩 수행 할 것이라고 생각합니다. 나는 그것을보고 기억하지만 어디 있는지 모르겠습니다. – hoodaticus