カスペルスキーラボv2.0のリバースエンジニアリングテストcrackme

私の以前の分析「カスペルスキーのリバースエンジニアリングテストクラックミー」の続き。 インターネットでカスペルスキーの別の crackme オプションを見つけました。 著者はそれを解決するためにブルートフォースを適用しました。 この粗雑な「クラッカー」メソッドは、ここでは適していません。 ライセンスキー検証アルゴリズムの解析に興味があります。 もちろん、適切なキーを大量に選択してパターンを見つけようとすることもできますが、少し逆にした方が良いように思えます。 それでは始めましょう。 crackmeの先頭は前の記事と同じです。キーには19文字、5番目の各文字は「-」、すべての文字は数字でなければなりません。 興味深いことに移りましょう。 トライアルキーとして1234-5678-9012-3456を使用します。



画像








選択したコードのセクションには、キーブロックをチェックするためのアルゴリズムが含まれています。 詳細に分析します。



000000014000106E | movsx eax,byte ptr ds:[r9] 0000000140001072 | add al,byte ptr ds:[r9+1] 0000000140001076 | add al,byte ptr ds:[r9+2] 000000014000107A | movsx ecx,byte ptr ds:[r9+3] 000000014000107F | add eax,ecx 0000000140001081 | add eax,ecx 0000000140001083 | add eax,ecx
      
      





コードのこのセクションでは、ブロック文字の16進コードをこの順序で合計する操作が実行されます-キーブロックの最初の3文字が追加され(または、16進コード)、最後のブロックシンボルのコードがこの合計に3回追加されます(たとえば、最初のキーブロックが1234の場合、この量は31h + 32h + 33h + 34h + 34h + 34h = 132hのようになり、この数値がバッテリー(RAX)に入力されます。 次はコードの重要な行です。



 0000000140001091 | lea ecx,dword ptr ds:[rcx+rax-150]
      
      





この行は次の操作の結果をECXに保存します:ブロックの最後の文字のコードはRCXに保存され、RAXに保存された値はこのコードに追加されます。覚えているように、前のステップの操作の結果はそこに保存されます。 その後、この量から150hが差し引かれます。 この例では、34h + 132h-150h = 16hのようになります。 次に、この値は次の行でスタックにプッシュされます。



 0000000140001098 | mov dword ptr ds:[rbx-4],ecx
      
      





そして、プログラムはキーの各ブロックでこのような操作を実行し、同時にr10レジスタのデータスタックにプッシュされた結果を合計します。 すべての結果がスタックにプッシュされ、それらの合計がr10レジスタにプッシュされた後、プログラムはr10レジスタの内容を4(shr r10d、2)に分割し、スタックにプッシュされた各値が除算によって得られた結果と等しいかどうかをチェックします。 値が等しい場合、検証がさらに実行され、等しくない場合、プログラムはキーが正しくないと言います。 この分析の結果によると、140001091のアルゴリズムによる計算結果は、各ブロックが互いに等しくなるはずです。 キー1234-1234-1234-1234を試すと、検証はこのステップに合格し、検証の最終段階が始まります。



画像






コードのこのセクションは、キーの後続の各ブロックの文字の配置が、前のブロックの文字の配置と一致しないことを制御します。 行われた結論に従って、キーを生成します。 9870-5781-1872-7503を試してみましょう



画像






画像






いいね!



All Articles