なぜ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ゲームなどのアプリケーションのクラスでかなり可能)に関係している可能性があります。このようないくつかの単純な一般的な原因を追跡することは可能かもしれませんが、nullの逆参照を非常に迅速に行うアプリケーションを取り除く傾向があるので...
0000000C
ある方法よりも一般的で00000008
はなく、答えのどれもまったくそのアドレスに思えません:/