1
2
如果没有运行时注入额外的检查,我看不到显式布局版本是如何验证的。 无论如何 ,因为它允许您看到对非声明类型的对象的非空引用。 这样更安全:
没有被破坏的风险等,仍然只有一个领域。它不涉及任何有风险的代码等。特别是,它不会冒一些愚蠢的风险,比如:
另一个问题是,除非可以保证CPU模式,否则只能支持单个字段;偏移量0很容易,但如果需要多个字段并需要支持x86和x64,则会变得更复杂。 |
2
3
你发现了一个循环孔,clr允许这样做,因为所有重叠的字段都是对象。任何会让您直接处理对象引用的内容都会被类型加载异常拒绝:
但是你可以通过给类字段来利用它。只要您只是读取字段值,就不会发生真正的错误,例如,您可以通过这种方式获取跟踪句柄的值。 但是,编写这些字段会导致执行异常。不过,如果您能正确猜测跟踪句柄的值,我认为这是一个漏洞。但实际使用已经足够接近零了。 |
3
2
如果以不安全的方式对齐类型,运行时将引发
我猜——因为你可以用
看看 this page 其中详细介绍了C结构转换为IL的一些方式,您会注意到有许多内存布局支持内置于IL/CLR本身。 |
4
1
由于垃圾收集器是非类型化的,并且只区分对象引用和普通位,重叠的引用不会混淆它。但是,虽然一个对象引用可以完全重叠另一个对象引用,但这是不可验证的,即不安全的(ECMA-335标准,第180页,II.10.7控制实例布局)。很容易构建一个程序,利用这种不可验证的能力以可怕的方式崩溃:
在这里,func调用从对象类的虚拟表的最后一个元素的前面加载一个函数指针。根据 this article 在vtbl后面有一个句柄表。将其视为函数指针会导致System.AccessViolationException。 |
5
-1
我不知道有什么问题。此外,我怀疑微软会允许这种使用,如果它是危险的,在一个不明显的方式。 |
Nicola · C++CLI项目中非托管数据上的C#指针 7 年前 |
Anton Savelyev · 在发布版本中删除类指针会导致内存问题 7 年前 |
shmnff · 显式转换int到SqlInt32 7 年前 |
Alex12 · windows窗体中的C++if语句[关闭] 7 年前 |
Claude Tan · 类型定义和类型引用之间有什么区别? 7 年前 |