作者: 周银辉  来源: 博客园  发布时间: 2011-05-16 22:36  阅读: 3258 次  推荐: 3   原文链接   [收藏]

  这段时间为跟踪一个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。

staticvoidMain(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,我们采用后者:

.methodpublichidebysigstatic valuetype System.Guid 
          NewGuid() cilmanaged
  {
    //代码大小       7 (0x7)
.maxstack8
    IL_0000:ldc.i4.0
    IL_0001:newobjinstancevoidSystem.Guid::.ctor(bool)
    IL_0006:ret
  } //end of method Guid::NewGuid

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

.methodpublichidebysigstatic valuetype System.Guid 
          NewGuid() cilmanaged
  {
    //代码大小       7 (0x7)
.maxstack8
    IL_0000:ldc.i4.1
    IL_0001:newobjinstancevoidSystem.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程序运行时会检查程序集版本。那么就试试看吧:
   直接访问指定的路径看来是不行的了,正如下图所示:

   不过没关系,我们可以通过第三方工具访问到该目录,可以通过刚才的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,验证一下成果:

classProgram
    {
        static voidMain(string[] args)
        {
            Guid guid1 = Guid.NewGuid();
            Guid guid2 = Guid.NewGuid();

Console.WriteLine("the first  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,阅读高人的代码,提高自身的水平

转载于:https://www.cnblogs.com/zhiji6/archive/2013/04/17/3026388.html

如何通过ildasm/ilasm修改assembly的IL代码(转相关推荐

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

    这段时间为跟踪一个Bug而焦头烂额,最后发现是Framework的问题,这让人多少有些绝望.所以到微软论坛提了个帖子,希望能得到些帮助.虽然论坛智能到能够判断楼主是否是MSDN订阅用户,以便尽快解决( ...

  2. .Net IL代码研究

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

  3. ildasm + ilasm + ilmerge 小试牛刀

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

  4. 小试ildasm,ilasm,ilspy

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

  5. 详解.NET IL代码(一)

    本文主要介绍IL代码,内容大部分来自网上,进行整理合并的. 一.IL简介 为什么要了解IL代码? 如果想学好.NET,IL是必须的基础,IL代码是.NET运行的基础,当我们对运行结果有异议的时候,可以 ...

  6. 四、CLR执行程序集中代码和IL代码简介

    三.加载公共语言运行时中介绍了在安装了.Net Framework中加载公共语言运行时,公共语言运行时加载程序集的过程.以及通过vs stdio设置源码编译的目标平台的过程. 本问主要介绍公共语言加载 ...

  7. [你必须知道的.NET]第十四回:认识IL代码---从开始到现在

    本文将介绍以下内容: ·       IL代码分析方法 ·       IL命令解析 ·       .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持, ...

  8. 揭开IL代码的神秘面纱--进阶篇(一)

    系列文章目录 揭开IL代码的神秘面纱--基础篇(一) 揭开IL代码的神秘面纱--基础篇(二) 揭开IL代码的神秘面纱--进阶篇(一) 持续更新中...... 工具 IL指令大全 IL指令分类 IL代码 ...

  9. 帝国cms底部代码哪里改?要修改版权和统计代码

    最近接手的几个站是用帝国cms做的,底部代码那边都有一个**设计的链接,还有一些不相关的东西,第一眼看到就想把那些帝国cms底部代码清理掉,这就是让别人建站的烦恼,让他们删除说要收费,坑就一个字,自己 ...

最新文章

  1. expert one on one oracle,数据库表——EXPERT ONE-ON-ONE ORACLE
  2. iReport工具的使用(三)
  3. 网状结构的解藕-中介者模式
  4. XCTF-MISC-新手区-功夫再高也怕菜刀
  5. oracle客户端三种连接,客户端连接ORACLE的几种方法
  6. python返回负数_在Python中三角函数sin返回负数
  7. Unix Vi 命令详解
  8. python递归函数对照表_python-访问递归函数中附加到列表的值
  9. Go语言基础练习题系列5
  10. VMware14虚拟机安装Mac OS教程
  11. Awvs 12.x安装教程
  12. Windows命令之ftp命令
  13. linux内核态访问串口,linux内核中串口驱动注册过程(tty驱动)[转]
  14. Gym 101246(ACM ICPC 2010-2011, NEERC, Southern Subregional Contest Russia, Saratov)
  15. Linux 系统Error starting userland proxy: listen tcp4 0.0.0.0:xx端口: bind: address already in use的端口占用问题
  16. #10064 「一本通 3.1 例 1」黑暗城堡(spfa+乘法原理)
  17. 使用 CLIP 对没有标记的图像进行零样本无监督分类
  18. 故障检测、故障识别领域(分类问题)的性能评价指标
  19. GET和POST两种基本请求方法的区别 1
  20. 爬取QQ音乐(周杰伦)

热门文章

  1. 基于Android的电影选座订票系统毕业设计源码011439
  2. java环境变量配置出错解决办法
  3. Python基于周立功盒子的二次开发的准备工作
  4. 达梦数据库日期格式化_【干货分享】DM7中时间类型的使用介绍
  5. 【狂神说:秦疆】Mybatis持久层框架笔记
  6. 2020年软考系统规划与管理师35天特训——重点知识梳理:第5章 IT服务部署实施
  7. 标准化处理鸢尾花数据集
  8. Apache自带压力测试工具—ab
  9. 迅雷PK用户,到底谁更流氓?
  10. C++写的酒店管理系统,可运行