Component Port
The letter killeth, but the spirit giveth life.
随笔- 50 文章- 0 评论- 122
博客园
社区
首页
新随笔
管理
订阅
Dotfuscator中字符串混淆算法
代码混淆工具,像Dotfuscator、Xenocode Postbuild等,都有重要功能就是字符串混淆,说起来很轻巧很简单,那么它到底是什么呢,如何工作的呢?
本文以Dotfuscator 4.x为例,并制造一个简单的ConsoleApplication用来做小白鼠,以此窥探字符串混淆的一斑。一下是简单ConsoleApplication的代码:
1
using
System;
2
3
namespace
ConsoleApplication1
4
{
5
class
Program
6
{
7
static
void
Main(
string
[] args)
8
{
9
Console.WriteLine(
"
This is the unencrypted string.
"
);
10
}
11
}
12
}
编译,然后使用Dotfuscator混淆——我使用的Dotfuscator是4.x Pro,你需要在Option Tab里面设置Disable String Encryption为No,再Input Tab 设置输入为上面工程的编译结果,在String Encryption Tab里勾选所有的项或者添加type为*和method为*的两条规则,然后编译,完成后就可以在输出目录里找到已经混淆过了的ConsoleApplication1.exe了,使用Reflector打开,可以看到代码如下:
1
private
static
void
a(
string
[] A_0)
2
{
3
int
num
=
2
;
4
Console.WriteLine(a(
"
軙듛럝鏟싡跣闥죧黩蓫语탯蟱髳鏵雷駹軻蟽烿瘁愃戅⠇礉砋簍礏簑猓㠕
"
, num));
5
}
一串乱码,同时还可以看到这里增加了一个叫a的方法,那么这个a到底是什么呢?Reflector报告如下:
/**/
/*
private scope
*/
static
string
a(
string
A_0,
int
A_1)
{
//
This item is obfuscated and can not be translated.
显然这段代码使用Control Flow混淆过了,如此只能从IL下手了:
.method
privatescope
hidebysig
static
string
a(
string
A_0,
int32
A_1)
cil
managed
{
.maxstack
8
.locals
init
(
[
0
]
char
[] chArray,
[
1
]
int32
num,
[
2
]
int32
num2,
[
3
] uint8 num3,
[
4
] uint8 num4)
L_0000:
ldarg.0
L_0001:
callvirt
instance
char
[] [mscorlib]System.String::ToCharArray()
L_0006:
stloc.0
L_0007:
ldc.i4
0xe74d6d7
L_000c:
ldarg.1
L_000d:
add
L_000e:
stloc.1
L_000f:
ldc.i4.0
L_0010:
dup
L_0011:
ldc.i4.1
L_0012:
blt.s
L_0047
L_0014:
dup
L_0015:
stloc.2
L_0016:
ldloc.0
L_0017:
ldloc.2
L_0018:
ldloc.0
L_0019:
ldloc.2
L_001a:
ldelem.i2
L_001b:
dup
L_001c:
ldc.i4
0xff
L_0021:
and
L_0022:
ldloc.1
L_0023:
dup
L_0024:
ldc.i4.1
L_0025:
add
L_0026:
stloc.1
L_0027:
xor
L_0028:
conv.u1
L_0029:
stloc.3
L_002a:
dup
L_002b:
ldc.i4.8
L_002c:
shr
L_002d:
ldloc.1
L_002e:
dup
L_002f:
ldc.i4.1
L_0030:
add
L_0031:
stloc.1
L_0032:
xor
L_0033:
conv.u1
L_0034:
stloc.s
num4
L_0036:
pop
L_0037:
ldloc.s
num4
L_0039:
ldloc.3
L_003a:
stloc.s
num4
L_003c:
stloc.3
L_003d:
ldloc.s
num4
L_003f:
ldc.i4.8
L_0040:
shl
L_0041:
ldloc.3
L_0042:
or
L_0043:
conv.u2
L_0044:
stelem.i2
L_0045:
ldc.i4.1
L_0046:
add
L_0047:
dup
L_0048:
ldloc.0
L_0049:
ldlen
L_004a:
conv.i4
L_004b:
blt.s
L_0014
L_004d:
pop
L_004e:
ldloc.0
L_004f:
newobj
instance
void
[mscorlib]System.String::.ctor(
char
[])
L_0054:
call
string
[mscorlib]System.String::Intern(
string
)
L_0059:
ret
}
这里我不想过多解释IL,毕竟不是介绍MSIL,如果你有兴趣,可以查阅MSDN、相关书籍或者
Google
一下。
从IL代码来看,混淆逻辑使用了一个永远为true的条件(等效为if(0<1)),做了一次跳转,这才到真正的循环上,显然这里对string的每一个char进行遍历并处理,然后依次对char的高低位分别和参考量做异或运算,在交换高低位后做对高低位求或,其结果就是真实的字符串了。
总结整理了一下,算法如下:
1
static
string
GetString(
string
source, int salt)
2
{
3
int index =
0
;
4
char
[] data = source.ToCharArray();
5
salt +=
0xe74d6d7
;
//
This const data generated by dotfuscator
6
while (index < data.Length)
7
{
8
char
key = data[index];
9
byte low = (byte)((key &
'
\x00ff
'
) ^ salt++);
10
byte high = (byte)((key >>
8
) ^ salt++);
11
data[index] = (
char
)((low <<
8
| high));
12
index++;
13
}
14
return
string
.Intern(
new
string
(data));
15
}
由此可见,字符串混淆的代价是相当大的,对于商业应用来说,应该尽量避免,也就是说避免使用hard code字符串保存敏感信息。此外,显然以上字符串混淆只能阻碍静态逆向分析,因为在.NET所有的字符串对CLR Runtime Host都是透明的,如果hacker使用debugger或者类似ProcessExplorer之类的工具是很容易分析出字符串里的秘密的。
To be the apostrophe which changed “Impossible” into “I’m possible”
----------------------------------------------------
WinkingZhang's Blog (
http://winkingzhang.cnblogs.com
)
GCDN(
http://gcdn.grapecity.com/cs
)
标签:
.NET
,
Secrity
,
Obfuscator
,
String Encryption
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted @ 2008-02-14 20:40
winkingzhang
阅读(4155)
评论(7)
编辑
收藏
2230926
#1楼
qq表情[未注册用户]
在
2008-02-15 01:06
说:
不错很不错
回复
引用
#2楼
ocean
在
2008-02-15 01:47
说:
不错不错,确实没有混淆字符串的意义。如果字符串中有敏感信息,再怎么混淆也没用,如果没有敏感信息,那么就不如不混淆。
回复
引用
查看
#3楼
jillzhang
在
2008-02-15 09:35
说:
不错,本来还想尝试一下字符串混淆呢,现在看来要慎重下了
回复
引用
查看
#4楼
Wisdom-zh
在
2008-02-15 09:57
说:
只要能够逆向, 敏感信息就藏不住, 所以无意义
回复
引用
查看
#5楼
置身珠海,学习与奋斗
在
2008-02-18 15:29
说:
这只是混淆器的一个方面
回复
引用
查看
#6楼
资深IT民工[未注册用户]
在
2009-04-14 10:50
说:
微软 真是滴, 出个工具不得了,直接编译成 非托管代码不就了事了,
至少对于菜鸟级还是可以防止滴。不过对于高手级,不管怎么样都是防不住滴。
因为他们都用01写程序。哈哈已经是机器了。
回复
引用
#7楼
寒@鹏
在
2011-10-30 07:11
说:
好
回复
引用
查看
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
向Google学习打造灵动的web体验
·
《愤怒的小鸟》在列 Win8首批游戏图赏
·
NVIDIA 的邀请函能带来什么惊喜?
·
陪审团裁决“交互式Web”专利无效
·
未来iPhone将具备裸眼3D功能
»
更多新闻...
最新知识库文章
:
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
·
前端必读:浏览器内部工作原理
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
本站内容除特别声明,全部使用
创作共用(署名-非商业性使用)
2.5 中文版许可协议共享
如果你有任何见解、意见和建议,欢迎联系:
昵称:
winkingzhang
园龄:
4年2个月
粉丝:
6
关注:
4
<
2008年2月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
搜索
我的标签
.NET
(37)
Web
(9)
WPF
(7)
Javascript
(6)
Secrity
(5)
Debug
(5)
Bug
(4)
WinForm
(3)
CAS
(3)
VS Package
(3)
更多
友情链接
Colin's Blog
GCDN Community
KevinShan
Ted's Blog
葡萄城控件技术团队博客
最新评论
推荐排行榜