2010-05-28 3 views
3

소개EXE 파일의 메서드 호출은 어디에 있습니까?

(특히 46:30부터 57:30까지) .NET 코드 보호 http://secureteam.net/lidnug_recording/Untitled.swf에 대해, LIDNUG에서이 비디오를 시청 후, 나는 EXE에서 MessageBox.Show에 전화를 찾을 것 내가 만들었다.

내 "TrialApp.exe"의 유일한 논리는 다음과 같습니다

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     MessageBox.Show("This is trial app"); 
    } 
} 

가 릴리스 구성에 컴파일 : http://rapidshare.com/files/392503054/TrialApp.exe.html

나는 전화

실행을 찾기 위해 무엇을 WinDBG의 응용 프로그램을 열고 메시지 상자가 나타나면 중단하십시오.

!clrstack와 CLR 스택하세요 :

0040e840 5e21350b [InlinedCallFrame: 0040e840] System.Windows.Forms.SafeNativeMethods.MessageBox(System.Runtime.InteropServices.HandleRef, System.String, System.String, Int32) 
0040e894 5e21350b System.Windows.Forms.MessageBox.ShowCore(System.Windows.Forms.IWin32Window, System.String, System.String, System.Windows.Forms.MessageBoxButtons, System.Windows.Forms.MessageBoxIcon, System.Windows.Forms.MessageBoxDefaultButton, System.Windows.Forms.MessageBoxOptions, Boolean) 
0040e898 002701f0 [InlinedCallFrame: 0040e898] 
0040e934 002701f0 TrialApp.Form1.Form1_Load(System.Object, System.EventArgs) 

를 MethodDesc 구조 (를 Form1_Load의 주소를 사용하여) !ip2md 002701f0

MethodDesc: 001762f8 
Method Name: TrialApp.Form1.Form1_Load(System.Object, System.EventArgs) 
Class:  00171678 
MethodTable: 00176354 
mdToken:  06000005 
Module:  00172e9c 
IsJitted:  yes 
CodeAddr:  002701d0 
Transparency: Critical 
Source file: D:\temp\TrialApp\TrialApp\Form1.cs @ 22 

(MethodDesc 의해)이 방법의 IL 덤프 !dumpil 001762f8

얻기
IL_0000: ldstr "This is trial app" 
IL_0005: call System.Windows.Forms.MessageBox::Show 
IL_000a: pop 
IL_000b: ret 

그래서 비디오에 언급 된대로 Show에 대한 호출은 메소드 구현의 시작부터 5 바이트입니다.

이제 CFFExplorer를 열고 (비디오 에서처럼) Form1_Load 메서드의 RVA를 얻습니다 : 00002083.

이 후 주소 변환기 (다시 CFF 탐색기)로 이동하여 오프셋 00002083으로 이동합니다. 거기에서 우리는이 : 비디오에서

32 72 01 00 00 70 28 16 00 00 0A 26 2A 7A 03 2C 
13 02 7B 02 00 00 04 2C 0B 02 7B 02 00 00 04 6F 
17 00 00 0A 02 03 28 18 00 00 0A 2A 00 03 30 04 
00 67 00 00 00 00 00 00 00 02 28 19 00 00 0A 02 

를위한 오피해야한다 그래서 구현의 처음부터 그들에게

        2A 7A 03 2C 
13 02 7B 02 00 00 04 2C 0B 02 7B 02 00 00 04 6F 
17 00 00 0A 02 03 28 18 00 00 0A 2A 00 03 30 04 
00 67 00 00 00 00 00 00 00 02 28 19 00 00 0A 02 

5 바이트를 건너 처음 12 바이트 방법 헤더에 대한 것을 언급 메서드 호출 (28). 불행히도, 거기 있지 않습니다.

02 7B 02 00 00 04 2C 0B 02 7B 02 00 00 04 6F 
17 00 00 0A 02 03 28 18 00 00 0A 2A 00 03 30 04 
00 67 00 00 00 00 00 00 00 02 28 19 00 00 0A 02 

질문 : 내가 잘못 뭐하는 거지

  1. ?
  2. 파일의 해당 위치에서 메서드 호출이없는 이유는 무엇입니까? 또는 비디오에 일부 정보가 누락되었을 수 있습니다 ...
  3. 왜 비디오의 녀석이 통화를 9 개의 0으로 대체합니까?

답변

2

Ildasm을 사용할 때.당신이 훨씬 더 큰 프로그램을 갖고있는 것 같다, 덤프에서

.method private hidebysig instance void Form1_Load(object sender, 
                class [mscorlib]System.EventArgs e) cil managed 
// SIG: 20 02 01 1C 12 15 
{ 
    // Method begins at RVA 0x20f1 
    // Code size  12 (0xc) 
    .maxstack 8 
    IL_0000: /* 72 | (70)00000D  */ ldstr  "This is trial app" 
    IL_0005: /* 28 | (0A)00001E  */ call  valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string) 
    IL_000a: /* 26 |     */ pop 
    IL_000b: /* 2A |     */ ret 
} // end of method Form1::Form1_Load 

토큰 값이 동일하지 않습니다 :이 페이지의 EXE 및 표시 바이트와 IL 볼이 돌았 다. 하지만 덤프에있는 IL은 12가 아닌 오프셋 1에서 시작합니다. 왜 꺼져 있는지 모르겠습니다.

+0

안녕하세요! 귀하의 답변에 감사드립니다. 컴파일러로 코드를 컴파일하셨습니까? 네가 다른 RVA를 가지고 있기 때문에. 문제는 VS2010 (대상 플랫폼은 .NET 4.0)에서 컴파일러를 사용했기 때문에 발생했을 수 있습니까? –

+0

물론 CLR 버전 4에서 내부 구조가 완전히 변경되었을 수도 있습니다. 문서화되지 않은 CLR 데이터 구조를 해킹하고 있다면 무엇이든 가능합니다. SSCLI 2.0 소스 코드 덕분에 무엇인가 알려진 유일한 이유가 있습니다. 이미 5 세 이상입니다. –

+0

발견 (전화)! 제가 제거한 12 바이트에있었습니다. (처음부터 6 바이트 : 28 16 00 00 0A). Hans Passant, 유용한 답변을 주셔서 대단히 감사합니다! –