问题标签 [peverify]

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 回答
201 浏览

.net - “在签名中非法使用'void'类型”是什么意思?

我有一个正在生成程序集的编译器。当我加载程序集并尝试在其类在该程序集中的对象上运行方法时,它会引发异常:

System.InvalidProgramException:公共语言运行时检测到无效程序。

随着错误消息的出现,这与UR COMPILER SUXX0RZ LOLOLOL!!! 在 MSDN 上查找它所提供的信息完全相同:编译器有问题。

所以我尝试在生成的程序集上运行PEVerify并得到一个更有用的消息:

[MD]:错误:在签名中非法使用类型“void”。[令牌:0x11000002]

不幸的是,它没有说除此之外的任何内容,例如什么签名具有非法 void。你知道,那种对追踪报告的错误很有用的东西......

在 ILDASM 中打开它,我没有看到任何明显错误的空虚,那么下一步是什么?我从哪里去找出我的编译器做错了什么?

0 投票
3 回答
1906 浏览

.net - 如何在 .net 中进行混淆后调查问题?

我试图用ConfuserEx混淆一个库,但之后我的应用程序崩溃,MissingMethodException堆栈跟踪指向第一次使用混淆的类和方法是被重命名的。我不知道在哪里找到它的调用或其他用法,所以不清楚我应该检查什么。我的猜测是在 JIT 过程中发生了异常。

只应用了重命名混淆,我有映射来反转它。

我查看了混淆模块和方法的重命名版本肯定存在。

在混淆模块上运行 PEVerify.exe 也会产生一些错误(下面仅提供一小段摘录):

我已准备好调试混淆过程以搜索出了什么问题……但我不知道要查找什么。我如何找出代码的哪一部分正在尝试使用旧方法名称?如何使用 PEVerify 的输出,例如 mdTokens 将如何帮助我?

0 投票
1 回答
209 浏览

c# - 此处有关重复方法的 PEVerify 警告是否错误?

我正在对程序集进行混淆,在混淆后 PEVerify 发出以下错误:

这是第一个带有标题的方法声明:

这是第二个:

对我来说,这似乎是一个显式的 IDisposable 接口实现。两种方法都被调用,所以并不是所有对一个方法的调用都被替换为对另一个方法的调用。他们只是共享同一个名字

如果用 C# 编写了类似的代码 - 编译器将发出 System.IDisposable.Dispose() 和 Dispose() 方法,从而消除相同的名称并使 PEVerify 保持沉默。

为了确保当其中一个是接口方法的显式覆盖而另一个不是时相同的名称使 IL 有效,我编写了这样的示例应用程序:

IL 看起来像这样:

注意不同的方法名称。

然后我将生成的 exe 文件编辑ClassLibrary1.IX.M为就M在其中Class1(我已经使用dnSpy来做到这一点)。PEVerify 确实开始发布有关重复方法的相同问题,但 exe 仍然可以正常打印M() IX.M(),如预期。

问题是,如果 PEVerify 在这里过于谨慎,或者我没有看到的名称重合确实存在问题?

0 投票
1 回答
2737 浏览

.net - How to correct Stack UNDERflow error

I get an InvalidProgramException when trying to execute a particular procedure in an application I am working on when it has been compiled with optimizations (Visual Studio 2015). I used PEVerify to see what it says about the problem, and it tells me "Method[offset 0x00000351] Stack underflow".

Obviously I can fix the problem by turning optimizations off, but that is a less than optimal solution, as is waiting for MS to fix whatever bug causes it in the next version.

What can I do to fix a stack underflow error? If I had to guess I'd say that it's probably related to the fact that this class is somewhere around 18k lines, but there's not a lot I can do about that...

Edit: Just to be clear, I don't expect an answer along the lines of "delete lines 6276 and 6277", what I am looking for is general strategies for troubleshooting this type of problem in .net. Something like the answers to this ActionScript question: How to debug a runtime stack underflow error?, except specific to .net. I am posting this so that the next person that has this type of problem will have a starting point for what they might try to work around this issue.

