では、新しいスレッドの追跡に移りたいと思います。 新しいスレッドの呼び出し先のアドレスは0x00413C10だとわかっているので、IDA Viewの画面で「Jump to Address …」を用いてジャンプします。 そして、0x00413C10を選択して「Analyze selected area」をしてパースします。・・・が、メニューには「Analyze selected area」が出てきません(【図60】参照)。これは何故でしょうか?
【図60】「Analyze selected area」がメニューに表示されない
IDA Proを起動し、「マルウェアの表層解析」でセグメントテーブルを確認しましたが、0x00413C10の領域は、.data領域に含まれるのです(【図6】参照)。領域としては、ReadとWriteとなっており、実行領域として認識されていません。実際には、「仮想メモリ内のWindows API使用フロー」の【表1】にある、VirtualProtectで0x00401000からサイズ0x00012D21分、つまり0x00401000~0x00413D21の間はPAGE_EXECUTE_READに変えられています。ただ、これはIDA Proのデバッガにまでは反映されていないのです。
そこで、セグメントテーブルのプロパティを書き換えます。「View」→「Open subviews」→「Segments」を選択し、「Program Segmentation」を表示します。そして、「.data」を選択し、右クリックでポップアップメニューを表示して「Edit segment …」をクリックしてダイアログを表示します(【図61】参照)。
【図61】セグメントの属性情報編集ダイアログの表示
マルウェアの実際の状態に合わせるには、【表1】にあるVirtualProtectと同じになるようEditやAddを駆使すべきでしょう。ただし、今回はコードをまず追ってみたいため、簡易な対処として、当該部分のSegment classをCODEとし、Executeにチェックを入れるだけとします。追跡するうちに不都合が発生したら、改めて正規の形に編集するようにしましょう(【図62】参照)。
【図62】セグメントの属性情報編集ダイアログの編集
IDA Viewの画面に戻り、0x00413C10の範囲を選択して右クリックをすると、今度は「Analyze selected area」がメニューに表示されました(【図63】参照)。これをAnalyzeすると、実行コードの解析が行われます(【図64】参照)。ここにブレークポイントを設定し、「Continue process」で処理を継続してこのポイントまで到達して、解析を続けることになります。
【図63】「Analyze selected area」がメニューに追加された
【図64】「Analyze selected area」の結果
なお、このプログラムはCreateThreadを行っているため、ブレークのタイミングによっては複数スレッドが存在している場合があります。この場合、どちらのスレッドを実行させるか、という制御を行うケースがあると思います。こういった場合は、「Threads」で当該スレッドを右クリックしてポップアップメニューを表示し、「Suspend thread」と「Resume thread」を切り替えて制御することができます(【図65参照】)。
< 展開されたプログラムの行き先 | 目 次 | 再展開されたプログラムのImportテーブル > |