Mona Music Player 変数書き換え犯人探し
おーう。親スレッドさんが eip=0xA002CF19 でメモリを書き換えているよ。
何の処理だろうか。
===== debug fault start =========================================================== address=0xA0037844 value=0x900A3000 name=HAPPY.EX5 tid=77 eax=0x900A3000 ebx=0x0000004D ecx=0x90050000 edx=0x0000004D esp=0xEFFFFC60 ebp=0xEFFFFC78 esi=0x90050000 edi=0x00053000 cs =0x0000002B ds =0x00000033 ss =0x0000003B cr3=0x0034C000 eflags=0x00000297 eip=0xA002CF19
まずはバグが発生する eip が常に安定しているか見てみる。→安定している。
- mapファイルに一致するアドレスが無い
- 命令列 dump
- 8d0a74a0 f089f465 5d5f5e5b 676a50c3 3558868
- for i in `find -name "*.DLL"` ; do echo $i; od -tx4 $i | grep -A1 -B1 '8d0a' | grep -A1 -B1 '74'; done
- MONAPI.DLL だった
- MonAPI::MemoryMap::map(unsigned int) の中で書き換わっている
そうか。親スレッドも MemoryMap 使うよね。
判明すればとても簡単というか馬鹿だな。
MemoryMap::map はアトミックである必要があるのか。
ちと冷静に考えよう。どちらが良いかな?。
- Mutex でロック?
- 全てカーネル側でやる?
今回は Mutex でロックしよう。
API 見直しのときに共有メモリのリニアアドレス管理をカーネル側に追い出そう。
→直った。