Где находится вызов метода в файле EXE?
Вопрос
Введение
После просмотра этого видео от Lidnug, о .NET Code Protection http://secuream.net/lidnug_recording/unditled.swf. (Особенно от 46:30 до 57:30), я бы нашел звонок на сообщение Message.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/39250303054/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 из этого метода (по методике) !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
.
После этого я хожу в адрес 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
Вопросы:
- Что я делаю неправильно?
- Почему в файле нет звонка метода в этом положении? Или, может быть, видео отсутствует некоторая информация ...
- Почему парень в этом видео заменяет звонок с 9 нулями?
Решение
Когда я использую ILDasm.exe и посмотрите на 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
Значения токена в вашем сварении не одинаковы, у вас есть гораздо большая программа. Но иль в вашем сфере начинается на смещении 1, а не 12. Не уверен, почему он выключен.