クラック対策を考える その2
世の中のシェアウェア
どうも軟弱なものが多すぎます.
逆アセンブラと簡単なデバッガ(例えばVC)
で簡単に制限が外せるものが多すぎます.
一般的なクラック方法は「登録済みかどうかを判断している分岐点を潰す」です.verupの度にクラックし直さなくてはならない,等の欠点があるのでパス解析までするべきですが,一般的なsofticeベースの解析erではそこまでやる人はそんなに多くないでしょう.
ここでは,どうしたらクラックされにくいのか?を考えていきます.
かくいう僕も昔シェアウェアを作りましたが,あっけなくクラックされパスワードが流出した覚えがあります.ということで今回はクラック対策を考えてみます.
暗号化
通常ユーザ登録失敗ダイアログなどから逆に辿って,潰すべき判定地点を見つけ,そこを書き換える場合が多いです.解析されて実行ファイルを書き換えて初めてクラック完了となります.
そこで,実行ファイル全体,もしくはそのレジスト関係の重要な部分だけを暗号化して必要に応じて展開します.
これならexeを書き換えようにも,どこをどのように書き換えればよいかを解析しなくてはなりません.
けど,そんなの面倒くさいや,という人に
お勧めなのが実行可能なまま圧縮してくれるUPXです.こいつで圧縮しておけば単純な書き換えは絶望的といえるでしょう.
さらにImport/Resource等粗方の解析の目印を隠蔽してしまうのもUPXの強いところです.
「いや,けどさー.UPXで圧縮したファイルって復元できるじゃん.」
という声も聞こえてきそうですが,UPXで圧縮されたファイルの末尾の方に展開時に使用されるデータ(元ファイルのセクションテーブル)
があるので,そこを出鱈目な値にしておけば,無事元に戻ったように見せかけて実は実行できないファイルできます.
ただこの方法はUPXを改造しないと辛いです(幸いソース公開なのでなんとでもなる)
.
ちなみにヘッダらしき部分を弄ってもUPXはちゃんと展開してくれます.というのも展開コードをUPXの目印にしてるためです.
やなりベストは独自EXEパッカーを作ることでしょうね.
ここまでやっても展開後にパッチを当てるようなコードを付け足されたりすれば,簡単に攻略されてしまうでしょう.
ということで,ファイル全体のCRCチェックをした方が気休めになるかもしれません.
とにかく,「全体をパッキング」もしくは「重要な部分は必要に応じて展開して実行」すれば解析は結構面倒になると思いますが.
CRCチェックでも,チェック部が暗号化されていれば警告ダイアログから変数はばれますが,そこに書き込んでいるチェック部は分かりにくいでしょう...そこにブレークポイント張られると辛いけど(^^;;
ユーザ名とパスワード
ユーザ名からパスワードを生成,その逆,といった事は露骨にやらない方が良いでしょう.
ユーザ名とパスワードをある関数に入れて0になったらOKとか,そういった方法が良いと思われます.但し,その逆関数(逆じゃないけど,ユーザ名と0からパスワードのような形)
は簡単には求められないものにする必要があります.って,それって難しいよな...
で,それでもその0かチェックしてる部分を潰されたら終わりなので,パスワードをある関数に通すと一定の値を得るような形にしておき,その値をどこかの計算で使うとか.
反則ぽい技
デバッガを使わせない!ということで,デバッグレジスタを弄る.
その時点で反則ですが,デバッグレジスタを書き換えるためにはRing 0に移行する必要があるので,最早一般アプリケーション失格.
int 3で重要なコードをcallするようにすれば凶悪度アップ.
ブレークポイント仕掛けて,引っ掛ったところを自己書き換えで本当のコードを置くとか.
どうせRing 0へ移行するのだから,他にも割り込みベクタなどを書き換えるのも楽しいかもしれません.
そこまでやれば,シェアウェアというよりウイルスですな.