toolを活用したマニュアルアンパック

マニュアルアンパックのやり方

マニュアルアンパックは以下の手順。

1.OEPを探す

2.OEPなうでダンプする

3.IATを再構築する

久々に実施したら、つまずいた箇所が多かったので、備忘録的に、残しておきます。

0.事前準備

ここからollyのディレクトリに、プラグインOllyDumpをおいておく。

Import RECを入手しておく。

適用なPEをUPXでパックする。

1.OEPを探す

まずは、ollyでアタッチ。

OEPの探すのだが、UPX等簡単なパッカーは展開ルーチンの先頭で、pushad命令を実行し、最後にpopadする。

そのpopadを探せばよい。

見極めるコツは以下

・popad の後の00 00 00 00を探す

・jump命令が2つある

→そのうちひとつは痕跡を消す書き換えのコード

→もう一つがアンパック後のコードのjump先

このjump命令にブレイクを仕掛け、ステップイン実行後、OEPに行き着く。

他には、ダミーコードを考慮しなくてよいのなら、IDAで見れば、最後のjump命令がなんとなく判ったりする。

2.OEPなうでダンプする

olly標準のメモリマップからダンプしてコピーしても良いけど、ルーチンワークなので、toolにアシスタントしてもらおう。

プラグインからollydumpを起動する。

OEPの値がずれていない事を確認する。

ちなみに、黄色で塗った”Rebuild Import”のチェックを入れたままセーブすると、IATの再構築も行ってくれるのだが、信頼性が無いとの噂。

そのため、チェックを外して、Dumpする。

3.IATを再構築する

過去に手で実施したことがあるが、大変だった。

ImportRecがおらおら修正してくれるらしいので、使ってみた。

なお、ollyを終了してはいけない。

ImportRecが立ち上がったらOllyでアタッチしているプロセスを選択する。

後は、上図に従い保存。

最後にImportRec修正前後のdump.exeを簡易的に比較する。

成功している様子。sectionでみても属性変更する必要もない。

他のtoolだと、スペシャルねこまんま57号が良さそうだった。

 

他のOEPの探し方

UPXだからすんなり行けたけど、オリジナルパックされていた場合、こんな簡単では、無いはず。

少なくともpopadからのjmp以外の手法を抑えておきたい。

pushadでスタックに確保した、espにブレイクポイントをはれば、対応するpopadで停止するハズ。

espに移動し、ブレイクポイントをはると怒られ、実行しても上手く行かなかった。

メモリーにブレイクポイントを張るに時にハードウェアブレイクポイントを使うみたい。

メモリーブレイクポイントって命名して欲しい・・

右クリック、ブレイクポイントからなんと”メモリー書き込み”たるブレイクポイントを発見!

気になって、翻訳される前のollyを見てみると”メモリー”のところが”Hardware”だった・・

ん〜・・・

 

で、F9実行

0x42E973で止まると思いきや、少し手前にストップ・・

多分少し前にブレイクポイントを貼った箇所に止まったんだろうと思い、もう一度F9押したいが、アクセス違反で動かなくなっている。

なるほど、これがハードウェアブレイクか。

停止箇所より少んだところからもう一度ハードウェアブレイクしかける作業をすれば、ドンピシャでたどりつ・・

↑なぜか、ハードウェアブレイクポイントで止まらずプロセスが終了してしまった。

ただ、パック処理の終盤で止まったた??????め、popadを特定するには有効・・なのかも。

ちなみにOEPにjmpするまえ直前のespはpushad実行直前のespと等しかったのも、切り分け方法の一つになる???