代码之家  ›  专栏  ›  技术社区  ›  Victor Hurdugaci

EXE文件中的方法调用在哪里?

  •  3
  • Victor Hurdugaci  · 技术社区  · 16 年前

    介绍

    在观看了LIDNUG关于.NET代码保护的视频之后 http://secureteam.net/lidnug_recording/Untitled.swf

    “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\u 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\u Load方法的RVA: 00002083

    在这之后,我转到地址转换器(同样在CFF浏览器中)并导航到偏移量 . 我们有:

    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. 为什么文件中的那个位置没有方法调用?或者视频中缺少一些信息。。。
    1 回复  |  直到 16 年前
        1
  •  2
  •   Hans Passant    16 年前

    当我使用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
    

    推荐文章