Где находится вызов метода в файле EXE? - PullRequest
3 голосов
/ 28 мая 2010

Введение

После просмотра этого видео из 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 (как в видео) и получаю RVA метода Form1_Load: 00002083.

После этого я захожу в Address Converter (снова в CFF Explorer) и перехожу на смещение 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 нулей?

1 Ответ

2 голосов
/ 28 мая 2010

Когда я использую Ildasm.exe и смотрю на IL с включенным Show Bytes, я вижу это:

.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 в вашем дампе начинается со смещения 1, а не 12. Не уверен, почему он выключен.

...