2011-09-10 6 views
12

조립품을 조립할 때 ildasm이 조립품을 분해하는 것이 정상입니까?ILDasm을 사용하여 NGen 조립품을 분해 할 수 있습니까?

확인. HelloWorld 클래스 라이브러리를 작성했고 그 다음 dll의 이름은 NGenILDasmTest.dll입니다. - 대 2010 명령 프롬프트에서 닷넷 FW 4.

대상>, 나는 내가 GAC에 설치된 어셈블리를 볼 수

gacutil -i NGenILDasmTest.dll 

했다. 그리고 일리노이를 볼 수 있도록 ildasm을 실행했습니다. 지금까지 너무 좋아.

은 그 때 나는
ngen NGenILDasmTest.dll 

(나는 NGEN에 대한 옵션을 지정하지 않았습니다)

를 실행합니다. 그리고이 어셈블리는 성공적으로 컴파일되었습니다. 나는 내가 NGEN 에드 어셈블리의 내용을 볼 수
ildasm "C:\Windows\Assembly\NativeImages_v4.0.30319_32\NGenILDasmTest\81d49dd4c7df22fb3df530402b58ffc9\NGenILDasmTest.ni.dll" 

아래처럼 ILDASM 실행할 때 나는, 이제 폴더

C:\Windows\Assembly\NativeImages_v4.0.30319_32\NGenILDasmTest\81d49dd4c7df22fb3df530402b58ffc9 

에서 이름 NGenILDasmTest.ni.dll와 함께 위치. 이게 정상입니까?

기술적 인면에서 Ngen은 IL에 대한 네이티브 CPU instrcutions을 생성합니다 (내 케이스에서는 C : \ windows \ Assembly \ NAtiveImages_V4. ##### _ 32). 그렇다면 ILDasm을 사용하여 NGen-ed 어셈블리를 IL로 어떻게 볼 수 있습니까?

내가 여기에 실종되었다는 '약간의 문제'를 이해하도록 도와주세요.

답변

14

NGEN 어셈블리는 IL 플러스 네이티브 코드입니다. IL은 제거되지 않습니다. NGen 어셈블리에는 기본 이미지 인 만 포함되는 경우가 종종 있습니다. 원래 정보는 메타 데이터에 여전히 필요합니다.

Microsoft는 NGen 어셈블리의 내부에 대한 구체적인 정보가없는 것 같습니다. 우리가 알고있는 대부분의 정보는 역 엔지니어링입니다.

편집는 :

은 .NET Framework 1.1 (야호를 ..) 설치 한 후 - 그 .NET 1.1 NGEN 는 IL에서 스트립을 수행 나타납니다. 그것은 v2에서 시작하는 것처럼 보입니다 - 일리노이가 유지됩니다. 이것은 모순되는 정보가있는 이유입니다.이 변경이 이루어진 정확한 이유는 알려지지 않은 것 같습니다.

NGEN의 내부의 일부에 대한 좋은 기사가있다 (그리고 난독에 대한 매우 나쁜 생각하는 방법) 여기 : http://www.woodmann.com/forum/entry.php?68-Rebuilding-native-.NET-exes-into-managed-.NET-exes-by-Exploiting-lefotver-IL ... 이제

, NGEN에 대한 흥미로운 점은 없다는 것입니다 IL 코드가 실행에 필요하지 않은 동안 은 IL 또는 메타 데이터를 제거하기 때문에 메타 데이터는 프로그램에 필요한 모든 문자열과 기타 관련 데이터가 메타 데이터에 포함되어 있기 때문에 발생합니다. 그래서 Ngen은 메타 데이터를 모두에 복사합니다.IL 섹션을 작성하고 추가로 IL 코드를 복사하십시오.

+0

+1, 이것이 정확 해 보입니다. –

+0

@vcsjones 동의합니다! 귀하의 대답에있는 그 링크는 그것을 모두 설명합니다. 진정한 리버스 엔지니어링. 한편 NGenILDasmTest.dll에 의해/release 및/debug 모드에서 모두 separetely 빌드를 시도했습니다. 그건 전혀 차이가없는 것처럼 보입니다. 한 가지 더 관찰 된 원래 어셈블리 NGenILDasmTest.dll 탐색기에서 크기를 5KB, Ngen-ed 어셈블리 어셈블리 NGenILDasmTest.ni.dll 10KB입니다. 두 번째 생각이 없다면, 그것은 "NGEN 어셈블리는 IL과 네이티브 코드"라고 믿게됩니다. – gmaran23

4

빠르고 쉬운 난독 화를 살펴 보려면 C++에서 혼합 모드 어셈블리를 작성하십시오.이 어셈블리는 자신의 어셈블리의 부트 로더가됩니다 레거시 .NET FW 4.0을 원시 코드로 COM을 통해로드하고 암호화 된 리소스 (RSA 사용)로 보관 된 관리되는 파트에서 선언 된 공용 인터페이스 (관리되는 어셈블리에 대해 생성 된 .tlb)를 사용하고 네이티브 C++ 코드를 암호화 한 다음 서명합니다 두 어셈블리. 그렇게하면 ILDASM이 어셈블리를 계속 디버깅하고 빌드 이벤트를 사용하여 빌드 할 수 없게됩니다 (빌드 이벤트 사용)

+0

Thx. 나는 그에게 총을 줘야 할 것 같아. – gmaran23

+0

샘플 프로젝트가 필요합니까? 원한다면 샘플을 드릴 수 있습니다. –

+0

@Artur, 샘플을 보는 데 관심이 있습니다 ... – gap