Esetは数年間、情報セキュリティの実際的な側面に関する会議
-CONFidenceを後援しています。 そして毎年、私たちは貴重な賞品が授与される迅速な解決のために、クラックミーの形でタスクを提供しています。 今年、今年の初めに正式に開設された
ポーランドのオフィスは、非常に独創的な任務を準備しました。 結局、会議はクラクフの故郷で開催されました。

手を試してみたい場合は、登録コード検証アルゴリズムの説明を公開しているので、転がして情報を読まないでください。
こちらから crackmeをダウンロードして
ください 。
昨年のクラックミーの通過については
こちらをご覧
ください 。しかし、私たちの意見では、今年の課題はより興味深いものです。 成功した通過の原則を事前に知らなかったため、コンテスト参加者と同じ条件で合格しました。
正しい登録コードを計算するための技術的基礎は、最も単純なビット操作に基づいて入力されたデータを使用して計算を実行する仮想マシンによって定められました。 この種のコード仮想化は、違法な配布およびコピーに対するソフトウェア保護を構築するために使用されます。 たとえば、プロテクターのVmProtectとThemida(一般に逆解析の最も複雑な保護の1つと考えられている)も、テクノロジを使用して元のプログラムコードをバイトコードに変換します。 このバイトコードは、仮想マシンのハンドラーによって既に実行されています。これは、元のアルゴリズムのロジックの逆解析と復元を複雑にするために大幅に冗長です。
8つの擬似レジスタを自由に使用できる仮想マシンに戻りましょう。条件付きでrA、rB、rC、rD、rE、rF、rG、rHと呼びます。 各レジスタのサイズは1ビットです。 サポートされているコマンドのセットは次のとおりです。
ret-仮想マシンのシャットダウン。
set < register_name
> -レジスタの値を単一の状態に設定します。
jz < register_name > -条件付き制御転送コマンド(レジスタの内容が0の場合、制御転送は次の手順に実行されます(手順は順次メモリに配置されます))。
および <register_name1>、<register_name2> -論理演算。結果は最初のレジスタに保存されます。
mov <register_name1>、<register_name2> -2番目のレジスタの内容を最初のレジスタにコピーします。
mov <register_name、<address> -指定されたアドレスのメモリ(ビット)の内容を指定されたレジスタにコピーします。
mov <address>、<register_name> -指定されたレジスタ(ビット)の内容をメモリ内の指定されたアドレスにコピーします
仮想マシン命令のサイズは固定サイズであり、2バイトです。 命令のエンコードの原理は、次の図のように表すことができます。

この仮想マシンは、メモリ内にある制御シーケンス(検出する必要がある)に従って、メモリの内容を変換します。
メモリの先頭+ 0x00:制御シーケンス(16バイト)メモリの先頭+ 0x10:入力された名前からのハッシュ値(16バイト)メモリの先頭+ 0x20:暗号化されたハッシュ値(16バイト)メモリの先頭+ 0x30:仮想マシン関数の変換結果(16バイト)市販のプロテクターの類似物と比較して、仮想マシンコマンドの処理サイクルはそれほど難しくありません。

仮想マシンによって実行されるコマンドのバイトコードをより便利に分析するために、IDA Pro逆アセンブラー用のプロセッサーモジュールを作成しました。これにより、分析が大幅に簡素化されました。 これは、プロセッサモジュールによって変換される前の一連の命令の外観です。

また、下の図は、プロセッサモジュールによる処理オプションを示しています。

コマンドに名前を付けました。これは、x86アセンブラーで既に知っている類似物に似ています。 しかし、さらなる分析により、コマンドの初期セットの冗長性が示されました。 2を法とする加算演算(排他的OR)は、他のブール演算を使用した同等の計算で表されました。 その後、プロセッサモジュールに最適化を実装することにしました。その後、登録番号を計算する分析コードの量が大幅に削減されました。

これまでのところ、正しい登録番号のジェネレーターのソースコードをアップロードしないことを決定しました。そのため、まだ研究ヒューズがあります。このクラックをご覧ください。
ただし、例としていくつかの正しい組み合わせを示します。
名前: habrahabr
登録コード: 984116e52ad86d6bd144b11b975a595e
名前: SVH
登録コード: 271a300e1174f46f944c5c67dc59dd57
名前:自信
登録コード: 24a2b8dc7c1578de64f8e8e114c2bf00