这里有篇文章[ NET 程序员十种必备工具 - .NET Reflector ] http://blog.csdn.net/zhumi/archive/2004/07/22/49127.aspx
里面说
///引用
它是一个类浏览器和反编译器,可以分析程序集并向您展示它的所有秘密。.NET 框架向全世界引入了可用来分析任何基于 .NET 的代码(无论它是单个类还是完整的程序集)的反射概念。反射还可以用来检索有关特定程序集中包含的各种类、方法和属性的信息。使用 .NET Reflector,您可以浏览程序集的类和方法,可以分析由这些类和方法生成的 Microsoft 中间语言 (MSIL),并且可以反编译这些类和方法并查看 C# 或 Visual Basic ?.NET 中的等价类和方法。
///
看了非常好奇,也去.NET Reflector 的官方网站下载了一个试用。先找M$的>net FrameWork开刀,以下是 .NET Reflector反编译的DataTable->CopyRow()的方法原码:
///反编译出来的原码
internal void CopyRow(DataTable table, DataRow row)
{
      int num1 = -1;
      int num2 = -1;
      if (row != null)
      {
            if (row.oldRecord != -1)
            {
                  num1 = table.recordManager.ImportRecord(row.Table, row.oldRecord);
            }
            if (row.newRecord != -1)
            {
                  if (row.newRecord != row.oldRecord)
                  {
                        num2 = table.recordManager.ImportRecord(row.Table, row.newRecord);
                  }
                  else
                  {
                        num2 = num1;
                  }
            }
            DataRow row1 = table.AddRecords(num1, num2);
            if (row.HasErrors)
            {
                  row1.RowError = row.RowError;
                  DataColumn[] columnArray1 = row.GetColumnsInError();
                  for (int num3 = 0; num3 < columnArray1.Length; num3++)
                  {
                        DataColumn column1 = row1.Table.Columns[columnArray1[num3].ColumnName];
                        row1.SetColumnError(column1, row.GetColumnError(columnArray1[num3]));
                  }
            }
      }
}
///    这些代码跟原代码基本相似,大家都能看懂^_^,接着也试了商业上发布的一些.NET Control,其中包括PDF Create ,BarCode Create 等控件,无一例外的被完全解刨。注册码的生成、验证、PDF生成算法等等,跟原代码没什么区别,你们不认为这是开源吗,所以我马上又从.NET的网站上下了很多各个领域的Control储存起来,以后要用了就反编一下,比看书会强很多~^_^~!。
  从各个实验的结果证明,.NET Reflector 反编译的C#代码,可读性非常强,使用Reflector.FileDisassembler   插件,甚至可以把整个DLL反编到一个工程,强!!!
   后来又在网上查找了一些资料,知道.NET的代码跟Java代码一样可以用混淆器加工,如是 用.NET2003自带的Dotfuscator Community Edition工具(已经通过网络注册)工具,对原来的.NET代码进行混淆,结果显示,只是类的名称和成员变量进行了一点改动,其功能代码没什么变化。 只是增加了阅读的难度,但我们很多人也只是需要知道一些核心代码就够了,了解一个思路。
   .NET平台真是让人又爱又恨啦。如果这样基于.NET的共享软件怎么生成呢??公司的核心技术怎么保护?
 我在奇怪这么大的事情,为什么论坛上就没看到讨论这个的帖子呢?

