![画像](https://habrastorage.org/getpro/habr/post_images/86f/4a8/d1d/86f4a8d1d562972a5ec6d0fd845d177b.jpg)
選択したコードのセクションには、キーブロックをチェックするためのアルゴリズムが含まれています。 詳細に分析します。
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を試すと、検証はこのステップに合格し、検証の最終段階が始まります。
![画像](https://habrastorage.org/getpro/habr/post_images/915/ea4/2c9/915ea42c965c88971717002835441dd5.jpg)
コードのこのセクションは、キーの後続の各ブロックの文字の配置が、前のブロックの文字の配置と一致しないことを制御します。 行われた結論に従って、キーを生成します。 9870-5781-1872-7503を試してみましょう
![画像](https://habrastorage.org/getpro/habr/post_images/71d/6b2/f4b/71d6b2f4b2da041eaa154fd46e33604b.jpg)
![画像](https://habrastorage.org/getpro/habr/post_images/e61/f04/e71/e61f04e718146dcaf9c17cc10758c19c.jpg)
いいね!