0 投票
1 回答
531 浏览

c# - 如何从 PEVerify 诊断“类型加载失败”

我正在开发一个编译器,该编译器在某些扩展生成器的情况下会产生错误的输出。PEVerify 只是说“类型加载失败”而没有解释原因。当我过去看到这种情况时,通常是因为生成的类型具有错误数量的泛型参数,但这里似乎一切都匹配。

有什么好方法可以获取有关生成的类型出了什么问题的更详细信息?除此之外,是否有任何好的提示和技术来追踪错误?

PEVerify 的输出:

C:\Build\Test>peverify testcase.exe /VERBOSE /UNIQUE

Microsoft (R) .NET Framework PE 验证程序。版本 4.0.30319.0 版权所有 (c) Microsoft Corporation。版权所有。

[IL]:错误:[C:\Build\Test\testcase.exe:Testing.Linq_operatorModule::IndexWhereImpl[T]][mdToken=0x6000002][offset 0x00000002] 无法解析令牌。

[IL]:错误:[C:\Build\Test\testcase.exe : Testing.Linq_operatorModule+$IndexWhereImpl$3`1[T]::.ctor][mdToken=0x6000006] [HRESULT 0 x8007000B] - 尝试加载格式不正确的程序。

[令牌 0x02000004] 类型加载失败。

3 验证 testcase.exe 的错误

ILDasm 的综合转储在这里,因为它太大而无法放入 SO 帖子。

0 投票
2 回答
193 浏览

c# - 为什么此代码无法验证?

我有一个可以正确构建和运行的编译器,但 PEVerify 在某个时候称它无法验证。仔细查看错误、相应的源代码和问题点的 ILDasm 输出后,我找不到问题,以至于我怀疑 PEVerify 中存在错误,除了 .NET 和 Mono 版本在同一个地方报告同样的错误。

有问题的方法如下:

错误报告为:

[IL]:错误:[D:\SDL-1.3.0-4423\boo\build\Boo.Lang.Compiler.dll:Boo.Lang.Compiler.TypeSystem.AsyncHelper::InAsyncMethod][偏移量 0x00000011][找到参考'Boo.Lang.Compiler.Ast.Node'][expected ref Boo.Lang.Compiler.Ast.INodeWithBody'] 堆栈上的意外类型。

Offsest对应于表达式0x11的后半部分。??来自 ILDasm:

该类Boo.Lang.Compiler.Ast.Node是所有 AST 节点的基类。 BlockExpressionMethod分别是 lambda 和方法的节点类,它们都实现了INodeWithBody接口。一切看起来都是正确的,无论是在 C#(如果存在类型问题,它将不会构建)和 IL(它说调用000c的返回类型是GetAncestor<Method>!!0,方法调用的第一个类型参数。)

Node当 PEVerify 显然具有type 值时,是什么导致它认为它在这里处理的是 type值Method?有什么办法可以解决吗?

0 投票
1 回答
244 浏览

.net - 如何确保无法验证的 .NET 程序集有效?

.NET 应用程序分布在称为程序集的文件中,其中包含元数据和通用中间语言 (CIL) 代码。.NET 遵循的标准 ECMA-335 II.3 指出了两个听起来相似的术语之间的区别:

  • 符合标准的程序集是有效的。

    验证是指对任何文件进行一组测试,以检查文件的格式、元数据和 CIL 是否一致。这些测试旨在确保文件符合本规范的规范要求。

  • 如果程序集有效并且可以通过标准描述的静态分析算法证明程序集是类型安全的,则程序集是可验证的。

    验证是指检查 CIL 及其相关元数据,以确保 CIL 代码序列不允许对程序逻辑地址空间之外的内存进行任何访问。结合验证测试,验证确保程序无法访问内存或其他未被授予访问权限的资源。

所有可验证程序集都是有效的,但并非所有有效程序集都是可验证的。此外,一些有效的程序集实际上可能是类型安全的,但验证算法无法证明它们是类型安全的,因此它们是不可验证的。要使用标准中的图表:

ECMA-335,II.3,图 1:正确和可验证的 CIL 之间的关系

.NET SDK 提供了一个静态确定程序集是否可验证的工具:PEVerify。因为可验证程序集也必须有效,所以如果程序集无效,此工具也会报告错误。

但是,似乎没有等效的工具或程序来确定程序集是否有效。例如,如果我已经知道程序集是无法验证的,并且我对此感到满意,那么我如何仍然确保运行时不会由于无效程序而出错

我的测试用例:

我组装这个使用ilasm,生产MyAsm.exe

虽然我可以运行程序集,但 .NET 运行时只会在invalid()调用方法时出错,而不是在加载程序集时出错。如果我删除调用,则程序运行完成且没有错误,因此仅加载和运行程序集并不能保证它完全有效。

在程序集上运行 PEVerify 会产生三个错误。虽然在这种情况下,人眼很容易看出前两个错误是验证错误,最后一个是验证错误,但似乎没有一种简单的方法可以自动区分这种情况(例如,检查每一行verifi似乎太宽泛了)。

0 投票
1 回答
320 浏览

c# - 使用 Peverify 和 ILVerify 对不安全的 c# 返回类型进行验证错误

在验证一些包含返回指针的不安全方法的代码时,我遇到了这个问题。

该示例可以表示为:

我正在使用两个独立的验证工具,即 ILVerify 和 Peverify。

重现步骤:

  1. 使用编译示例代码csc example.cs /t:library /unsafe
  2. 核实peverify example.dll
  3. 核实ILVerify.exe -r C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll example.dll

2. 和 3. 都将导致以下错误消息:

[IL]:错误:[C:\src\test\example.dll : A::GetAnswer()][offset 0x00000006][found address of Int32] 堆栈上的预期数字类型。

[IL]:错误:[C:\src\test\example.dll : A::Main()][offset 0x00000009][found Native Int] 堆栈上需要 ByRef。2 验证 C:\src\test\example.dll 的错误

神秘的是,一切都按预期编译和运行,它不会验证。有没有人对为什么会这样有一些洞察力?

0 投票
1 回答
284 浏览

c# - 使用泛型类型时的 C# System.TypeInitializationException

当我尝试调用以下命令时,我在 C# 中收到 System.TypeInitializationException:

BuyShopItem位于外部程序集中,包含以下内容:

这可能是因为外部组件,对吧?

不幸的是,我无法更改它,因为我需要BuyShopItem再次将其传递给另一个外部组件。

关于程序集的一些信息:它来自 Unity 游戏,.NET 3.5(根据 DotPeek msil, .Net Framework v3.5:)

我在 SharpDevelop 和 Visual Studio 2017 中都遇到了这个问题,所以它可能与 IDE 无关。结果peverify

如果您有任何提示,请告诉我。我会尽快尝试。

这是 Visual Studio 2017 中异常的屏幕截图: https ://i.imgur.com/WHCbWTM.png

更新:我刚刚尝试了以下:Console.WriteLine(typeof(BuyShopItem));,发生了同样的错误。为什么无法获取类型?

0 投票
0 回答
192 浏览

c# - PEVerify 缺陷:它在使用 csc.exe 为紧凑框架编译的有效类上报告“类型加载失败”

一个微不足道的类:

当针对 MS CompactFramework v3.5 使用 csc 编译时,将导致 dll 无法通过 peverify,从而导致“类型加载失败”。

从作为 MS 提供的框架的一部分的 SecurityCredentialsManager 类继承似乎是一个问题,但我似乎无法确定为什么这个类有问题。

反射显示此类的签名为:

或在 IL:

继承此 System.ServiceModel 程序集中的其他类不会导致错误,因此它不是程序集解析问题。

我尝试在 VS 2005 和 VS 2017 命令窗口中运行以下脚本,但它似乎与 VS 版本无关。

这是演示错误的工具链调用的记录: