Adapun mengapa 0x0C
tampaknya lebih umum daripada 0x08
(apakah itu benar-benar? Saya tidak tahu; dan dalam jenis aplikasi apa?), Ini mungkin ada hubungannya dengan pointer tabel metode virtual. Ini benar-benar lebih dari komentar (menebak-nebak massa :), tetapi ini agak lebih besar, jadi begini ... Jika Anda memiliki kelas dengan metode virtual, bidangnya sendiri akan digeser oleh 0x04
. Misalnya, kelas yang mewarisi dari kelas virtual lain mungkin memiliki tata letak memori seperti ini:
0x00 - VMT pointer for parent
0x04 - Field 1 in parent
0x08 - VMT pointer for child
0x0C - Field 1 in child
Apakah ini skenario umum, atau bahkan dekat? Saya tidak yakin. Namun, perhatikan bahwa dalam aplikasi 64-bit, ini bisa menjadi lebih menarik ketika digeser ke 0x0C
nilai:
0x00 - VMT parent
0x08 - Field 1 parent
0x0C - VMT child
0x14 - Field 2 child
Jadi sebenarnya ada banyak kasus di mana aplikasi mungkin memiliki tumpang tindih yang signifikan dalam offset null-pointer. Ini mungkin bidang pertama dalam kelas anak, atau penunjuk tabel metode virtual - diperlukan setiap kali Anda memanggil metode virtual apa pun, jadi jika Anda memanggil metode virtual pada null
penunjuk, Anda akan mendapatkan pelanggaran akses pada Offset VMT. Prevalensi nilai khusus ini mungkin ada hubungannya dengan beberapa API umum yang menyediakan kelas yang memiliki pola pewarisan yang serupa, atau lebih mungkin, antarmuka tertentu (sangat mungkin untuk beberapa kelas aplikasi, seperti game DirectX). Mungkin saja bisa melacak beberapa penyebab umum sederhana seperti ini, tetapi saya cenderung menyingkirkan aplikasi yang melakukan null dereferencing dengan cepat, jadi ...
0000000C
itu jauh lebih umum daripada00000008
, tetapi tidak ada jawaban yang tampaknya sama sekali: /