前些日子玩了一玩飞信2008,有一天心情不错,静下心来好好分析了一下这个软件。发现它是.NET程序,而且EXE也未加混淆(大公司就是牛),先是通过reflector简单看了看,代码太多,看得一头雾水,也没学到什么;好奇心又让我很想了解他的编程技术,于是动了工程级反编译,VS中重编译,动态调试运行的念头,经过了半天的努力,总算马马虎虎地可以调试运行了,呵呵,没有比这学习更爽的了!
以下是我在VS中整理的笔记:
(目标:飞信2008 PC体验版 工具:VS2005+
Xenocode 2007+自已写的工具)
Xenocode反编译及代码整理记录

1
、Xenocode中设置输出数字为十进制
2
、输出后中文文本为
\
uXXXX
,
可采用编码工具转成中文
3
、new
()
改成null
;
4
、反编译后代码中嵌套数组new int[
101
][grayPixel[w
,
h]]
++;
改成
int[] Totaldark
=
new int[
101
]
;
Totaldark[grayPixel[w
,
h]]
++;

5
、形如“
+=
delegate
(
”的转换
如: this
.
shapeButton
.
DropDownClosed
+=
delegate
(
object sender
,
EventArgs e
)
{this
.
shapeButton
.
DropDownItems
.
Clear
();
}
;
反编译成 this
.
shapeButton
.
DropDownClosed
+=
new System
.
EventHandler
(
this
.<
InitializeComponent
>
b__2
);
变成了用
+=
new System
.
EventHandler,标志
<
InitializeComponent
>
为包含代码的函数
标志__CachedAnonymousMethodDelegate XXXX
=
new EventHandler XX
代码整理方法:
将
>
b__替换成_b__
,
去掉
<,
即
this
.
shapeButton
.
DropDownClosed
+=
new System
.
EventHandler
(
this
.
InitializeComponent_b__2
);

6
、自定义类的转换,标志c__DisplayClass
//
__locals
如: WaitCursorChanger wcc
=
new WaitCursorChanger
(
this
);
using
(
ChooseToolDefaultsDialog dialog
=
new ChooseToolDefaultsDialog
())
{
EventHandler shownDelegate
=
null
;
shownDelegate
=
delegate
(
object sender2
,
EventArgs e2
)
{
wcc
.
Dispose
();
wcc
=
null
;
dialog
.
Shown -
=
shownDelegate
;
}
;
反编译成:
PdnToolBar
.<>
c__DisplayClass4
<>
8__locals5
=
new PdnToolBar
.<>
c__DisplayClass4
();
<>
8__locals5
.
dialog
=
new ChooseToolDefaultsDialog
();
try
{
PdnToolBar
.<>
c__DisplayClass6
<>
8__locals7
=
new PdnToolBar
.<>
c__DisplayClass6
();
<>
8__locals7
.<>
8__locals5
=
<>
8__locals5
;
<>
8__locals7
.<>
8__locals3
=
<>
8__locals3
;
<>
8__locals7
.
shownDelegate
=
null
;
<>
8__locals7
.
shownDelegate
=
new EventHandler
(<>
8__locals7
.<
ToolChooserStrip_ChooseDefaultsClicked
>
b__1
);
<>
8__locals5
.
dialog
.
Shown
+=
<>
8__locals7
.
shownDelegate
;
<>
8__locals5
.
dialog
.
SetToolBarSettings
(
this
.
appWorkspace
.
GlobalToolTypeChoice
,
this
.
appWorkspace
.
AppEnvironment
);
代码整理方法:
将4__this替换成4__this
,
类中有实例

7
、变量定义,反编译后有时会连一块
private bool AutoReconnectEventAttached
;
变成了 private AutoReconnectEventAttached
;
8
、反编译后出现(
0
)e
.
aaa 改成 e
.
aaaa
区别Function
(
0
)

9
、EventHandler
<
0
>,
改成EventHandler,此事件一般都有变化
(
EventHandler
)
this
.
EndDownload
,
改成this
.
EndDownload

10
、反编译后出现
()
value
;
改为value,此时变量定义有问题
,
Bool or int

11
、反编译后出
(
T
)
this
.
_personalgroup
.
GroupInfo
.
Portrait
;
改成this
.
_personalgroup
.
GroupInfo
.
Portrait 类型转换
反编译后出
(
TKey
)
this
.
_personalgroup
.
GroupInfo
.
Portrait
;
改成this
.
_personalgroup
.
GroupInfo
.
Portrait 类型转换

12
、将反统标识去掉,
//
[CompilerGenerated]

13
、反编译后enum属性付值时,会只给数字。如enum{first
,
second}会为成0,
1
。 可重新改成相应的属性值

14
、Decimal
.
op_Modulus操作符找不到,改成%

15
、反编译后出现两次类实例,如PsPrivacyControl
.
PsPrivacyControl
.
改成PsPrivacyControl
.

16
、有代码Ref必须转为out才能编译通过
以上纯属个人经验,个人觉得可以作为.NET爱好者的一种学习成功代码的手段,相关经验同样可用于分析其它较大型.NET代码。
本文只作技术交流用,请阅读者不要用于商业活动或破坏活动,否则后果自负。
附:
重新编译通过的YBFetion.exe (未添加任何功能代码)