第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

40656FBPをセットしてF9でここまで実行させて下さい。さらにF8OEPにジャンプします。

 

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 ProcessModifyOEPのオフセットアドレス(1000)が入っていることを確認。基本的にアンパック後はいじることが多いのでBase of Code1000に変更します。ついでにRebuild Importのチェックをはずします。Dumpで保存先を聞かれるので適当なファイル名(dumped.exeなど)にして保存します。

 次にIAT再構築と言うことでImport REConstructorを起動します。起動前に対象のプロセスを起動させておく必要があります。なので、ダンプ後もOllyを終了させないか、いったん終了させてPackされた対象のexeを起動させておきましょう〜。

 Attach to an Active Processで実行中のモジュールを選択し、OEPOEPのオフセットアドレス(1000)を入力してからIAT AoutSearchをクリック。するとRVAなどの項目が埋まってFound Something!のメッセージボックスが出るのでGet Importsをクリック。Fix Dumpで先ほどダンプしたファイル(dumped.exe)を選択します。すると、アンパックされた実行ファイル(dumped_.exe)が自動で保存されます。

 

 お〜終了!と言うことですが、UPXだとRebuild Importのチェックをはずさずにダンプすればそのままアンパックされたexeになるっぽいです。とは言え、不完全とか何とかと言う話なので一応w それにPackerUPXだけじゃないですしねw

 

 今回はPEやらIATやらと言った話には全く触れていませんw とは言えUPXくらいならこれだけでもアンパックできるようになるはず・・・。

 実際に使われている例(UPXだけどUPXでアンパックできない)としては、Vectorのゲームが多い気がします。


サンプルプログラムの著作権とかは面倒なので放棄してます。好きに使ってもらって構いません。


 

前へ  戻る