Co do tego, dlaczego 0x0C
wydaje się bardziej powszechne niż 0x08
(czy to naprawdę? Nie wiem; i w jakich aplikacjach?), Może to mieć związek z wskaźnikami wirtualnej tablicy metod. To jest naprawdę bardziej komentarz (zgadywanie dzikiej masy :), ale jest nieco większy, więc proszę ... Jeśli masz klasę z metodami wirtualnymi, jej pola zostaną przesunięte 0x04
. Na przykład klasa dziedzicząca z innej klasy wirtualnej może mieć układ pamięci taki jak ten:
0x00 - VMT pointer for parent
0x04 - Field 1 in parent
0x08 - VMT pointer for child
0x0C - Field 1 in child
Czy jest to częsty scenariusz, czy nawet bliski? Nie jestem pewny. Należy jednak pamiętać, że w 64-bitowej aplikacji może to być jeszcze bardziej interesujące przesunięcie w kierunku 0x0C
wartości:
0x00 - VMT parent
0x08 - Field 1 parent
0x0C - VMT child
0x14 - Field 2 child
Tak więc w rzeczywistości istnieje wiele przypadków, w których aplikacje mogą znacznie nakładać się na przesunięcia wskaźnika zerowego. Może to być pierwsze pole w klasie podrzędnej lub wskaźnik wirtualnej tablicy metod - potrzebny za każdym razem, gdy wywołasz dowolną metodę wirtualną w instancji, więc jeśli wywołujesz metodę wirtualną na null
wskaźniku, otrzymasz naruszenie dostępu do jej Przesunięcie VMT. Występowanie tej konkretnej wartości może mieć coś wspólnego z niektórymi typowymi interfejsami API, które zapewniają klasę o podobnym wzorcu dziedziczenia lub, co bardziej prawdopodobne, określony interfejs (całkiem możliwe dla niektórych klas aplikacji, takich jak gry DirectX). Możliwe, że możliwe jest wyśledzenie prostej prostej przyczyny takiej jak ta, ale zwykle pozbywam się aplikacji, które powodują zerowe dereferencje dość szybko, więc ...
0000000C
jest sposób bardziej powszechne niż00000008
, ale żadna z odpowiedzi wydaje się, że adres w ogóle: /