リバースエンジニアリングドングル保護されたソフトウェア
私は若い頃、インターネットが始まったばかりで、無料でたくさんのソフトウェ そこに誰かがクラック/パッチを適用するのに十分な”親切”だったので、それは無料でした。exeファイル。
私は引用符の間に”親切”を入れました。 今、私はソフトウェアエンジニアであり、ソフトウェアを構築するためにどれくらいの努力が必要かを知っています。 だから、割れたソフトウェアをダウンロードしないでください。 開発者をサポートし、ライセンスを購入!
そのような亀裂を適用し、exeにパッチを適用すると、私はいつもそのようなことをする方法を知りたかった。 それはあなたがアセンブラを理解する必要があることが判明しました、あなたのCPUだけが理解する機械語(そしてそこにいる他のオタク)。 それはあまりにも困難だったので、私はそれを学ぶことに周りを得たことはありません。 最近まで(20年後のように)。
一年前、私はソフトウェアを購入しました(ライセンス付き!)それは動作するようにUSBドングルを必要とします。 それはすべての時間であなたとそのドングルを持っていることは本当に面倒です。 特にあなたが道路にいるとき。 だから私はそれの周りの方法を探しました。 私が最初に出会ったのは、MultiKeyと呼ばれるこのキーエミュレータでした。 それはあなたのレジストリにドングルのメモリをダンプし、あなたのレジストリから読み取ることによって、あなたのドングルをエミュレートします。 それは私がWindows10でそれを実行したいと思うまで、うまくいきました。 どうやら、MicrosoftはMultiKeyのような大ファンではありません。 実際には、署名されていないドライバの大ファンではなく、MultiKeyは署名されていないドライバを使用します。 だから私は別の解決策が必要でした。 アセンブリコードと呼ばれるものに飛び込むための時間!
私はいつもidaと呼ばれるリバースエンジニアリングのためのツールがあることを知っていました。 それはあなたを逆コンパイルすることができます。exeファイルと何が起こっているかを示しています。 残念ながら、インターフェイスは理解するのが本当に難しいです。 私もOllyDbgについて知っていました。 それはデバッガです。 デバッガを使用すると、プログラムの実行中にアセンブラコードをステップ実行できます! たとえば、電卓アプリケーションをデバッグする場合、実際にボタンを押して計算を行い、結果を画面に表示することができます。 地獄、あなたもpauzeと2+2が何であるかを尋ねるときに電卓が5を返すようにそのメモリを変更することができます!
しかし、私は微積分を変えるためにここにいるわけではありません(それはクールですが)。 私はドングルの自由になりたい。 だから私はOllyDbgで私のアプリを開いた。
それは本当に圧倒されました。 私はこれらのコードが何を意味するのか分かりませんでした。 どこから始めればいいのかはおろか。 だから私は製図板に戻りました。 それはRetDecと呼ばれるものがあり、Cコードをマシンコードから取り除こうとする逆コンパイラがあることが判明しました。 それをセットアップして逆コンパイルを実行するのに時間がかかりましたが、努力が払われました。 結果は巨大だった。cファイル、半読み取り可能なコードを持つ2万行以上のコード。
実際には、ドングルのバイトを読み取るコードはかなり簡単に見つけることができました:
この情報で、私はデバッガに戻りました。 その間、私はOllyDbgが(2000年から)本当に古く、2013年以来更新されていないことを知りました。 だから私はx64dbgと呼ばれるこの新しい、改良されたデバッガを見つけました。 それはオープンソースであり、それに取り組んでいる開発者の大きなコミュニティを持っています。
機械語を読む
機械語では、すべての命令にメモリアドレスがあります。 だからRetDecコードで見つかったアドレスで、私はx64dbgになって、見よ、ドングルを読み取るコード:
アセンブリコードでは、関数の引数はスタックポインタespを使用してメモリにロードされます。 私たちのコードでは、これは関数の呼び出しの直前に発生します。 (3つのmov命令は、呼び出しが3つの引数を取ることを示しています)。 呼び出しの後、スタックポインタがリセットされ、関数の呼び出しが成功した場合にチェック(テスト)が行われます。 そうでない場合は、コードがジャンプ(jne)を作成しているのがわかります。 このジャンプは、ドングルが存在しないことを示すコードの一部を指します。
ご覧のように、ドングルを読み取るための特定の関数への呼び出しがあります。 私はこの関数が何をするのかを調べるためにリファレンスガイドを調べました:
この関数は、ドングルから2バイトのメモリ(ワード)を読み取ります。 推測されているように、この関数は3つの引数を取り、最後の引数はドングルからのデータを含む2バイトへのポインタです。
アセンブリコードでは、引数は逆の順序でロードされます。 最後の引数を渡すのはこれです:
最後の引数はesiを指し、ドングルからのデータがesiが指しているメモリアドレスに格納されることを意味します。
実際、呼び出しが行われた直後に一時停止すると、結果がメモリに表示されます:
0×74 これは、ドングルから読み出され、メインプログラムのメモリに格納されているものです。この呼び出しをスキップするには、esiが指しているメモリに0x74を書き込むだけです。 これは、上記の7行を次のように置き換えるのと同じくらい簡単です:
ご覧のとおり、関数の呼び出しが有効であるかどうかのテストを含む、残りのアセンブラ命令もnop-edしました。 これはジャンプが取られないし、プログラムwilは点検なしで働き続けることを意味する。
ドングルを含むすべての通話にパッチを適用した後、新しいものを保存しました。exe”を起動します。 私はドングルを引き出し、私のカスタムを実行しました。exeと私自身の驚きにそれは働いた! 私は正常にソフトウェアの一部を割れていた。
私は私のバケットリストのクロスもう一つのこと¶
Ps:物事のほとんどは、0x74とアプリの名前のように、難読化されました。 これは、どのような方法でこのソフトウェアを作成した勤勉な開発者に害を与えることではありません。 また、私はドングルがバイトのみを返し、それ自体で暗号化をしなかったことは非常に幸運でした。