首页
社区
课程
招聘
[原创]揭开.NET程序保护的秘密
发表于: 2005-8-10 12:39 13820

[原创]揭开.NET程序保护的秘密

2005-8-10 12:39
13820

.NET程序保护主要有如下几种形式
1.        混淆
2.        编译到本地代码
3.        把代码隐藏在资源中

1.        混淆
这部分的保护软件以Dotfuscator和XenoCode为代表。Dotfuscator是比较初级的混淆器,采取的主要策略是名字混淆,通过把类名、方法名、变量名改成很短的形式,目的是破坏有意义的变量命名。


WebCombo.NET 2.0,采用Dotfuscator进行变量名混淆

名字混淆的缺点在于
a. 名字长度虽短,但是依然容易进行代码分析。对于熟悉汇编语言的逆向工程师,改成短的变量名对阅读代码基本不存在任何难度。
b. 在应用反射(Reflector)机制的程序中不能很好的工作。

XenoCode是稍微高级的混淆器,它采用的技术除了变量名字混淆外,还加入流程混淆。目的是阻止.NET Reflector对其直接进行反编译。大部分采用了混淆器的.NET软件都是使用该混淆器进行保护。


尽管.NET Reflector不能直接反编译为c#,但是我们在语言栏把它切换到IL,依然可以看到中间语言


.NET Reflector之所以不能反编译,是因为XenoCode把中间语言拆成若干段,每段用br或者br.s(相当于jmp)衔接起来。至于为什么.NET Reflector不会解释成goto,我也不太清楚,估计是因为与一条完整的C#语句等价的IL程序段被拆开两半。(哪位大侠知道请指教一下)。反混淆的方法也非常直接,把代码段重新排序就可以了,反混淆的结果如图


用ida pro分析的流程图,未进行反混淆处理前:


反混淆处理后:


对一个几M甚至几十M的il源文件进行反混淆不是一件轻松的事情,因此写了一个用于重新排序的小程序,正式做法类似编译原理的语句优化步骤,先把每个method分块,每个块的第一个语句是入口点,最后一个语句必须是无条件的控制转移语句(br、leave、ret等)。然后把转跳点合并。这里遇到一个问题,遇到入口被method内部多处引用时,只能随机选择一个。因此部分函数还需要人手调整。但毕竟顺序结构还是占绝大多数,所以人手调整的比例还是很少的。我在转换一个几百个类的dll时,需要调整的类也只有10多个,是可以接受的。

显然,如果在有辅助工具的帮助下,XenoCode流程混淆下的程序也不难做到反混淆。加上Reflector的FileDisassembler插件,完全可以把整个assembly的源码导出到本地目录下,再用IDE环境把项目源码导入后进行分析。

2.编译到本地代码
保护软件以RemoteSoft Protector为代表,应用该保护方法的软件较少,因为正版的RemoteSoft Protector需要几千美金。其中代表软件为WebGrid.NET 3.5。在发布的dll里面包括.NET assembly以及一个名为rscoree.dll的一般Win32 PE文件。查看rscoree.dll可以发现导出表仅有_RSDllMain, _RSEEStartup, _RSEEUpdate, _RSExeMain四项,用Ollydbg打开发现并没加密。用Reflector打开.NET assembly,无论是用C#语言查看还是直接查看IL,所有method都只看到空的函数体。只有发现<PrivateImplementationDetails>中存在对rscoree.dll的引用信息。
.class private auto ansi <PrivateImplementationDetails>
      extends object
{
      .method assembly hidebysig static void $$method-1() cil managed noinlining
      {
      }

      .method assembly hidebysig static void $$method-2() cil managed noinlining
      {
      }

      .method private static pinvokeimpl("rscoree.dll" ansi nomangle) void _RSEEStartup(int32 A_0) cil forwardref managed
      {
      }

      .method private static pinvokeimpl("rscoree.dll" ansi nomangle) void _RSEEUpdate(native int A_0) cil forwardref managed
      {
      }

      .field private static bool $$started-1

      .field private static bool $$started-2

}
另外听说有一款国产的保护软件MaxtoCode,分普及版和专业版,普及版可以免费使用。看软件的介绍信息疑也是采用类似技术。缺点是代码编译成了naïve code,所以只能在windows平台运行。逆向人员需要同时懂得.NET虚拟机的知识和Win32汇编,要求较高。

3.这是一种很另类的保护方法(也许是我孤陋寡闻),目前只知道Reflector本身是采用这种方法来保护自身的核心代码库。暂时还没时间去研究具体的实现方法。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
2
.Net怕你了
2005-8-10 12:41
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
学习一下,.net高手~
2005-8-10 12:41
0
雪    币: 270
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
4
最近在帮别人做.NET的项目,自己也顺便去研究一下而已
我自己还是有很多不懂的~慢慢从网上看回来,动手实践后再把经验整理出来。
2005-8-10 13:05
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
5
怕 ~ ~
2005-8-10 13:14
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
最初由 henryouly 发布
最近在帮别人做.NET的项目,自己也顺便去研究一下而已
我自己还是有很多不懂的~慢慢从网上看回来,动手实践后再把经验整理出来。


.net保护估计是以后1、2年的热点,谢谢henryouly 分享这些经验点滴。有个想法,将.net保护研究作为论坛的一个热点讨论课题,比如尝试开发一些.net保护产品。
2005-8-10 14:16
0
雪    币: 270
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
7
支持:)
大家一起学习一起讨论才有意思
2005-8-10 19:05
0
雪    币: 209
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习了,谢谢
2005-8-10 21:59
0
雪    币: 188
活跃值: (529)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whx
9
学习了
2005-8-11 00:25
0
雪    币: 188
活跃值: (529)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whx
10
用到的工具哪里有下载?
2005-8-11 00:26
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
11
问一下楼主图是怎么弄上来的?
2005-8-11 07:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
如何做反混淆?
2005-8-11 09:28
0
雪    币: 328
活跃值: (925)
能力值: ( LV9,RANK:1010 )
在线值:
发帖
回帖
粉丝
13
支持看雪搞课题.
2005-8-13 15:37
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
如果要做反混淆课题,我第一个技术支持
2005-8-16 16:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习中!!
2005-8-17 09:18
0
游客
登录 | 注册 方可回帖
返回
//