0xC0000005 アクセス違反 をわかりやすくしてみた

Windows 上でアプリを使っていると、

ハンドルされない例外が 0x77E82E19 (ntdll.dll) で発生しました (mofmof.exe 内): 0xC0000005: 場所 0x00000014 への読み込み中にアクセス違反が発生しました。

のようなエラーメッセージが表示されて、プログラムが終了されてしまう現象、
何度か見かけたことがあるのではないでしょうか?

プログラムやってる人には意味が分かると思いますが、そうでない人には、どういう意味なのか分かんないと思います。

というわけで、これを分かりやすく説明してみることにしました。


ケース1. 未実装の機能によるぬるぽ

char peropero[] = "PeroPero";
HINST hDll = LoadLibrary("mofmof.dll");
FARPROC hFunc = GetProcAddress (hDll, "mogumogu");
      _asm{
             push offset peropero
             call hFunc
      }

|。・ω・) 。o (ライブラリ 『mofmof.dll』 を読みだして、関数『mogumogu』の場所を調べて、hFunc にその結果をしまっておいておくれ! )

         ( そんなもんどこにもなかったんで、hFunc に NULL (0) 入れとくわ  )o。(・д・|

|。・ω・) 。o ( メモ、hFunc に書いてる場所にperopero って書類を持ってお使いに行っておくれ )

         ( うわ、hFunc が白紙だった!迷子になったぞ  )o。(>д<|

対応済みコード

char peropero[] = "PeroPero";
HINST hDll = LoadLibrary("mofmof.dll");
FARPROC hFunc = NULL;
if (hDll) {
   hFunc = GetProcAddress (hDll, "mogumogu");
}
if (hFunc) {
      _asm{
             push offset peropero
             call hFunc
      }
} else {
  printf("そんな関数ないよ\n");
}

ケース2. メモリ不足によるぬるぽ

hMem = HeapAlloc(hHeap,HEAP_ZERO_MEMORY, 2000);
memcpy(hMem, offset yasai , 100);

|。・ω・) 。o ( このかばんいいな… )
|。・ω・) 。o ( これ下さい! )

         ( 0x2000 円だよ。所持金たりねーじゃねーか。だったら、売れないぜ )o。(・д・|

|。・ω・) 。o ( 買った鞄に yasai を100個 入れてください! )

         ( 人の話聞け!売れねーっていってんだろ!ぷんすか  )o。(>д< ) =3

対応済みコード

hMem = HeapAlloc(hHeap,HEAP_ZERO_MEMORY, 2000);
if (hMem == NULL) {
  printf("メモリ不足です\nプログラム終了します\n");
  exit(1);
}
memcpy(hMem, offset yasai , 100);

|・ω・)。o (よくあるのはこんな感じですかね? )

ちなみに、Apple 製品の Windows 版や  IEがクラッシュするのはこのチェックが漏れてるか所が多いからなんだけど、それがセキュリティーホールにもつながってるのでたちが悪かったりする。

あと、0x00000014番地とか 0の近傍で落ちてるのは COM Object のロードに失敗したのチェックせずにコールして落ちてるやつですね。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です