# 暗号化/圧縮アルゴリズム {{#include ../../banners/hacktricks-training.md}} ## アルゴリズムの特定 コードが**シフト右および左、XORおよびいくつかの算術演算**を使用している場合、それは**暗号化アルゴリズム**の実装である可能性が高いです。ここでは、**各ステップを逆にすることなく使用されているアルゴリズムを特定する方法**をいくつか示します。 ### API関数 **CryptDeriveKey** この関数が使用されている場合、第二パラメータの値を確認することで**使用されているアルゴリズム**を特定できます: ![](<../../images/image (375) (1) (1) (1) (1).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 (376).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 (370).png>) 最初の定数をGoogleで検索すると、次のような結果が得られます: ![](<../../images/image (371).png>) したがって、逆コンパイルされた関数は**sha256計算機**であると推測できます。\ 他の定数を検索すれば、(おそらく)同じ結果が得られます。 ### データ情報 コードに重要な定数がない場合、**.dataセクションから情報を読み込んでいる可能性があります**。\ そのデータにアクセスし、**最初のDWORDをグループ化**し、前のセクションで行ったようにGoogleで検索できます: ![](<../../images/image (372).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 (377).png>) ### **スクランブリングステージ:** ![](<../../images/image (378).png>) ### **XORステージ:** ![](<../../images/image (379).png>) ## **AES (対称暗号)** ### **特徴** - **置換ボックスとルックアップテーブルの使用** - **特定のルックアップテーブルの値**(定数)の使用によりAESを**区別することが可能です**。_定数は**バイナリに保存**されるか、_ _**動的に作成**_されることがあります。_ - **暗号化キー**は**16で割り切れる**必要があります(通常32B)し、通常は16Bの**IV**が使用されます。 ### SBox定数 ![](<../../images/image (380).png>) ## Serpent **(対称暗号)** ### 特徴 - それを使用しているマルウェアはあまり見られませんが、例(Ursnif)があります。 - アルゴリズムがSerpentであるかどうかは、その長さ(非常に長い関数)に基づいて簡単に判断できます。 ### 特定 次の画像では、定数**0x9E3779B9**が使用されていることに注意してください(この定数は**TEA**(Tiny Encryption Algorithm)などの他の暗号アルゴリズムでも使用されています)。\ また、**ループのサイズ**(**132**)と**逆アセンブル**命令および**コード**例における**XOR操作の数**にも注意してください: ![](<../../images/image (381).png>) 前述のように、このコードは**非常に長い関数**として任意の逆コンパイラ内で視覚化できます。内部に**ジャンプ**がないためです。逆コンパイルされたコードは次のように見えることがあります: ![](<../../images/image (382).png>) したがって、**マジックナンバー**と**初期XOR**を確認し、**非常に長い関数**を見て、**長い関数のいくつかの命令を実装と比較する**ことで、このアルゴリズムを特定することが可能です(例えば、7ビット左シフトや22ビット左回転など)。 ## RSA **(非対称暗号)** ### 特徴 - 対称アルゴリズムよりも複雑です。 - 定数はありません!(カスタム実装は特定が難しい) - KANAL(暗号アナライザー)はRSAに関するヒントを示すことができず、定数に依存しています。 ### 比較による特定 ![](<../../images/image (383).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 (385).png>) **MD5 Transform** より多くの定数の使用に注意してください。 ![](<../../images/image (253) (1) (1) (1).png>) ## CRC(ハッシュ) - データの偶発的な変更を見つけるための機能として、小型で効率的です。 - ルックアップテーブルを使用します(したがって、定数を特定できます)。 ### 特定 **ルックアップテーブルの定数**を確認してください: ![](<../../images/image (387).png>) CRCハッシュアルゴリズムは次のようになります: ![](<../../images/image (386).png>) ## APLib(圧縮) ### 特徴 - 認識可能な定数はありません。 - アルゴリズムをPythonで書いて、オンラインで類似のものを検索してみることができます。 ### 特定 グラフはかなり大きいです: ![](<../../images/image (207) (2) (1).png>) それを認識するための**3つの比較**を確認してください: ![](<../../images/image (384).png>) {{#include ../../banners/hacktricks-training.md}}