Для данной программы:
using System;
namespace WinDbgArrayAccess
{
class Program
{
static void Main()
{
Program[] justAnArray = new Program[20];
for (int i =0; i<justAnArray.Length;i++) justAnArray[i] = new Program();
Console.WriteLine("Access the elements of the array in WinDbg now!");
Console.ReadLine();
}
}
}
Вы можете видеть
0:006> !DumpArray /d 0336243c
Name: WinDbgArrayAccess.Program[]
MethodTable: 01914db0
EEClass: 71967820
Size: 92(0x5c) bytes
Array: Rank 1, Number of elements 20, Type CLASS
Element Methodtable: 01914d60
[0] 03362498
[1] 033624a4
[2] 033624b0
[3] 033624bc
[4] 033624c8
[5] 033624d4
...
Теперь вам нужно найти эти числа где-нибудь в памяти. Поскольку у нас едва ли есть другая начальная точка, давайте начнем с адреса массива:
0:006> dp 0336243c L10
0336243c 01914db0 00000014 03362498 033624a4
0336244c 033624b0 033624bc 033624c8 033624d4
0336245c 033624e0 033624ec 033624f8 03362504
0336246c 03362510 0336251c 03362528 03362534
Теперь 01914db0
- это тип объекта (называемый Method Table, MT). 0x14
- это 0n20
, который является размером массива. И после этого, кажется, у нас есть элементы 03362498
, 033624a4
, 033624b0
et c.
Как мы получаем доступ к этому программно? Что ж, теперь все просто:
0:006> .printf "%p",poi(0336243c+(2+3)*$ptrsize)
033624bc
Где 2
- пропуск МТ и длины, а 3
- индекс массива, дающий вам 4-й элемент.