Что касается того, почему 0x0C
кажется более распространенным, чем 0x08
(действительно ли это? Я не знаю; и в каких типах приложений?) Это может быть связано с указателями таблиц виртуальных методов. Это на самом деле больше комментарий (угадывание дикой массы :), но он несколько больше, так что здесь ... Если у вас есть класс с виртуальными методами, его собственные поля будут сдвинуты 0x04
. Например, класс, который наследуется от другого виртуального класса, может иметь такую структуру памяти:
0x00 - VMT pointer for parent
0x04 - Field 1 in parent
0x08 - VMT pointer for child
0x0C - Field 1 in child
Это общий сценарий или даже близкий? Я не уверен. Однако обратите внимание, что в 64-битном приложении это может быть еще более интересно смещено в сторону 0x0C
значения:
0x00 - VMT parent
0x08 - Field 1 parent
0x0C - VMT child
0x14 - Field 2 child
Так что на самом деле во многих случаях приложения могут значительно перекрывать смещения нулевого указателя. Это может быть первое поле в дочернем классе или указатель его таблицы виртуальных методов - необходимо всякий раз, когда вы вызываете любой виртуальный метод в экземпляре, поэтому, если вы вызываете виртуальный метод для null
указателя, вы получите нарушение доступа к его Смещение ВМТ. Распространенность этого конкретного значения может тогда иметь какое-то отношение к какому-то общему API, предоставляющему класс с аналогичным шаблоном наследования или, скорее, конкретный интерфейс (что вполне возможно для некоторых классов приложений, таких как игры DirectX). Можно было бы отследить какую-то простую общую причину, как это, но я склонен избавляться от приложений, которые довольно быстро разыменовывают нулевую разыменование, так что ...
0000000C
есть способ более распространен , чем00000008
, но ни один из ответов не кажется, что адрес на всех: /