Windowsダンプ解析に必要な知識

久々の良書。
最近は技術資料は専らWeb上で探して、見て、完結しちゃう事がほとんどだけど久々に本を買う気になった。技術書を買ったのなんか10年ぶりくらい??


Windowsダンプの極意 エラーが発生したら、まずダンプ解析!

Windowsダンプの極意 エラーが発生したら、まずダンプ解析!


ダンプ解析に必要な知識やノウハウをこれでもかと平易な言葉で説明してくれている。知識として脳内にはあってもこういうノウハウとか下手したら「勘」「感覚」の部類に入るような内容を文字の形にして伝達するのって実はすごく難しい。それを見事にやってのけた筆者は素直に尊敬したい。


ただ…初版ゆえの宿命なのか、誤字や間違いが散見される。
半分くらいまで読了した中で一番ひどかったのがバッファオーバーランの説明(「第6章 6.8 簡単に破壊が可能」)。セキュリティに絡むところだし、よーし、パパはりきって粗探ししちゃうぞ★と意気込んで読み始めたところ、、、

うぉぉぉぉぉぉぉぉい
いきなりこれかよ。

 指定した数だけ同じ変数を作ることを配列変数と呼びます。作り方は簡単で、整数型の配列変数を作る場合はint a[4]とするだけで5個(0から始まるので5個です)の配列変数が作られます。使い方はa[4] = 0とするとa[4]のところに0が入り、s[2]=5とすればそこに5の数字が入ります。

int a[4]とするだけで5個の配列(0から始まるので5個です)の配列変数が作られます。ってどんな言語だよ!少なくともC言語では、ないよ?*1

 領域はローカル変数と同じくスタック上に並んで作られています。たとえば上記のように5個の配列変数を作るとします。たいていはカウンタを作ってループで回して配列変数を使ったりするのですが、カウンタの誤りでそこに6個の値を入れてしまうとします。本当はいけないのですが、実はこれができてしまうのです。

いやいやいや。a[4] = 0の時点で既にスタックは破壊されてるんですけど…。


C言語の細かいことは知らなくてもダンプ解析には影響ないらしい。(本当にそうかなぁ?)


他にはp.111の条件分岐の説明では


test eax,eax
je 分岐先アドレス
 このような命令があるとします。まずeaxどうしで論理積を取り、jeで分岐します。jeとはその名の通り「ジャンプイコール」です。ここは分岐すると思いませんか? しかし、実はeaxにどんな値が入っているかによって分岐しない場合があるのです。これはjeがどのフラグレジスタを見て判定するかがポイントになります。EFLの各フラグの中を見ても「結果が同じだったかどうか」などというフラグはどこにもありません。実はjeが見ているのは、ZF(ゼロフラグ)だけで、1だった場合のみ分岐しているのです(jzという条件分岐もあるのですが、こちらは確かにゼロなら分岐で、どう違うのか筆者にもよく分からないのですが……)。

jeとjzの違いがわからなくてもダンプ解析のエキスパートになれてしまうものなのか…。ちなみにjeとjzは全く同じものだよ。jeは直前の演算(特に比較演算)の意味に着目したニーモニックであり、jzはコンテキストに関係なくその時ZFが1かどうかという事実だけに着目したニーモニック*2であって、ニーモニックの違いでしかなく、機械語コードはもちろん、得られる結果(ZF=1の時ジャンプ)は全く同じである。*3


曲がりなりにも本として出版するのであれば「よくわからないのですが……」は無責任すぎるでしょ。執筆者がわからないものをどうして読者が理解できようか。


全部読み終わったら正誤表作ってみようかな。
全般としてはすばらしい内容だと思うのでこういうつまらないところでケチが付くのは残念だと思う。2版に期待? というかOSでもソフトでも本でも言えるけど、初版(unstable)に飛びつく人ってやはり負け組なんですかねぇ。orz

*1:Option Base 0宣言したVBならDim a(4)は添字0〜4の5個の配列になるけどね

*2:「ゼロなら分岐」というより、「ゼロフラグが立っていれば分岐」と理解した方がより正確で間違いがない

*3:Z80からx86に流れてきた人にはjzの方がおなじみなんだけどね。Z80ニーモニックではjzが使われjeは使われない。x86ワールドだとソースコードでjzと書いてもアセンブルは通るけど逆アセンブラはjeでしか表示してくれないもんだから最初はわかりにくくて苦労したなぁ…。jzの方が直感的に分かりやすいので個人的にはこちらの方が好き。