解决方案 »

  1.   

    用过了,开始和楼主的感想一样,不过回头想想也没什么了,别的语言的程序不一样也是被hack过了吗
      

  2.   

    呵呵,这个有同感。不过使用强名可以增加反编译的难度。总体来说,个人觉得还是做成WebService好,使用SOA等方式从架构层解决。一点愚见。
      

  3.   

    但是这样Hack也太容易了嘛~,我本来想发布我的第一个共享软件.NET的一个报表工具~~.正在犹豫的时候就看到这个工具,一盆冷水~~~,555~~
    我用它反编了我的代码,反编译出来跟我的原代码差不了多少,我哭啊~~~
      

  4.   

    http://software.ccidnet.com/pub/disp/Article?articleID=42096&columnID=322
    模糊:让你的代码远离偷窥之眼
    Dotfuscator Professional Edition 1000多$,我倒,抢钱啊~~~回:孤灯夜人:
    http://blog.joycode.com/ghj/archive/2004/08/12/30435.aspx这里有下载,随便找的一个地址~
      

  5.   

    你可以尝试着去读一下几万行的aa、bb、c01这样的代码,就知道混淆器已经足够抵挡别人的破译了。
    如果不相信,你可以反编译.NET Reflector,看看你能不能把它搞成一个开源的项目。
      

  6.   

    WebServices,除非你自己提供服务器,而且当客户机跟 webServices交互的数据量比较大时,网络 是一个瓶颈,直接影响到用户的使用和产品推广。但不管怎么说,WebServices是一个不错的主意~~^_^
    大家还有没有其他好的建议呢~,开源??~
      

  7.   

    这完全是误解。.net根本不是开源。确实reflector可以看到很多,但是根本的还是看不到。
      

  8.   

    ///引用
    你可以尝试着去读一下几万行的aa、bb、c01这样的代码,就知道混淆器已经足够抵挡别人的破译了。
    如果不相信,你可以反编译.NET Reflector,看看你能不能把它搞成一个开源的项目。///但.NET框架中的代码并没有被混淆,比如Assembly,DataTable 这些基础类并不能从原码中消除~~,而且你都变aa,bb,cc那你让别人很好的使用你的组件呢~,对exe这是个方法~
      

  9.   

    ///引用
     这完全是误解。.net根本不是开源。确实reflector可以看到很多,但是根本的还是看不到。
    ///
     那些是根本的呢,数据源读取,业务逻辑算法??反正activeReport.NET Component.NET这些控件的的反编译代码,我是看得懂~!~,收获不少~~
      

  10.   

    关于混淆:
       不混淆public、Protected性质的名称,混淆Private和internal,不影响别人使用。
       把关键部分的代码写成private的,再通过public进行调用,别人还是可以用,达到混淆目的。
      

  11.   

    ///
     那些是根本的呢,数据源读取,业务逻辑算法??反正activeReport.NET Component.NET这些控件的的反编译代码,我是看得懂~!~,收获不少~~嗯,这么说吧,你能看得懂的部分,已经不值钱了。
      

  12.   

    那个东东,我也用过,感觉确实不错,但是经过混淆的代码读起来确实有点难度!那么多的aa AA bb BB cc CC 一个小点的工程还可以看看,工程项目一大就不行了!
      

  13.   

    看来还是有很多人用过哈^_^
    ///
    在这个工具里,中文字符串会反编译为\uxxxx的unicode代码,不会给反编译带来阻碍。////引用
    那个东东,我也用过,感觉确实不错,但是经过混淆的代码读起来确实有点难度!那么多的aa AA bb BB cc CC 一个小点的工程还可以看看,工程项目一大就不行了!///
    但一个项目也就是有几个核心代码,其他都是在上面组装,尤其是信息管理系统。只需要把他的数据库连接、用户名验证等核心代码找出来。
    从我的实验看来这个对.NET Reflaction一点难度都没有。尤其是核心代码中,直接引用.NET FrameWork中提供的类库,更是容易看懂,因为你不会去把.NET FrameWork的类库拿来混淆吧???!!!。 因此,我觉得当需要大量对.NET FrameWork中的基本类库进行引用时,就将其分开到不同的小类出实现,让一个函数中的代码尽量的少,用更多的 工厂类,代理等模式设计的方法,再加上混淆器,应该可以使反编译出来的代码更难看懂。大家认为呢?~
    ///
      

  14.   

    我同意楼主的观点。
    有时候,我也会把一些用.Net写的WinForm的工具拿来反编译来看看他们的思路,无论是混淆还是没有混淆的,都基本上和你说的差不多。其实.Net更多的是在Web方面的应用,这些东西都存在服务器上。如果你能顺利拿到这些文件,哈哈,服务器都基本上是你的了。其实用ASM/C写的东西也可以发汇编来读,如果你使用一下最新的IDA,反出来的汇编和C语言一样好读。我现在也常用IDA来看一些病毒和木马的dll,基本也可以看出它们是如何工作的。
      

  15.   

    Reflector.FileDisassembl这个下载到好像不可以用~~
      

  16.   

    To TheAres(班门斧) ,感谢您的回复。
    同感~~!//引用
    Reflector.FileDisassembl这个下载到好像不可以用~~
    这个我也还没用起,我试了以后在给你回复。看来要结帖了哈~,设置的分数少了点~~ ^_^
      

  17.   

    但.NET框架中的代码并没有被混淆,比如Assembly,DataTable 这些基础类并不能从原码中消除~~,而且你都变aa,bb,cc那你让别人很好的使用你的组件呢~,对exe这是个方法~
    ---------
    混淆的好不好,关键是设计的问题,做为一个组件当然不能把使用接口混淆,这样只会给使用者带来麻烦.
    在编写时,定义内部类来完成功能,当混淆把内部的类混淆就可以了.
    就好象CodeSmith的核心部分就是由内部类完成,你反编译看到的只是使用接口应用的部分.
      

  18.   

    CodeSmith
    恩,我待会下下来进行反编译看一下~,谢谢
    随便问一下,你的信誉咋个是71 , ^_^
      

  19.   

    去年我就说过的,现在终于愈来愈多的人关注了,好事啊
    http://community.csdn.net/Expert/topic/3583/3583742.xml?temp=.8616144
      

  20.   

    请等待,2005.5月,我将推出.NET平台加密混淆器,使用传统的ASM方式对其加密,达到不可能使用R或D之类的返编译工具来读源码.请耐心等待...中国大陆,低强度加密版的将会免费发布.
      

  21.   

    .NET还提供转换IL语言的工具呢.......
    配合Reflector可以改写任何一个基于.NET的程序...
    在这些工具的帮助下,分析程序的算法比以前的非托管应用程序更容易了.
    但你能得到的也仅仅是程序,算法而以.这些东西其实书上都有的讲.支持 athossmth(athos) 的看法.....
     
    ============================ ///
      那些是根本的呢,数据源读取,业务逻辑算法??反正activeReport.NET Component.NET这些控件  的的反编译代码,我是看得懂~!~,收获不少~~ 嗯,这么说吧,你能看得懂的部分,已经不值钱了。
      

  22.   

    有什么关系,就算你用C写,人家一样可以反编译成ASM,可能对你来说看ASM非常吃力,但是对懂ASM的人,人家看ASM,就像你看C#一样的
      

  23.   

    所以我一直认为不应该把反射加入到CLR中,至少也要可以选择关闭。就是因为要支持反射,MSIL才变得如此容易被看懂,同时也不能直接变成机器码。为了支持反射,这代价也太大了吧。
      

  24.   

    我有两个方法:(针对Web应用)
    一个是把核心代码放到存储过程里面,这样看到的只是调用存储过程的部分;
    另一个就是可以把代码写的乱一点。呵呵。当然代码首先是给自己看的,写乱了害的是自己,但也有例外的情况。
    比如用代码组复杂一点的查询语句,而组成的查询语句又是核心代码,比如我的翻页控件——如果没有组织的话我自己都看不懂自己的源码:)
    另一个就是组javascript脚本,对于不太熟悉js的人来说js本身就不太好懂,再加上在后台组串,呵呵,有得看了。
      

  25.   

    而且,我发现大项目,全部混淆会有问题,例如水晶报表就不可以混淆还有B/S系统,怎么混淆?每个页面都一个类绑着呢,还要修改aspx中的类名??靠.笨
      

  26.   

    需要加密的地方就用.net,不需要的想其他的办法,这样不就ok了,为什么任何代码都要加密呢?
      

  27.   

    不需要加密的地方就用.net,开发效率高,需要加密的时候想其他的办法,如同你喝汤的时候用勺子,吃青菜的时候用筷子,这样不就ok了,为什么任何代码任何地方都要加密呢?
      

  28.   

    wlovenet(城市农民)
    不需要加密的地方就用.net,开发效率高,需要加密的时候想其他的办法,如同你喝汤的时候用勺子,吃青菜的时候用筷子,这样不就ok了,为什么任何代码任何地方都要加密呢?
      

  29.   

    webcasts课上 就推荐的这个
      

  30.   

    ///引用
    webcasts课上 就推荐的这个推荐的是哪个??///引用
     Ivony:
    我的核心部分只好用非托管的C++来写的了,例如加密、数据库连接字符串等。但是如果我需要用到.NET FrameWork中的类呢?恩,这个问题讨论到这儿可能差不多了,不知道谁还有更好的方法呢?谁用过.NET自带混淆器的专业版,不知道效果怎么样?
      

  31.   

    Managed C++和C++/CLI都支持托管代码和非托管代码写在一起啊,我觉得这是Managed C++唯一存在的原因了。
      

  32.   

    无语,微软还声称什么能有效保护代码安全...
    我从始用Dotnet那天无意看到IL,之后就天天做这个恶梦,想不到变成真的了
    不过还好,我是支持开源的,只要有饭吃就行
      

  33.   

    vs.net自带的混淆器只有重命名功能,控制流模糊处理和字符串加密功能都被禁用了,实在是不够用,只能说是聊胜于无。
      

  34.   

    回复人: ivsm(走在乡间的小路上) ( ) 信誉:97  2005-04-05 18:39:00  得分: 0  
     给分的时候怎么还要密码,密码是多少啊??!!
       你登陆csdn论坛的密码啊!!
      

  35.   

    可以下一个工具,叫做 XenoCode2004, 它可以把 .NET 的代码加密得很好。
      

  36.   

    wujunwei(...II_III_II...) 
    是真的么?看来以后我写程序都反编译一次,岂不是变成了高手写的代码!^_^
      

  37.   

    //引用可以下一个工具,叫做 XenoCode2004, 它可以把 .NET 的代码加密得很好。谢谢您提供这个工具,我这里补充一下,关于这个工具的几个网址:
    1. .NET辅助工具列表 http://dev.csdn.net/article/31/31277.shtm (原来前辈早就说过了:) )
    2.  XenoCode 2005 v3.1.4.1802 企业特别版  
    http://down.week5.net/html/2005-01-18/6172.html (随便找的一个网址,不是打广告哈 :) )
    谢谢大家的支持,我昨天终于看到原来帖子还是可以加分的,HOHO~,那我就不客气了,散分~~、散分~~
      

  38.   

    XenoCode的使用感受就不在这个帖子上说明了,大家有兴趣再开贴讨论,同样散分~~~ #_#