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 が常に安定しているか見てみる。→安定している。

  1. mapファイルに一致するアドレスが無い
  2. 命令列 dump
    1. 8d0a74a0 f089f465 5d5f5e5b 676a50c3 3558868
  3. for i in `find -name "*.DLL"` ; do echo $i; od -tx4 $i | grep -A1 -B1 '8d0a' | grep -A1 -B1 '74'; done
  4. MONAPI.DLL だった
  5. MonAPI::MemoryMap::map(unsigned int) の中で書き換わっている

そうか。親スレッドも MemoryMap 使うよね。
判明すればとても簡単というか馬鹿だな。
MemoryMap::map はアトミックである必要があるのか。


ちと冷静に考えよう。どちらが良いかな?。

今回は Mutex でロックしよう。
API 見直しのときに共有メモリのリニアアドレス管理をカーネル側に追い出そう。

→直った。