Що стосується того, чому 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
вказівником, ви отримаєте порушення доступу до його Зсув VMT. Поширеність цього конкретного значення може потім мати щось спільне з деяким загальним API, який надає класу, який має схожу схему успадковування, або, швидше за все, певний інтерфейс (цілком можливо для деяких класів додатків, таких як ігри DirectX). Можливо, можна відстежити якусь просту поширену причину, як це, але я схильний позбуватися програм, які роблять нульову перенаправлення досить швидко, тому ...
0000000C
це спосіб більш поширений00000008
, але жодна з відповідей, схоже, зовсім не стосується цього питання: /