バグの理由

自作ソフトウェア RozenBiff でバグが出てしまった わけですが^^;(現在は修正パッチ公開済み)コレは見事にはまったといいますかなんというか。

ソフトウェアの内容としては

  • 全てのダイアログを Hook して コントロールのテキスト置き換え

なんですが、ある一定の確率で 意味不明な*1文字列に置き換えるようにしていたのです。

一定の確率ってことで、rand() *2が出てきます。Seed を与えてやらなきゃならんので、Hook DLL をロードするためのアプリケーションで srand()。

これで rand すりゃ適当な値がでてくるぞー!



なんて思ってたのですが、気づいちゃったんですよ。夕飯食べる前に(何



srand で seed を与えるのは良いのですが、そのプロセス空間に seed を与えるだけで、他の hook されたプロセスじゃ srand せずに rand してる状態なんじゃぇねの!? と。

実際、他のプロセスじゃ、ある一定の回数目で確実に文字列が置き換わるという事実に遭遇。 …やっちまった。orz




DLL-Main で srand するって方法も考えたのですが、今回は 各プロセス間で適当な値がでてくる share_rand なるものを作って対処してみました。


いやー、Hook は面白いですけど、「いろんなプロセスでロードされる」という点で結構ワナが待ち構えてますねぇ…

*1:とはいっても、わかる人にはわかる:笑

*2:そんなに室も求めてないのし