Warum 0x0C
scheint häufiger als 0x08
(ist es wirklich? Ich weiß nicht; und in welchen Arten von Anwendungen?), Könnte dies mit Tabellenzeigern für virtuelle Methoden zu tun haben. Das ist wirklich eher ein Kommentar (wilde Massenraten :), aber es ist etwas größer, also geht es weiter ... Wenn Sie eine Klasse mit virtuellen Methoden haben, werden ihre eigenen Felder um verschoben 0x04
. Beispielsweise könnte eine Klasse, die von einer anderen virtuellen Klasse erbt, ein Speicherlayout wie das folgende haben:
0x00 - VMT pointer for parent
0x04 - Field 1 in parent
0x08 - VMT pointer for child
0x0C - Field 1 in child
Ist das ein häufiges Szenario oder sogar nahe? Ich bin mir nicht sicher. Beachten Sie jedoch, dass dies in einer 64-Bit-Anwendung noch interessanter in Richtung des 0x0C
Werts verschoben werden kann:
0x00 - VMT parent
0x08 - Field 1 parent
0x0C - VMT child
0x14 - Field 2 child
Es gibt also tatsächlich viele Fälle, in denen sich Anwendungen in Nullzeiger-Offsets möglicherweise erheblich überschneiden. Dies ist möglicherweise das erste Feld in einer untergeordneten Klasse oder der Tabellenzeiger für die virtuelle Methode, der benötigt wird, wenn Sie eine virtuelle Methode für eine Instanz aufrufen. Wenn Sie also eine virtuelle Methode für einen null
Zeiger aufrufen , wird die Zugriffsverletzung für die betreffende Methode angezeigt VMT-Offset. Die Prävalenz dieses bestimmten Werts hat dann möglicherweise etwas mit einer allgemeinen API zu tun, die eine Klasse mit einem ähnlichen Vererbungsmuster bereitstellt, oder eher mit einer bestimmten Schnittstelle (für einige Anwendungsklassen wie DirectX-Spiele durchaus möglich). Es könnte möglich sein, eine einfache häufige Ursache wie diese aufzuspüren, aber ich neige dazu, Anwendungen, die keine Dereferenzierung durchführen, schnell loszuwerden, also ...
0000000C
ist Art und Weise als häufiger00000008
, aber keine der Antworten auf Adresse erscheinen , dass überhaupt: /