通过修改IL来完成dll里面代码的更新

阅读更多

一、最近因为要在一个地方上一个老项目,但是因为需要有差别而且项目代码年代久远,已经无法通过修改代码来完成新版本的部署。后来查阅资料,发现可以通过修改中间语言来完成dll代码的更新。

 

二、相关资源准备:

     1、反编译工具:

      ildasm.exe

      磁盘路径:C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe
      用途:将dll文件反编译为IL文件
 2、IL编译工具:
     ilasm.exe(framework2.0)
     磁盘路径:C:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe
     用途:将IL文件编译为dll文件
  3、老版本的dll
  4、本地代码

三、开始动手
1)使用ildasm.exe打开老版本的dll,并生成il文件。如下图:

通过修改IL来完成dll里面代码的更新_第1张图片

 点击“确定”保存为IL文件,然后使用记事本(notepad,ue等)打开IL文件,找到你想修改代码的那一部分

如下所示为我想要修改的SelectCallIn类中的Page_Load方法中的一部分代码。

 

//类SelectCallIn的IL代码

.class public auto ansi beforefieldinit iFlyTek.FSP10.Flow.SelectCallIn
       extends iFlyTek.FSP10.Flow.FSPBase
{
    .method family hidebysig instance void 
          Page_Load(object sender,
                    class [mscorlib]System.EventArgs e) cil managed
  {

       //这里是Page_Load方法的详细代码,省略

  } // end of method SelectCallIn::Page_Load
}
 

 

使用Reflector.exe打开老版本的dll,将SelectCallIn类中的所有代码复制到本地代码中对应的类文件中,然后你想修改啥就修改啥,这个类中需要依赖的部分都可以虚构出来,只要改完了能够编译通过就行。

 

编译通过后,再次使用ildasm.exe打开新的dll文件,并生成IL文件

 

打开新生成的IL文件,复制SelectCallIn中Page_Load整个方法体的内容,将老版本IL文件中相应的部分替换掉,保存

 

然后使用 ilasm.exe 工具生成dll文件:


通过修改IL来完成dll里面代码的更新_第2张图片


通过修改IL来完成dll里面代码的更新_第3张图片

 

看到打屏 Successfully后,flow_online.dll就生成成功了。

 

再使用Reflector.exe打开flow_onlie.dll 就看到了我刚修改的那一部分,表明修改成功了!

 

  • 通过修改IL来完成dll里面代码的更新_第4张图片
  • 大小: 107.1 KB
  • 通过修改IL来完成dll里面代码的更新_第5张图片
  • 大小: 33.1 KB
  • 通过修改IL来完成dll里面代码的更新_第6张图片
  • 大小: 16.5 KB
  • 查看图片附件

你可能感兴趣的:(反编译,dll,IL,修改dll代码)