如何通过 C# 中的偏移量访问字段值
How can I access field value by it's offset in C#
public class Test
{
int m_iInt1; // 0x0
int m_iInt2; // 0x4
}
在 C# 中是否可以访问这样的字段:
var inst = new Test();
unsafe
{
var reference = __makeref(inst);
int int1 = *(int*)(reference + 0x0);
}
我怎样才能做到这一点?
假设您的情况:
var fields = typeof(Test).GetFields();
int i = fields[0].GetValue(inst);
这行得通
如果您能让我们更深入地了解您的用例,我们可能会帮助您更多:)
You can't do that.
我可以
var inst = new Test();
unsafe
{
var reference = __makeref(inst); // could also be retrieved with GCHandle.Alloc
IntPtr ptr = **(IntPtr**)(&reference);
int* x = (int*)ptr;
Console.WriteLine(x[1]); // prints m_iInt1
Console.WriteLine(x[2]); // prints m_iInt2
Console.WriteLine(*(int*)((int)ptr + 0x4)); // same as above
Console.WriteLine(*(int*)((int)ptr + 0x8));
}
我想 *(int*)((int)ptr + 0x0)
是方法 table 指针,如下所述:http://blogs.microsoft.co.il/sasha/2012/03/15/virtual-method-dispatch-and-object-layout-changes-in-clr-40/ and http://yonifedaeli.blogspot.com/2017/03/sync-block-index-sbi-object-header-word.html
这只是为了教育目的,我知道这些东西不会用在普通的软件中。这个可以用来做很多事情这里就不赘述了
public class Test
{
int m_iInt1; // 0x0
int m_iInt2; // 0x4
}
在 C# 中是否可以访问这样的字段:
var inst = new Test();
unsafe
{
var reference = __makeref(inst);
int int1 = *(int*)(reference + 0x0);
}
我怎样才能做到这一点?
假设您的情况:
var fields = typeof(Test).GetFields();
int i = fields[0].GetValue(inst);
这行得通
如果您能让我们更深入地了解您的用例,我们可能会帮助您更多:)
You can't do that.
我可以
var inst = new Test();
unsafe
{
var reference = __makeref(inst); // could also be retrieved with GCHandle.Alloc
IntPtr ptr = **(IntPtr**)(&reference);
int* x = (int*)ptr;
Console.WriteLine(x[1]); // prints m_iInt1
Console.WriteLine(x[2]); // prints m_iInt2
Console.WriteLine(*(int*)((int)ptr + 0x4)); // same as above
Console.WriteLine(*(int*)((int)ptr + 0x8));
}
我想 *(int*)((int)ptr + 0x0)
是方法 table 指针,如下所述:http://blogs.microsoft.co.il/sasha/2012/03/15/virtual-method-dispatch-and-object-layout-changes-in-clr-40/ and http://yonifedaeli.blogspot.com/2017/03/sync-block-index-sbi-object-header-word.html
这只是为了教育目的,我知道这些东西不会用在普通的软件中。这个可以用来做很多事情这里就不赘述了