![]() |
1
16
那么……你如何定义“纯.NET”?当我阅读“如何崩溃JVM”帖子时,我使用了clr2/delegate/gchandle/array,并提出了如下问题:
它只在32位Windows XP上工作,在x86上使用CLR2;也不在Vista和Windows 7等系统上工作,默认情况下,DEP+ASLR处于打开状态。 上面代码的有趣之处在于,它没有显式地使用不安全的代码(尽管gchandle.alloc(…,gchandleType.pinned)需要安全特权),但它设法将数组假设为委托实例,并调用数组中的x86计算机代码。如果您不将嵌入的x86代码算作某种“外语”,代码本身就是纯C-) 基本上,它利用了静态方法上CLR2委托的内部实现,委托的一些私有成员实际上是内部指针。我将x86代码填充到一个数组中,该数组在托管堆上分配。因此,为了使这一点起作用,必须不启用DEP,否则我们将不得不找到其他方法来获得该内存页上的执行特权。 x86代码如下:(伪masm语法)
这不是cli指定的行为,不能在其他cli实现(如mono)上工作。不过,还有其他方法可以让类似的逻辑在Mono上运行,已经在Ubuntu9.04 w/Mono2.4上尝试过了,并且成功了。 我在这里写了一篇关于它的博客: http://rednaxelafx.javaeye.com/blog/461787 它是中文的,但是有很多代码可以解释我做了什么。使用同样的技巧,在博客文章的结尾,我展示了几个例子,如何调整上面的代码以使事情出错,例如获得一个sehexception。 |
![]() |
2
3
我今天就这么做了。我正在测试一个更大的.NET项目的设置。缺少一个包含某些接口的程序集,而exe仅停止工作。运行时未捕获异常。 你可以确定在运行时会有更多的错误-只需计算数百万行代码… |
![]() |
3
2
OrenEini在.NET框架中发现了一个导致“ExecutionEngineeException”的错误——基本上是运行时崩溃。 您可以在此处阅读(Microsoft Connect): https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=384781 尽管bug处于“关闭”状态,但它还没有被修复。 |
![]() |
4
2
不需要使用不安全的代码或委托(如果我必须承认这是一种非常好的方法来崩溃您的CLR),您可以使用简单的封送处理函数来强制.NET崩溃。
此外,使用always gchandle,也会导致类似错误的内存访问冲突。
|
![]() |
5
1
我见过Java程序通过加载一个不存在的类而忽略JVM而忽略
|
![]() |
6
0
您可以使用/clr:pure编译此代码,也可以使用链接器force pure选项。 但是,它会崩溃,看起来像是运行时故障;
即使您使用/clr:pure或/clr:safe进行编译,并且图像本身就是这样表示的,但是由于验证器捕获了这个bug(编译器bug),它只能在完全信任的情况下工作。
这是来自peverify的输出,它解析整个pe文件,直到运行时调用此方法时才会检测到此错误,因为验证器与jit'er一起工作,并且懒于验证。
如果您可以绕过这里的验证器,这将是clr中的一个巨大错误,并让您从非私有进程执行代码。 这是MSIL;
错误在偏移位置,IL_19。 如果您在CAS或任何其他类型安全模式下运行,则此代码将生成著名的“代码可能会使运行时去死化”异常。 |
![]() |
7
0
我想我找到了另一种不涉及非托管代码的方法。然而,它使用的是pinvoke。当我添加了MethodImpl(MethodImplOptions.Unmanaged)时,它工作正常。 我在.NET核心2.1和.NET框架4.7.2上测试了它。前者在vs调试期间崩溃,而后者则在异常时中断,并显示消息System.TypeLoadException在内部的某个地方被抛出。消息和错误代码与我从@salvatore previti答案中得到的相同。 我从命令行调用编译后的应用程序,得到错误退出代码-532462766。 代码如下:
|
![]() |
8
-1
我知道你可以用.NET让你的整个电脑崩溃。但这涉及到一个无止境的循环和一个实时的进程优先级… |
![]() |
9
-1
有些C代码虽然技术上正确,但不能作为有效的.NET程序运行。它与接口重载空方法有关,但我真的记不清了。 |