这段时间为跟踪一个Bug而焦头烂额,最后发现是Framework的问题,这让人多少有些绝望。所以到微软论坛提了个帖子,希望能得到些帮助。虽然论坛智能到能够判断楼主是否是MSDN订阅用户,以便尽快解决(传说MSDN订阅用户的问题能在两天内得到回复的,当时还很得意公司为我们购买的MSDN订阅账号),但得到的回复是“Could you file a bug report for this issue through Connect?”,绝望之后的又一次寒心啊。

  看过payeasy的广告之后,便有了以下的这些内容,如何修改.net framework:

  这里我们以修改Guid类为例,我们将修改这个类的内部构造,以便其始终构造值为0值(00000000-0000-0000-000000000000)的对象

  1,知道你要修改谁(dll的名称)
  这很简单, 翻翻MSDN,你应该能找到你所调用的类库是哪一个,或者使用reflector可以得到更详尽的信息。从MSDN得知,Guid类在mscorlib.dll中

  2,找到你要修改的dll,并拷贝出来,以便修改
  mscorlib.dll位于GAC中,很可惜,windows只允许按照“可远观不可亵玩"的方式静静欣赏(尽管心急如焚)

  我们现在需要将该dll在操作系统中的实际路径找出来。
  2.1 下载FileMon,其用于监视文件的被访问情况,我们可以通过他,找到文件路径。
  2.2  写一个小程序,让该程序去访问(引用)你需要查找路径的文件,这里也就是我们的mscorlib。

        上海网站建设span>static void Main(string[] args)
        {
            Guid guid = Guid.NewGuid();
            Console.WriteLine(guid);
            Console.Read();
        }

  代码中的Guid以及Console等都会访问mscorlib.dll。
      2.3 运行FileMon,让他去监视mscorlib的访问,由于我们不知道mscorlib的具体路径(废话),但我们至少知道它在C:\WINDOWS\assembly下(至少知道在系统盘下),那么我们就将这个文件夹及其所有文件一块监视吧: 

  2.4,运行我们的小程序,FileMon将监视到所有到C:\WINDOWS\assembly下的访问,并将包含mscorlib的高亮,双击列表中的条目,其将自动打开文件所在的文件夹:

  OK,现在找到该dll文件了,将其拷贝出来,以供我们修改,并将其路径记录下来以备将来使用(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089)。另外,建议备份一下拷出来的dll。

  3,利用ildasm反编译该dll,生成中间语言(IL)文件,我们将修改该IL文件
  ildasm是.net自带的一个反编译工具,可以在SDK(C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\)中找到,但通过VS的控制台便可以使用了(具体使用方式,参考MSDN)

  然后可以得到该程序集的IL文件:

  它其实是一个文本文件,所以可以直接打开进行编辑,但建议使用Notepad++或 UltraEdit 文本编辑器,但打开后似乎有些让人有些崩溃,汪洋大海啊,如何找到我们需要修改的代码所在的位置呢

  4,利用reflector查看所要寻找的类或方法的定义
  打开reflector,查找所要寻找的类或方法,并查看其定义,假设我们需要的是Guid.NewGuid()方法:

  切换到IL视图:
 
   OK,有了该IL片段,要在mscorlib.dll.il的汪洋大海中查找该方法就很简单了(Ctrl-F)。

  5,修改IL代码
  在notepad++或UltraEdit中找到对应的方法。我们发现NewGuid()实际是调用其Guid(bool)方法,我们可以将其替换成默认构造函数(默认构造函数构造的guid为00000000-0000-0000-000000000000)这样一来调用NewGuid()方法时则始终返回0值了,也可以在调用Guid(bool)时传入true,我们采用后者:

  .method public hidebysig static valuetype System.Guid 
          NewGuid() cil managed
  {
    // 代码大小       7 (0x7)
    .maxstack  8
    IL_0000:  ldc.i4.0
    IL_0001:  newobj     instance void System.Guid::.ctor(bool)
    IL_0006:  ret
  } // end of method Guid::NewGuid

  上面代码中的IL_0000:  ldc.i4.0 表示将0(false)作为4字节整数入栈,我们将其中的0改成1:

  .method public hidebysig static valuetype System.Guid 
          NewGuid() cil managed
  {
    // 代码大小       7 (0x7)
    .maxstack  8
    IL_0000:  ldc.i4.1
    IL_0001:  newobj     instance void System.Guid::.ctor(bool)
    IL_0006:  ret
  } 上海企业网站制作// end of method Guid::NewGuid

  (注意,这里的操作很简单,所以很单纯地修改了,若对于比较复杂的操作请先学习IL相关知识)
  然后保存你的修改。

  6,编译IL代码,生成新的DLL
  利用ms提供的ilasm可以将IL文件编译成dll:
   (编译前别忘记关闭文本编辑器,比如ultraEdit会独占文件而导致无法访问)

  7,将修改后的DLL放回到GAC 
  你可能会想到按照MSDN上提到的方法就如同安装自己普通的程序集一样将其安装到GAC,大概能猜想到这是不可行的,否则”不安全了“。 或者,我们刚才不是记录了mscorlib的路径的吗,直接复制粘贴进去覆盖不就行了,也许可以,也许不可以,只所以说不可以,原因有可能有二,一是根本不让访问页不让覆盖,二是程序.net程序运行时会检查程序集版本。那么就试试看吧:
   直接访问指定的路径看来是不行的了,正如下图所示:
