สำหรับสาเหตุที่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 offset ความชุกของค่าเฉพาะนี้อาจมีบางสิ่งที่เกี่ยวข้องกับ API ทั่วไปที่ให้คลาสที่มีรูปแบบการสืบทอดที่คล้ายกันหรือเป็นไปได้มากขึ้นที่อินเทอร์เฟซเฉพาะ (ค่อนข้างเป็นไปได้สำหรับแอปพลิเคชันบางคลาส อาจเป็นไปได้ที่จะติดตามสาเหตุทั่วไปอย่างง่ายเช่นนี้ แต่ฉันมักจะกำจัดแอปพลิเคชันที่ทำให้การยกเลิกการอ้างอิงเป็นโมฆะอย่างรวดเร็วดังนั้น ...
0000000C
เป็นวิธีที่พบบ่อยกว่า00000008
แต่ไม่มีคำตอบใดที่ดูเหมือนว่าจะอยู่ที่: /