2009-10-15 4 views
2

.net 실행 파일을 구문 분석하고 외부 메소드 호출 목록을 생성하는 비교적 작은 프로그램을 작성해야합니다. 예를 들어 System.Console.WriteLine이 파일 내에서 호출되면 도구는 System.Console.WriteLine이라는 어딘가에 인쇄해야합니다. 나는 (제한된 두뇌와 시간) 필요가 없으며 (필요한 모든 것은 호출 목록이다) 실제 분해를 구현할 수 없다. grep friendly perl friendly 호출 된 함수의 이름과 호출이 발생한 오프셋을 비교적 짧은 솔루션으로 작성합니다.부분적으로 .net 실행 파일을 분해합니다.

상황이 이미 시도 :

  1. 다운로드 스펙을 MSDN에서. 이제 정적 호출이 바이트 코드로 0x28으로 변환된다는 것을 알고 있습니다. :) 메소드 디스크립터가 뒤 따르지만 메소드 디스크립터가 의미하는 바를 이해하기 위해서는 전체 스펙을 읽는 것이 필요할 것이다.

  2. 리플 렉터에 간단한 exe를 열면. 리플렉터는 원래 응용 프로그램의 코드를 정확하게 재현했지만 호출에 대한 바이트 코드를 볼 수 없습니다.

제한된 시간과 지식으로 원하는 제한된 기능을 구현할 수 있습니까?

그렇다면 구현하려면 무엇을 알고 있습니까? "인형 용 CIL 어셈블리"가이드가 있습니까?

+2

반사경에서 메서드에 대해 "분석"을 수행하고로드 된 다른 어셈블리에서 사용되는 (호출되는) 위치를 확인할 수 있습니다. 다른 방향으로 가면 나는 잘 모르겠다. –

+0

고마워, 요원 .9191, 나는 그것을 놓쳤다. – Muxecoid

+0

Analyze는 실제 사용 된 바이트 코드를 보여주지 않습니다. 그것은 모든 사용 된 호출과 함께 종속성 목록을 보여 주지만 종속성 목록은 exe 파일의 시작이나 실제 호출을 담당하는 바이트 코드 단편과 관련된 호출 위치에 대해서는 아무 것도 말하지 않습니다. – Muxecoid

답변

2

grep/perl-friendly 인 것을 원하면 ildasm (명령 행 모드에서/out 또는/text와 함께 사용)을 사용하여 바이트 코드를 텍스트 IL로 디스 어셈블하십시오. 그런 다음 grep, perl 또는 선택한 언어를 사용하여 통화 지침을 찾을 수 있습니다. grep은 호출 명령어가있는 메소드를 식별하는 데는 충분하지 않지만 perl은 가능해야합니다.

+0

감사합니다. ildasm이 생성 한 CIL은 흥미로운 모든 호출을 찾아 식별하는 데 도움이됩니다. try-catch 블록을 쉽게 감지 할 수있는 방법이 있습니까? – Muxecoid

+0

try 블록은 .try {로 끝나고}로 시작하십시오. catch 블록은 catch [mscorlib] System.Exception (또는 예외가 무엇이든간에)로 시작한 다음 {, 끝}을 사용합니다. (가장 좋은 방법은 C#과 ildasm에 테스트 어셈블리를 작성하는 것입니다. 핸들러/레이블 폼에 대한 Jason의 의견도 참조하십시오.) 따라서 이러한 블록을 찾는 것은 너무 어렵지 않아야합니다. 그러나 Perl과 같은 라인 지향 프로세서를 사용하면 주어진 라인이 try-catch 블록의 일부인지 여부를 식별 할 수 있습니다. 대신 VirtualBlackFox 및 Jason에서 언급 한 Cecil 및 CCI 프로젝트를 조사 할 수 있습니다. – itowlson

4

Ceci 프로젝트는 원하는대로 정확하게 작업 할 수있는 라이브러리입니다.

1

공통 컴파일러 하부 구조가 도움이 될 수도 있습니다 : http://ccimetadata.codeplex.com/.

itowlson의 제안에 따라 어셈블리를 .il 파일로 분해 한 다음 grep을 사용하여 구문 분석하면 원하는 파일을 찾을 수 있습니다. ILDasm은 모든 유형에 대해 전체 네임 스페이스를 표시하므로 유형 또는 참조 된 유형이라면 빨리 찾아 낼 수 있어야합니다.

+0

커맨드 라인에 대해 언급하는 것을 잊어 버렸습니다. 다음과 같은 내용을 입력하면 grep 할 수있는 텍스트 파일이 제공됩니다. ildasm /out:.il –

+0

명령에/raweh를 사용하지 않으면 vs2008과 함께 제공되는 ildasm을 사용합니다. 줄, try/catch/finally는 .try/catch/finally 코드로 확장됩니다. /raweh를 사용하면 형성 과정에서 예외 처리 블록이 바이트 코드로 저장되는 것처럼 메서드의 끝에 있습니다. 레이블을 사용하여 코드에서 코드가 들어갈 위치로이를 판독해야합니다. –

관련 문제