上海闵行企业网站设计与制作 border="0" alt="" />
   不过没关系,我们可以通过第三方工具访问到该目录,可以通过刚才的FileMon,双击条目可以打开相应的文件目录,还有一种更常用的方便的方式是用TotalCommander, 可以方便的访问windows的各种隐藏路径。

  将文件拖放到对应目录便可以覆盖了。

  8, 删除程序集的本机映像(native image)
  回到刚才用FileMon监视mscorlib访问时,大家可能会发现我们的小程序直接访问的并非mscorlib.dll, 而是一个名为mscorlib.ni.dll的文件(在C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\9adb89fa22fd5b4ce433b5aca7fb1b07\ 路径下),这是mscorlib.dll的本机映像(native image),关心过.net优化的朋友应该会知道我们可以通过ngen来将程序集生成本机映像以提高运行速度。那么程序将直接去访问该映像而非我们修改过的mscorlib.dll,这会导致我们的修改看不到效果。所以我们要将该映像删除。为什么是删除,而不是将修改过的mscorlib.dll利用ngen来生成一个新的映像而覆盖之? 原因很简单,大家自己想想吧。
首先,利用 ngen uninstall 命令从本机映像缓存中卸载本地映像,然后利用TotalCommander将其删除(注意,先关闭可以对所覆盖的程序集有所引用的应用程序,最好重启一下电脑,应该不用进安全模式删那么费劲)

  9,验证一下成果:

    class Program
    {
        static void Main(string[] args)
        {
            Guid guid1 = Guid.NewGuid();
&上海徐汇企业网站设计与制作nbsp;           Guid guid2 = Guid.NewGuid();

Console.WriteLine("the firs上海徐汇企业网站制作t  GUID: {0}", guid1);
            Console.WriteLine("the second GUID: {0}", guid2);

Console.Read();
        }
     }

  如果使用MS原版的mscorlib.dll我们将得到类似于下面的输出:    使用我们修改过的mscorlib.dll:

  (另外,值得注意的是,Visual studio对某些程序集的引用来自于C:\Program Files\Reference Assemblies 下,所以,对于某些程序集如果要对VS引用造成影响则应该覆盖C:\Program Files\Reference Assemblies下的对应文件。这里的mscorlib不需要)

  感谢阅读,仅供参考
  周银辉

  【相关文章】

  通过学习反编译和修改IL,阅读高人的代码,提高自身的水平

