第7章 UPX のアンパック方法
前へ 戻る
今回は番外編と言うことでUPXのアンパック方法についてセオリー的に御紹介ですw
○UPXとは?
"UPX"とは、"The Ultimate Packer for
eXecutables"の略で、実行ファイルを圧縮するためのツールです。フリーウェア(唯一?)でVectorやらからDLできます。UPXでパックされた物は通常UPXでアンパックできるのですが、たまにできないものがあります。オープンソースなのでソースをいじったか、パッキング後にいじった物なんでしょうが・・・w
○Unpackって?
実行ファイルを実行できるままの形で圧縮することをPackingと言います(見た目にはサイズが小さくなるだけで変化無し)。Unpackは文字通り、この逆の解凍をすることです。ただ、Packingは実行ファイルの軽量化よりも、プロテクトとしての意味合いでかけられることが多いです(最近はいちいちHDD気にするほどのサイズにはならないから)。その際に、デバッガの検知やらチェックサムやらが付加されたりすることもあります。
と、与太話はさて置いて実践に移りましょう〜
☆手順☆
OEP探して、メモリイメージをダンプして、IAT再構築して終わりです。しかもメモリイメージのダンプとIAT再構築は基本的にソフトでやってもらえちゃう(感謝!!)ので実際にやるのはOEP探しのみです。
※OEPって?
Original Entry Pointの略です。名の示すとおり、Packされる前のEntry
Pointです。探すのには勘が必要?w パッカーはオリジナルのコードを圧縮し、圧縮されたコードをメモリ上に展開するためのコードを付加して、Entry
Pointを展開ルーチンの前に変更するってことをしてます。従って、オリジナルのコードがメモリ上に展開されるのでそれを利用しちゃおうってことですw
☆必要なもの:一応Toolsに置いてあります。☆
1)OllyDbg
2)OllyDump
3)Import REConstructor
※準備:OllyDumpはOllyDbgのプラグインなのでOllyDump.dllをOllyDbgのフォルダに入れておく。
別に自分で用意してもらっても結構ですw
00406420 > $ 60
PUSHAD
;
EntryPoint
00406421 . BE 00604000 MOV
ESI,upx.00406000
00406426 . 8DBE 00B0FFFF LEA EDI,DWORD PTR
DS:[ESI+FFFFB000]
0040642C . 57 PUSH
EDI
0040642D . 83CD FF OR
EBP,FFFFFFFF
00406430 . EB 10
JMP SHORT upx.00406442
☆OEPの探し方☆
Entry
Pointで「検索→コマンドで、全ブロックのチェックをはずしてPOPADで検索」
すると以下に飛ぶはず(UPXの定石)。
0040656E > 61
POPAD
0040656F .-E9 8CAAFFFF JMP upx.00401000 ; OEPにジャンプ(BPセット)
401000にジャンプしようとしてます。いかにもOEPっぽい数字ですねw
40656FにBPをセットしてF9でここまで実行させて下さい。さらにF8でOEPにジャンプします。
00401000 6A 00
PUSH 0
; OEP
00401002 E8 75020000 CALL
upx.0040127C
; JMP to kernel32.GetModuleHandleA
00401007 A3 00304000 MOV DWORD PTR
DS:[403000],EAX
0040100C 6A 00
PUSH 0
0040100E 68 29104000 PUSH
upx.00401029
00401013 6A 00
PUSH 0
00401015 6A 01
PUSH 1
00401000に着たら、プラグイン → OllyDump →
Dump Debugged ProcessでModifyにOEPのオフセットアドレス(1000)が入っていることを確認。基本的にアンパック後はいじることが多いのでBase of
Codeを1000に変更します。ついでにRebuild
Importのチェックをはずします。Dumpで保存先を聞かれるので適当なファイル名(dumped.exeなど)にして保存します。
次にIAT再構築と言うことでImport REConstructorを起動します。起動前に対象のプロセスを起動させておく必要があります。なので、ダンプ後もOllyを終了させないか、いったん終了させてPackされた対象のexeを起動させておきましょう〜。
Attach
to an Active Processで実行中のモジュールを選択し、OEPにOEPのオフセットアドレス(1000)を入力してからIAT AoutSearchをクリック。するとRVAなどの項目が埋まってFound
Something!のメッセージボックスが出るのでGet Importsをクリック。Fix Dumpで先ほどダンプしたファイル(dumped.exe)を選択します。すると、アンパックされた実行ファイル(dumped_.exe)が自動で保存されます。
お〜終了!と言うことですが、UPXだとRebuild
Importのチェックをはずさずにダンプすればそのままアンパックされたexeになるっぽいです。とは言え、不完全とか何とかと言う話なので一応w それにPackerはUPXだけじゃないですしねw
今回はPEやらIATやらと言った話には全く触れていませんw とは言えUPXくらいならこれだけでもアンパックできるようになるはず・・・。
実際に使われている例(UPXだけどUPXでアンパックできない)としては、Vectorのゲームが多い気がします。
サンプルプログラムの著作権とかは面倒なので放棄してます。好きに使ってもらって構いません。