ILDASM和ILASM,如何使用它们?

Posted

技术标签:

【中文标题】ILDASM和ILASM,如何使用它们?【英文标题】:ILDASM and ILASM, how use them? 【发布时间】:2019-02-01 01:11:48 【问题描述】:

我在尝试使用 Visual Studio 命令提示符(反)组装一个 dll 时遇到了困难,不要像我看到的 in the microsoft page 那样简单。

我正在以这些方式使用 ildasm:

ildasm myLibrary.dll output:MyLibrary.il

我得到:无法打开“MyLibrary.il”进行输出。

我也试过完整路径:

ildasm directory\myLibrary.dll output:directory\MyLibrary.il

我得到:指定了多个输入文件

使用 ildasm GUI 确实有效,但是当我使用 ilasm 时:

ilasm myLibrary.il /dll

我得到:无法打开“myLibrary.il”,当我使用完整路径时,我得到了同样的错误。

这里有什么问题?

【问题讨论】:

对于ildasm,您似乎遗漏了用于引入选项的/。试试ildasm myLibrary.dll /output:MyLibrary.il 【参考方案1】:

简单,我们来看看这行代码:

using System;      
public class sample  

    static void Main(string[] args)
    
        Console.WriteLine("Inside main ...");
    

让我们将App.cs 编译为App.exe。当我们运行它时,这个可执行文件现在会打印 Inside main …。

现在让我们尝试在不触及其源文件的情况下更改此可执行文件的输出。

你运行ildasm App.exe /out:App.il生成可执行文件对应的IL代码。您现在可以在记事本中编辑此 il 代码,并将 ldstr 从“Inside main ...”更改为“Inside main changed ...”,如下所示:

IL_0000:  nop
IL_0001:  ldstr      "Inside main ..."
IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
IL_000b:  nop
IL_000c:  ret

IL_0000:  nop
IL_0001:  ldstr      "Inside main changed ..."
IL_0006:  call       void  [mscorlib]System.Console::WriteLine(string)
IL_000b:  nop
IL_000c:  ret

现在让我们通过运行ilasm App.il. 从这个 il 文件重建可执行文件,这会生成一个新的 App.exe。如果您运行 App.exe,您将得到以下输出“Inside main changed ...”

social.msdn 和 c-sharpcorner 中有有用的帖子以及指导使用 ILDASM 和 ILASM。

【讨论】:

这有点令人沮丧,我尝试了一个新项目,我得到:c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools>ildasm ConsoleApp1.exe /out:ConsoleApp.il Unable to open 'ConsoleApp.il' for output. 因为您的 .il 可能是只读的或者您没有足够的权限,请尝试删除只读或使用管理员权限 使用提升的权限打开 CMD @FreddxL。更改为您具有写入权限的文件夹

以上是关于ILDASM和ILASM,如何使用它们?的主要内容,如果未能解决你的问题,请参考以下文章

用ildasm/ilasm修改IL代码

强命名 Google.Apis

如何破解.NET Reactor

反编译那点事儿

一切从IL开始

如何在 .Net 核心 exe/程序集上运行 ildasm?