ハッカーはどのようにPhotoshopなどをクラックする?
- 2024-09-07
ハッカーはあらゆるソフトを攻略できるのか?
新しいソフトをダウンロードしたら、使う前に課金を求められた経験はありませんか? 誰もが経験する、その「課金の壁」を前に、怪しげなインターネットの世界に足を踏み入れたくなった人もいるかもしれません。
でも、こうしたアクティベーションの仕組みはどうやって機能しているのか、そしてハッカーやクラッカーと呼ばれる人たちは、どうやってそれを突破するのか、疑問に思ったことはありませんか?
プログラムの言語とコンピュータの言語
プログラムは、C++、Java、Python などの言語で書かれています。これらの言語は人間にとっては非常にわかりやすいのですが、コンピュータにとっては全く意味不明なものです。このコミュニケーションのギャップを埋めるために、コードはマシンコードと呼ばれる、コンピュータが理解できる 0 と 1 の羅列に変換されます。この変換プロセスをコンパイルと呼びます。
マシンコードは、アセンブリ言語という、少しだけ見やすくした形で表示することもできます。アセンブリ言語はハードウェアに近い言語なので、「move ebx, 23」(EBX レジスタに 23 を入れる)のように、暗号のような命令を扱うことになります。
ソフトウェアのアクティベーションチェック
ソフトウェアのアクティベーションチェックには、大きく分けてオンラインとオフラインの 2 つの種類があります。
オンラインチェックは、インターネット上のサーバーと通信して、ユーザーの所有権を確認します。ユーザーが入力したキーと、そのマシン固有の識別子がサーバーに送信され、サーバーはデータベースでキーが有効かどうかを確認し、有効であればソフトウェアがアクティベートされます。
一方、オフラインチェックは、ソフトウェア自体に組み込まれたアルゴリズムを使用して、キーを検証します。ユーザーがアクティベーションキーを入力すると、アルゴリズムはそのキーを内部ルールと照合します。これらのアルゴリズムは、単純なパターンチェックから、暗号化などを駆使した非常に複雑なものまで、さまざまです。
クラッカーの登場
クラッカーは、こうしたアクティベーションの仕組みを回避することを使命としています。彼らは、リバースエンジニアリングと呼ばれる手法を用いて、ソフトウェアを分解し、その仕組みを解明します。
リバースエンジニアリングには、逆アセンブラやデバッガなどのツールが使用されます。逆アセンブラはマシンコードをアセンブリ言語に戻すことで、少しだけ読みやすくします。デバッガは、クラッカーがソフトウェアをステップ実行したり、任意の場所で一時停止したりして、内部で何が起こっているのかを確認できるようにします。
クラッカーは、まずアクティベーションコードを探し出すことから始めます。「Invalid Key」(無効なキー)や「Activation Required」(アクティベーションが必要です)などの文字列を手がかりに探していきます。コードを見つけたら、次はその仕組みを分析します。特定のバイトのチェック、チェックサムの計算、データの復号などを行う場合があります。
アクティベーションプロセスを理解したら、次はそれを回避するためにコードを改変します。重要な命令を「NOP」(何もしない命令)に置き換えたり、条件分岐を変更してプログラムの流れを変えたりします。
コードを改変したら、クラッカーは修正版の実行可能ファイルを作成し、多くの場合、元のインストーラと一緒に配布します。ユーザーは、元の実行可能ファイルを修正版に置き換えることで、無料で(違法ではありますが)ソフトウェアを使用できるようになります。
開発者側の対策
しかし、ソフトウェア開発者もただ指をくわえて見ているわけではありません。リバースエンジニアリングを困難にするために、さまざまな対策を講じています。
コード難読化は、コードをスパゲッティのように複雑に見せることで、リバースエンジニアリングを困難にします。
具体的な例
例えば、「PrideCrackMe」という、C/C++ で書かれた 32 ビットプログラムを例に説明します。このプログラムは、「x32dbg」というデバッガを使用して解析することができます。
プログラムを実行すると、名前とシリアルキーの入力を求められます。ランダムなシリアルキーを入力すると、「False Serial Key」(無効なシリアルキー)と表示されてプログラムが終了します。
プログラムは、「msvcrt.dll」というシステム DLL の関数を呼び出してシリアルキーのチェックを行っていることがわかりました。x32dbg でこの関数を調べると、ユーザーが入力した値と、プログラムに保存されている値を比較している命令が見つかります。
この比較をパスするようにプログラムを改変する必要があります。比較が行われた後に実行されるジャンプ命令にブレークポイントを設定し、プログラムを再実行します。ブレークポイントでプログラムが停止したら、比較されている 2 つの値を確認します。
ユーザーが入力した値は「123456」で、プログラムに保存されている値は、入力した名前の長さと、いくつかの演算によって計算された値であることがわかりました。
Python を使用して、この計算を再現することができます。名前の長さが 5 の場合、プログラムに保存されている値は「0x3D840F」になります。
name_length = 5
stored_value = (name_length + 0xCA) ^ 0x3D840F
print(hex(stored_value)) # 出力: 0x3d840f
この値をシリアルキーとして入力すると、プログラムは正常にアクティベートされます。
最後に
ソフトウェアのアクティベーションを回避する技術の裏には、驚くべき技術と創意工夫があります。しかし、クラックされたソフトウェアの使用は違法であり、リスクを伴います。法的な consequences に直面する可能性があるだけでなく、マルウェアなどの望ましくない「おまけ」が付いてくることもよくあります。さらに、サポートやアップデートを受けられなくなるため、バグやセキュリティ上の脆弱性に対して脆弱なままになってしまいます。
ソフトウェアのアクティベーションを回避する技術は非常に興味深いものですが、法を遵守し、安全を確保するためにも、正規のソフトウェアを使用することをお勧めします。