3

序章

LIDNUG の .NET コード保護http://secureteam.net/lidnug_recording/Untitled.swf (特に 46:30 から 57:30 まで) に関するこのビデオを見た後、MessageBox.Show への呼び出しをEXE を作成しました。

私の「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 でアプリケーションを実行し、メッセージ ボックスが表示されたら中断します。

次を使用して CLR スタックを取得します!clrstack

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

このメソッドの IL をダンプします (MethodDesc による)!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

この後、Address Converter (再び CFF Explorer) に移動し、offset に移動し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

ビデオでは、最初の 12 バイトはメソッド ヘッダー用であると言及されているため、スキップします

                                    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 バイトは、メソッド呼び出しのオペコード (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 つのゼロに置き換えたのですか?
4

1 に答える 1

2

Ildasm.exe を使用し、Show Bytes をオンにして IL を見ると、次のように表示されます。

.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

ダンプ内のトークン値が同じではありません。プログラムがかなり大きいようです。しかし、ダンプ内の IL は 12 ではなくオフセット 1 から始まります。オフになっている理由がわかりません。

于 2010-05-28T15:08:41.887 に答える