介绍
在观看了来自 LIDNUG 的关于 .NET 代码保护的视频http://secureteam.net/lidnug_recording/Untitled.swf(尤其是从 46:30 到 57:30)之后,我会在我创建的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");
}
}
在 Release 配置上编译: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
因此,正如视频中提到的,对 to 的调用Show
是从方法实现开始的 5 个字节。
现在我打开 CFFExplorer(就像在视频中一样)并获取 Form1_Load 方法的 RVA 00002083
:。
在此之后,我转到地址转换器(再次在 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
问题:
- 我究竟做错了什么?
- 为什么文件中的那个位置没有方法调用?或者视频可能缺少一些信息......
- 为什么那个视频中的那个人用 9 个零代替了电话?