如何通过ildasm/ilasm修改assem“.NET研究”bly的IL代码相关推荐

  1. 如何通过ildasm/ilasm修改assembly的IL代码(转

    作者: 周银辉  来源: 博客园  发布时间: 2011-05-16 22:36  阅读: 3258 次  推荐: 3   原文链接   [收藏] 这段时间为跟踪一个Bug而焦头烂额,最后发现是Fra ...

  2. ildasm + ilasm + ilmerge 小试牛刀

    我们都知道用 ildasm 可以反编译出中间文件来,再用 ilasm 可以再将中间文件编译回 dll .对于简单的 dll 破解来说, ildasm + ilasm 就是基本工具了. 为了进一步学习I ...

  3. 小试ildasm,ilasm,ilspy

    选择了微耕的软件(为什么选择它,因为微耕的二次开发实在太牛了,只给文档,一切技术问题都不回答.文档也是只公开基本的东西) 第一个功能:换文字 第二个功能:插入一个新的程序集,在做某些事情前先做我想做的 ...

  4. DLL内线程同步主线程研究(子线程代码放到主线程执行)

    DLL内线程同步主线程研究(子线程代码放到主线程执行) 我们在实际项目中经常会用到多线程编程,比如Socket编程等,在创建的线程内同步主线程一般使用Synchronize方法实现子线程操作放到主线程 ...

  5. .Net IL代码研究

    参考文章:http://www.cnblogs.com/zery/p/3366175.html 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的 ...

  6. android 动态修改 selector,Android Selector 按下修改背景和文本颜色的实现代码

    1,selector 按下修改背景和文本颜色 [1]点击改变字体颜色 - android:state_pressed(按压状态) [2]selector状态选择器(bg_btn_two (存放 res ...

  7. android selector点击修改颜色,Android Selector 按下修改背景和文本颜色的实现代码

    1,selector 按下修改背景和文本颜色 [1]点击改变字体颜色 - android:state_pressed(按压状态) [2]selector状态选择器(bg_btn_two (存放 res ...

  8. python代码怎么修改_python修改微信和支付宝步数的示例代码

    项目意义 如果你想在支付宝蚂蚁森林收集很多能量种树,为环境绿化出一份力量,又或者是想每天称霸微信运动排行榜装逼,却不想出门走路,那么该python脚本可以帮你实现. 实现方法 手机安装第三方软件乐心健 ...

  9. oracle hr 密码修改,Oracle 11g用户修改密码及加锁解锁功能实例代码

    1.运行 cmd.exe: 2.输入 sqlplus / as sysdba,以系统管理员(sysdba)身份连接数据库,进行数据库管理操作. 3.连接成功后执行 alter user identit ...

最新文章

  1. mysql 基于集_一种基于记录集查找特定行的方法_MySQL
  2. java编程时 尽量少用_Java编程语言基础知识的要点
  3. 苹果史上最强芯片竟然是个“组装货”!iPhone SE涨价,13系列是真绿了
  4. UVA - 315 Network(tarjan求割点)
  5. Xcode7 添加PCH文件
  6. 智能时代“云”主沉浮
  7. SplitContainer.SplitterDistance属性值设置应注意的与FixedPanel有关
  8. 读“产品经理那些事儿”有感
  9. 十大排序算法----堆排序(最后一个非叶子节点的序号是n/2-1的推理)
  10. hdu2586 lca倍增法
  11. Ubuntu 设置 samba共享文件夹
  12. 深入理解c++之struct构造函数
  13. 山东省大学生软件设计大赛
  14. 100个苹果拿最后一个问题
  15. Exchange 2013/2016/2019修改附件大小限制
  16. 不等号属于不等式吗_什么是不等式
  17. 个人开发者的白piao云服务器
  18. uniApp运行到微信小程序
  19. Ubuntu下安装Miniconda
  20. 语音识别技术突飞猛进,语音识别公司都有哪些?

热门文章

  1. 【GIoU loss】GIoU loss损失函数理解
  2. IoT黑板报:中国移动基站将支持无线充电
  3. 机器学习——线性回归实践
  4. 细谈在非WIFI状态下显示GIF缩略图效果
  5. navicat连接mysql报错:client does not support authentication protocal requested by server
  6. Dell T30解决报Alert! Cover was previously removed.
  7. identify your project root folder to open source in cisual studio code and sync changs
  8. Java中常见的IO模型
  9. @Repeatable注解信息获取
  10. 频繁项集的产生及经典算法