# 暗号化/圧縮アルゴリズム {{#include ../../banners/hacktricks-training.md}} ## アルゴリズムの特定 コードが**シフト右および左、XORおよびいくつかの算術演算**を使用している場合、それは**暗号化アルゴリズム**の実装である可能性が高いです。ここでは、**各ステップを逆にすることなく使用されているアルゴリズムを特定する方法**をいくつか示します。 ### API関数 **CryptDeriveKey** この関数が使用されている場合、第二のパラメータの値を確認することで**使用されているアルゴリズム**を見つけることができます: ![](<../../images/image (156).png>) 可能なアルゴリズムとその割り当てられた値の表をこちらで確認してください: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** 指定されたデータバッファを圧縮および解凍します。 **CryptAcquireContext** [ドキュメント](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta)から: **CryptAcquireContext**関数は、特定の暗号サービスプロバイダー(CSP)内の特定のキーコンテナへのハンドルを取得するために使用されます。**この返されたハンドルは、選択されたCSPを使用するCryptoAPI**関数への呼び出しで使用されます。 **CryptCreateHash** データストリームのハッシュを開始します。この関数が使用されている場合、第二のパラメータの値を確認することで**使用されているアルゴリズム**を見つけることができます: ![](<../../images/image (549).png>) \ 可能なアルゴリズムとその割り当てられた値の表をこちらで確認してください: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### コード定数 時には、特別でユニークな値を使用する必要があるため、アルゴリズムを特定するのが非常に簡単です。 ![](<../../images/image (833).png>) 最初の定数をGoogleで検索すると、次のような結果が得られます: ![](<../../images/image (529).png>) したがって、逆コンパイルされた関数は**sha256計算機**であると推測できます。\ 他の定数を検索すれば、(おそらく)同じ結果が得られます。 ### データ情報 コードに重要な定数がない場合、**.dataセクションから情報を読み込んでいる可能性があります**。\ そのデータにアクセスし、**最初のdwordをグループ化**し、前のセクションで行ったようにGoogleで検索できます: ![](<../../images/image (531).png>) この場合、**0xA56363C6**を検索すると、**AESアルゴリズムのテーブル**に関連していることがわかります。 ## RC4 **(対称暗号)** ### 特徴 3つの主要な部分で構成されています: - **初期化ステージ/**: **0x00から0xFFまでの値のテーブルを作成**します(合計256バイト、0x100)。このテーブルは一般に**置換ボックス**(またはSBox)と呼ばれます。 - **スクランブリングステージ**: 前に作成したテーブルを**ループ**し(0x100回のイテレーションのループ)、各値を**半ランダム**なバイトで修正します。この半ランダムなバイトを作成するために、RC4の**キーが使用されます**。RC4の**キー**は**1バイトから256バイトの長さ**であることができますが、通常は5バイト以上が推奨されます。一般的に、RC4のキーは16バイトの長さです。 - **XORステージ**: 最後に、平文または暗号文は**前に作成された値とXORされます**。暗号化と復号化の関数は同じです。これには、作成された256バイトを必要な回数だけループします。これは通常、逆コンパイルされたコードで**%256(mod 256)**として認識されます。 > [!TIP] > **逆アセンブル/逆コンパイルされたコードでRC4を特定するには、サイズ0x100の2つのループ(キーを使用)を確認し、その後、2つのループで前に作成された256の値と入力データのXORを行うことを確認します。おそらく%256(mod 256)を使用します。** ### **初期化ステージ/置換ボックス:**(カウンタとして使用される256という数字と、256文字の各場所に0が書かれていることに注意) ![](<../../images/image (584).png>) ### **スクランブリングステージ:** ![](<../../images/image (835).png>) ### **XORステージ:** ![](<../../images/image (904).png>) ## **AES (対称暗号)** ### **特徴** - **置換ボックスとルックアップテーブルの使用** - **特定のルックアップテーブルの値**(定数)の使用によりAESを**区別することが可能です**。_注意すべきは、**定数**は**バイナリに保存**されるか、_ _**動的に作成**_される可能性があります。_ - **暗号化キー**は**16で割り切れる**必要があり(通常32B)、通常は16Bの**IV**が使用されます。 ### SBox定数 ![](<../../images/image (208).png>) ## Serpent **(対称暗号)** ### 特徴 - それを使用しているマルウェアはあまり見られませんが、例(Ursnif)があります。 - アルゴリズムがSerpentかどうかは、その長さ(非常に長い関数)に基づいて簡単に判断できます。 ### 特定 次の画像では、定数**0x9E3779B9**が使用されていることに注意してください(この定数は**TEA**(Tiny Encryption Algorithm)などの他の暗号アルゴリズムでも使用されています)。\ また、**ループのサイズ**(**132**)と**逆アセンブル**命令および**コード**例における**XOR操作の数**にも注意してください: ![](<../../images/image (547).png>) 前述のように、このコードは、内部に**ジャンプ**がないため、任意の逆コンパイラ内で**非常に長い関数**として視覚化できます。逆コンパイルされたコードは次のようになります: ![](<../../images/image (513).png>) したがって、**マジックナンバー**と**初期XOR**を確認し、**非常に長い関数**を見て、**長い関数のいくつかの命令を実装**(左に7シフトし、22に左回転する)と**比較する**ことで、このアルゴリズムを特定することが可能です。 ## RSA **(非対称暗号)** ### 特徴 - 対称アルゴリズムよりも複雑です。 - 定数はありません!(カスタム実装は特定が難しい) - KANAL(暗号アナライザー)はRSAに関するヒントを示すことができず、定数に依存しています。 ### 比較による特定 ![](<../../images/image (1113).png>) - 行11(左)には`+7) >> 3`があり、行35(右)と同じです:`+7) / 8` - 行12(左)は`modulus_len < 0x040`を確認しており、行36(右)は`inputLen+11 > modulusLen`を確認しています。 ## MD5 & SHA(ハッシュ) ### 特徴 - 3つの関数:Init、Update、Final - 初期化関数が似ています。 ### 特定 **Init** 定数を確認することで両方を特定できます。sha_initにはMD5にはない1つの定数があります: ![](<../../images/image (406).png>) **MD5 Transform** より多くの定数の使用に注意してください。 ![](<../../images/image (253) (1) (1).png>) ## CRC(ハッシュ) - より小さく、データの偶発的な変更を見つけるために効率的です。 - ルックアップテーブルを使用します(したがって、定数を特定できます)。 ### 特定 **ルックアップテーブルの定数**を確認してください: ![](<../../images/image (508).png>) CRCハッシュアルゴリズムは次のようになります: ![](<../../images/image (391).png>) ## APLib(圧縮) ### 特徴 - 認識可能な定数はありません。 - アルゴリズムをPythonで書いて、オンラインで類似のものを検索することを試みることができます。 ### 特定 グラフはかなり大きいです: ![](<../../images/image (207) (2) (1).png>) 特定するために**3つの比較**を確認してください: ![](<../../images/image (430).png>) {{#include ../../banners/hacktricks-training.md}}