问题标签 [dnlib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3250 浏览

.net - 如何使用 dnlib 库获取所有方法的指令?

我正在尝试使用作为de4dot项目一部分的dnlib库来加载程序集并获取包含在所有方法的“主体”中的IL指令。

我用这个VB.NET源代码编译了一个程序集:

我知道编译器修改了很多东西,但是我认为方法名称(在这种情况下)不会被修改,如果我错了,请纠正我。

然后我试图用这段代码检索这些方法:

问题是我看到的这个库的唯一文档是 XML 文档文件和 dnlib 站点上的一些非常基本的示例,它们帮助我编写了上面的代码,但我不确定如何解决/检索这些方法因为我没有正确地执行它,上面的代码没有解析我编译的任何方法(testmethodtestfunction),而是向我展示了很多构造函数(.ctor)和其他方法。

我想做的只是对我编译的源中包含的所有方法(私有、公共等)进行迭代,而不管项目有多少类,也不管哪个类包含特定方法, 得到它的指示。

0 投票
1 回答
740 浏览

.net - 如何初始化惰性列表?

我读过关于延迟初始化的文章,但实际上我不明白如何初始化里面的对象。

这个函数返回一个Lazy类型LazyList的自定义实现

当我尝试读取 LazyList 的任何项目的属性时,我得到一个NullReferenceException异常,我想这是因为对象没有初始化?因为请注意,lazylist 项目计数为“2”,我完全确定我尝试读取的属性不能为空。

如果我尝试重现我在上面的代码中所做的事情(尝试读取属性)但在函数内部,那么一切都按预期进行,没有任何 nullreference 异常......就像在这个例子中:

PS:导入来自dnlib库。

更新:

我想用更多更好的例子来解释这个问题。

在继续解释之前有两件事:

我确保在所有示例中都TypeName存在参数并且找到了 iis,我确保函数返回的对象集合永远不会为空,它的 Collection.Count 为2,正如我在问题开头所解释的那样,所以这都是问题所在。


好吧,下一个函数返回一个对象列表,这些对象带有一个名为的属性,HasBody但该属性总是为空(抛出NullReference异常),当它不应该为空时,集合中包含的两个项目的值都应该是True .

另一方面,如果我在函数中执行了一个荒谬的修改(请参阅与tmp对象相关的更改),该函数返回一个对象列表,其中HasBody属性已初始化,不为空,并且返回列表中包含的 2 项HasBody值为True的属性。

那么问题出在哪里以及如何解决?,也许这是这种情况的临时解决方案,但methoddef返回函数的对象包含很多属性,我需要访问比HasBody未来更多的属性,所以我真的可以不要将每个属性“分配”给tmp函数中的对象,以一种丑陋的方式解决这个问题......

在这两种情况下,用于循环返回的 List 的代码是这样的:

注意:请记住,使用第一个函数我无法解析method.hasbody属性和method.body.instructions属性,都抛出 NullReference 异常。

但是使用修改后的函数,只有在返回列表之前将其method.hasbody分配给函数内部的变量时,我才能解析该属性,并且如果执行相同操作,则该属性也是如此。tmpmethod.body.instructions

0 投票
1 回答
1138 浏览

c# - 调用刚刚创建的方法。计算最大堆栈值时出错

所以我最近在玩 DNLIB,我试图向 .net 文件添加方法。我从以前编译的文件中获得了方法,所以基本上,我试图模仿该方法。

有 3 种方法:GetTheTypes、InvokeIt 和 InvokeCall。

首先,我必须创建方法 GetTheTypes 和 InvokeIt,因为 InvokeCall 调用 GetTheTypes 方法和 InvokeIt 方法。所以我添加了这些方法,它们被完美地添加了。它编译并保存,我能够在反射器/ILSpy 中毫无问题地看到它们。注意:当我添加方法时,我会检查它们是静态的还是非静态的,所以这不是问题。它们也是公共方法。

然后,我想添加 InvokeCall 方法。所以我对其他方法做了同样的事情,打开我想要在 ILSpy 中模仿的方法,然后基本上将所有指令和局部变量复制到一个新的 CilBody 中,这些 CilBody 添加到我正在模仿的 InvokeCall 方法中。唯一的问题是它抛出了一个错误,说"Error Calculating Max Stack Value"。奇怪的是,如果我将 OPCode 从 Call 更改为 NewObj,它编译得很好。但这不是我想做的。我想做的会引发上述错误。

这是我用来添加指令的代码:

_getThetypesMethod变量被定义为MethodDefUser并包含我之前创建并编译得很好的方法我也试过这个:

那也没有用。我也尝试获取该方法的DeclaringType,然后找到这样的方法:

那也没有用。

因此,如果有人对如何调用刚刚创建的方法有任何建议,请告诉我。我一直试图找出如何解决这个问题的最后一天左右,没有占上风。谢谢。

0 投票
1 回答
2550 浏览

c# - 使用 dnlib 在 .NET CLR 堆中重写字符串

我需要在.NET 文件中重写#US 堆中的字符串。我决定使用看起来像一个功能强大的库的dnlib来操作 .NET 文件。不幸的是,它的记录不足。

我以通常的方式加载文件。这些ModuleDefMD Load()方法似乎是加载文件的唯一方法:

现在,dnlib 的Writer命名空间表明它应该用于写入 .NET 结构。它包含看起来很有希望的USHeap类。

Writer 似乎需要创建可以处理的元数据:

在 USHeap 类中有一个SetRawData()描述覆盖应该写入堆的值”的方法。其余的不清楚,让我们无论如何都用它来写 3 个原始任意字节。根据 CLI 标准,第一个有效偏移量是 1:

dnlib 示例显示如何编写文件:

此代码编译并运行没有错误。不幸的是,新文件与原始文件具有相同的#US 流内容。

看来我不明白 Writer 是如何工作的。研究源代码并不容易,因为 dnlib 包含相当多的源文件和行。

dnlib文档引用了ConfuserEx - 使用 dnlib 来操作文件的混淆器。然而,看看它的来源,它似乎根本没有操纵 #US 堆。

0 投票
1 回答
525 浏览

c# - 如何在 dnlib 中获取类的泛型类型?

我有以下课程:

我使用dnlib在 cil 代码级别进行一些更改。在getItem()方法内部,我想获取this参数的类类型,ldarg.0.

我正在查看 param.Type 其中

我已经搜索了所有可用的字段,但找不到。事实上,我得到的是

我希望找到

我不明白为什么<!T>缺少。

对于该字段private T[] array;,类正确显示,<!T>末尾带有 。

0 投票
1 回答
462 浏览

c# - 检查 tiny 与 fat .NET 方法标头

我需要枚举 .NET 模块中的所有方法并检查它们是否有小或大标题。我决定使用强大的dnlib .NET 模块处理库。

有一个dnlib.DotNet.Writer.MethodBody类指示 tiny/fat 方法标头(请参阅IsTiny()IsFat())。但是,我不知道如何访问这个类。

该类位于 Writer 命名空间中 - 让我们使用 Writer 侦听器:

请注意,很容易枚举所有方法并获取另一个 MethodBody方法,即命名空间中的一个Emit

不幸的是,这个类并没有透露任何有用的东西。我相信类似于以下伪代码的东西应该可以工作:

0 投票
0 回答
99 浏览

.net - 如何使用 dnlib 将项目添加到现有列表(字符串)?

如问题所述,如何使用dnlib将项目(字符串类型)添加到列表(字符串) ?

到目前为止,这是我的进步:

0 投票
1 回答
574 浏览

vb.net - 如何使用 Mono.Cecil/dnlib 编辑 AssemblyInfo?

正如问题所述,如何使用 Mono.Cecil 编辑已编译可执行文件的程序集信息?我尝试使用 FileVersionInfo,但它是只读的,我知道 Mono.Cecil/dnlib 有可能。

0 投票
1 回答
1114 浏览

c# - Dnlib - 从加载的程序集中执行 IL MethodBody

我正在为一个简单的.Net 打包器开发一个解包器。

我想使用 dnlib 从加载的程序集中执行一个方法。

我不能使用 System.Reflection,因为打包程序会打包原始可执行文件,然后它会在执行之前在内存中解压,所以使用反射会给我错误,无法找到 xxx 模块。

目前我扫描加载的程序集并获取我需要执行解包的方法的 MethodDef。

如您所知,有一种方法可以使用 C# 从 dnlib 中加载的程序集中执行 IL 代码?

这个想法是调用打包器方法以避免在每次打包器更新时重写解包器。

这种情况可能吗?或者这只是一个梦?XD

如果不可能,我的另一个想法是编写一个 IL 模拟器。

还有其他方法可以解决这个问题吗?

非常感谢您的时间。

0 投票
1 回答
157 浏览

c# - 读取程序集 MethodBody,在 ListBox 中解析它的 Name,在 TextBox 中解析它的 IL?

我有一个带有 a和 a的 WPFMainWindow表单,如下所示:ListBoxTextBox

图 A. 带有示例文本的 WPF 主窗口。 图 A. 带有示例文本的 WPF 主窗口。

现在,Load Assembly... OnClick按钮事件允许我选择一个 .NET 程序集并使用DnLib加载它

然后,如果我想显示方法主体,我会这样做:

这会将每个找到的方法名称添加到ListBox左侧,结果如下:

图 B. 显示填充了方法名称的 ListBox 图 B. 显示填充了方法名称的 ListBox

现在的技巧部分,我想从我选择的任何方法ListBox中显示其各自的 MethodBody ILTextBox

我怎样才能做到这一点?