简介
在观看LIDNUG的视频后,关于.NET代码保护http://secureteam.net/lidnug_recording/Untitled.swf(特别是从46:30到57:30),我想在我创建的EXE中找到对MessageBox.Show的调用。 / p>
我的“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
转储此方法的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中)并导航到偏移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
问题:
答案 0 :(得分:2)
当我使用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
转储中的令牌值不一样,您似乎有一个更大的程序。但转储中的IL从偏移量1开始,而不是12.不确定它为什么关闭。