ILDASM和ILASM,如何使用它们?

9

我在尝试使用Visual Studio命令提示符对一个dll进行(反)汇编时遇到了困难,这看起来并不像我在微软页面中所看到的那么简单。

我是按照以下方式使用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'”的错误消息。这里出了什么问题?

1
对于 ildasm,你好像忘记了引入选项的 / 符号。请尝试使用 ildasm myLibrary.dll /output:MyLibrary.il - Andy Ayers
在VS2019中,文件参数除非用**""**引起来,否则什么都不起作用。 - Laurie Stearn
2个回答

8

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

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.msdnc-sharpcorner中有有用的帖子,指导使用ILDASM和ILASM。

2
有点让人沮丧,我尝试创建一个新项目,结果出现了以下错误信息:c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools>ildasm ConsoleApp1.exe /out:ConsoleApp.il 无法打开 'ConsoleApp.il' 进行输出。 - Freddx L.
由于您的.il文件可能是只读的,或者您没有足够的权限,请尝试删除只读属性或使用管理员权限操作。 - Barr J
以管理员权限打开CMD - developer learn999
@FreddxL。切换到你拥有写权限的文件夹。 - StayOnTarget

0

ildasm myLibrary.dll -output=MyLibrary.il

在Linux或OSX上不要使用选项键“/”。

'/'是系统路径分隔符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接