我们需要修补程序集,目前无法从源代码重建.我可以使用ildasm mydll.dll/all /out=mydll.il转储IL,然后我可以用ilasm/dll mydll.il重建它,除了文件版本,公钥等等都缺少新的二进制文件.我怎么能告诉ilasm添加这些?我没试过/ mdv开关.
作为Powershell的新手,我不是100%明确的:
如果
"在PowerShell中,管理任务通常由cmdlet(发音为command-lets) 执行,这是实现特定操作的专用.NET类."
编写脚本而不是用这些类编写.Net可执行文件并将它们编译为控制台应用程序的原因是什么?
我创建了一个简单的C#程序:
class Program
{
static void Main(string[] args)
{
Int32? a = null;
object x = a;
}
}
Run Code Online (Sandbox Code Playgroud)
根据MSDN:
如果对象为非null,则仅基于可空类型的对象进行装箱.如果HasValue为false,则将对象引用分配为null 而不是装箱.
我已经尝试过我的可执行文件,ILDASM并发现IL代码中有一个名为box的方法.
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 17 (0x11)
.maxstack 1
.locals init ([0] valuetype [mscorlib]System.Nullable`1<int32> a,
[1] object x)
IL_0000: nop
IL_0001: ldloca.s a
IL_0003: initobj valuetype [mscorlib]System.Nullable`1<int32>
IL_0009: ldloc.0
IL_000a: box valuetype [mscorlib]System.Nullable`1<int32>
IL_000f: stloc.1 …Run Code Online (Sandbox Code Playgroud) 当我们声明一个变量时int,例如:
int i = 4;
Run Code Online (Sandbox Code Playgroud)
生成以下IL:
IL_0001: /* 1A | */ ldc.i4.4
Run Code Online (Sandbox Code Playgroud)
我可以理解1A是16的十六进制表示,所以我理解正确的十六进制值被保存用于指代它的值或它意味着不同的东西?
当我声明一个双变量时:
double d = 12.34;
Run Code Online (Sandbox Code Playgroud)
生成IL后,我无法得到一些东西:
IL_0003: /* 23 | AE47E17A14AE2840 */ ldc.r8 12.34
Run Code Online (Sandbox Code Playgroud)
23怎么样,它意味着什么,AE47E17A14AE2840这里有什么?
当我声明一个具有相同值的浮点数时:
float f = 12.34f;
Run Code Online (Sandbox Code Playgroud)
我现在有这个IL:
IL_000d: /* 22 | A4704541 */ ldc.r4 12.34
Run Code Online (Sandbox Code Playgroud)
同样的问题在这里是怎么22来的,它意味着什么,是A4704541什么?
我有一个包含大量目录的目录dlls.我需要找到所有那些引用特定的东西dll.
我正在考虑以下解决方案:
ildasmmanifest到文本文件中然而,这个解决方案让我觉得非常错误.有没有更好的方法来实现它?
我被这个问题激起了好奇心,我去寻找List.Clear()的实现.我跑ildasm的时候System.Collections.dll是这样的:
cd c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe" System.Collections.dll
Run Code Online (Sandbox Code Playgroud)
看着System.Collections.Generic.List`1::Clear : void(),这就是我发现的:
.method public hidebysig newslot virtual final
instance void Clear() cil managed
{
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method List`1::Clear
Run Code Online (Sandbox Code Playgroud)
那不是我想要的.
我知道有些.NET dll是间接层,因此可以指向不同版本的框架.如果是这种情况,我该如何确定实际代码的位置?或者,如果还有其他事情发生,那么有关如何使用ildasm此类任务的提示表示赞赏.我更有能力ildasm使用它来查看我自己的东西,但是没有经验使用它来检查框架代码.
更新
在正确的方向上使用汉斯指针我最终做了以下事情:
cd C:\Windows\Microsoft.NET\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe" mscorlib.dll
Run Code Online (Sandbox Code Playgroud)
这导致我对Clear()方法的以下内容System.Collections.Generic.List`1::Clear : void():
.method public hidebysig newslot virtual final …Run Code Online (Sandbox Code Playgroud) 我在c#中有这个程序:
using System;
class Program
{
public static void Main()
{
int i = 4;
double d = 12.34;
double PI = Math.PI;
string name = "Ehsan";
}
}
Run Code Online (Sandbox Code Playgroud)
当我编译它时,以下是编译器为Main生成的IL:
.method public hidebysig static void Main() cil managed
{
.entrypoint
// Code size 30 (0x1e)
.maxstack 1
.locals init (int32 V_0,
float64 V_1,
float64 V_2,
string V_3)
IL_0000: nop
IL_0001: ldc.i4.4
IL_0002: stloc.0
IL_0003: ldc.r8 12.34
IL_000c: stloc.1
IL_000d: ldc.r8 3.1415926535897931
IL_0016: stloc.2
IL_0017: ldstr "Ehsan"
IL_001c: stloc.3
IL_001d: ret …Run Code Online (Sandbox Code Playgroud) 尝试按照教程步骤反汇编可执行的 c# 文件,但每当我在命令提示符下键入 ildasm 时,它都会显示在开发人员 powershell 中无法识别。当我对 dll 文件执行此操作时,也会显示相同的消息。请帮忙。
C#中类的默认Access修饰符是internal.但是在使用ildasm检查类时,它将类显示为私有.
.class private auto ansi beforefieldinit ConsoleApplication1.Program
extends [mscorlib]System.Object
{
} // end of class ConsoleApplication1.Program
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
我知道 monodis 工具对 Mono 的作用与 ILDASM 对 Microsoft .NET 的作用相同。但是 monodis 工具是否与 .NET 兼容,因为它可以针对 Microsoft .NET 程序集工作,因为它与 Microsoft 的文件布局相同?
鉴于以下自动属性:
public string Name { get; set; }
我使用ILDASM分析它的IL,并对结果感到好奇:
.method public hidebysig specialname instance void
set_Name(string 'value') cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld string Strings.Person::'<Name>k__BackingField'
IL_0007: ret
} // end of method Person::set_Name
Run Code Online (Sandbox Code Playgroud)
我可以看到该方法接受一个名为的参数value,该参数对应于该调用ldarg.0.然而,ldarg.1由于我无法在方法签名中看到第二个参数,因此调用了我.
希望有人能解释一下这里发生了什么吗?
ildasm ×11
c# ×6
.net ×4
il ×4
powershell ×2
.net-4.5 ×1
assemblies ×1
binary ×1
build ×1
byte ×1
csc ×1
dependencies ×1
ilasm ×1
mono ×1
windows ×1