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程序运行时会检查程序集版本。那么就试试看吧:
直接访问指定的路径看来是不行的了,正如下图所示:
不过没关系,我们可以通过第三方工具访问到该目录,可以通过刚才的FileMon,双击条目可以打开相应的文件目录,还有一种更常用的方便的方式是用TotalCommander, 可以方便的访问windows的各种隐藏路径。
将文件拖放到对应目录便可以覆盖了。 8, 删除程序集的本机映像(native image)
回到刚才用FileMon监视mscorlib访问时,大家可能会发现我们的小程序直接访问的并非mscorlib.dll, 而是一个名为mscorlib.ni.dll的文件(在
C:\\WINDOWS\\assembly\\NativeImages_v2.0.50727_32\\mscorlib\\9adb89fa22f