一般に、このトロイの木馬は最初からすべてが明確でした。ネットワークから何かをダウンロードしています。 しかし、何らかの理由で(そのうちの1つはP2P-Worm.Win32.Socks.sとしてのキャスパー検出です)、私はそれを「分解」することにしました。 カットの下-トロイの木馬の開始の技術的な詳細。 注意、完全に検閲された単語や多くの技術的な詳細はありません!
今日の表には、20,000バイト弱のservices.exeファイルがあります。 パッケージ化されておらず、VCのいずれかのバージョンで書かれています。
ファイル処理後のIDAはWinMainで停止します。 そして、WinMainにはすぐに表示されます:
.text:00403444 push ebp
.text:00403445 mov ebp、esp
.text:00403447 push 0FFFFFFFFh
.text:00403449プッシュオフセットunk_404140
.text:0040344Eプッシュオフセットloc_403540
.text:00403453 mov eax、大きなfs:0
.text:00403459 push eax
.text:0040345A mov large fs:0、esp
.text:00403461 push ecx
.text:00403462 push ecx
.text:00403463 sub esp、10h
.text:00403466 push ebx
.text:00403467 push esi
.text:00403468 push edi
.text:00403469 mov [ebp + var_18]、esp
.text:0040346Cおよび[ebp + var_4]、0
.text:00403470およびdword ptr [ebp + Time + 4]、0
.text:00403474 mov eax、dword ptr [ebp +時間+ 4]
.text:00403477 mov dword ptr [eax]、0DFADBABEh
.text:0040347Dまたは[ebp + var_4]、0FFFFFFFFh
.text:00403481 jmp loc_40352B
...
.text:0040352B loc_40352B:; コードXREF:WinMain(x、x、x、x)+ 3D
.text:0040352B mov ecx、[ebp + var_10]
.text:0040352E mov large fs:0、ecx
.text:00403535 pop edi
.text:00403536 pop esi
.text:00403537 pop ebx
.text:00403538 leave
.text:00403539 retn 10h
.text:00403539 _WinMain @ 16 endp
ただし、アドレス0x403470で始まるコードに注意してください。アドレス0x000000にアクセスする明示的な試みです。 この時点で、SEHハンドラーが呼び出され、その結果、制御は本来あるべき場所に移動されます。 同様のトリックがWinMainで少なくとも1回使用されます。 しかし、WinMainはさらにいくつかの驚きを用意しました。たとえば、制御はそのようなコードに転送されます。
.text:00401EA3 loc_401EA3:; コードXREF:WinMain(x、x、x、x):loc_4034C9
.text:00401EA3 push ebp
.text:00401EA4 mov ebp、esp
.text:00401EA6 push 0FFFFFFFFh
.text:00401EA8プッシュオフセットunk_404120
.text:00401EADプッシュオフセットloc_403540
.text:00401EB2 mov eax、大きなfs:0
.text:00401EB8 push eax
.text:00401EB9 mov large fs:0、esp
.text:00401EC0 push ecx
.text:00401EC1 push ecx
.text:00401EC2 push ecx
.text:00401EC3 push ebx
.text:00401EC4 push esi
.text:00401EC5 push edi
.text:00401EC6 mov [ebp-18h]、esp
.text:00401EC9およびdword ptr [ebp-4]、0
.text:00401ECD mov eax、1
.text:00401ECD; -.text:00401ED2 dw 3F0Fh
.text:00401ED4 dd 45C70B07h、0FFFFFFFCh、0FC4D83FFh、6A14EBFFh、8BC35801h
.text:00401ED4 dd 6580E865h、4D8300E7h、458AFFFCh、0B002EBE7h、0F04D8B01h
.text:00401ED4 dd 0D8964h、5F000000h、0C3C95B5Eh
無効なオペコード。 オリーは、この時点で、次の指示に移動することを拒否します。 つまり、ある種の反デバッグ手法があります。 最後のトリックはVMWareの検出です。これは、次の手順ですばやく簡単に認識されます。
.text:00401F34 mov eax、「VMXh」
.text:00401F39 mov ebx、8685D465h
.text:00401F3E mov ecx、0Ah
.text:00401F43 mov dx、5658h
.text:00401F47 in eax、dx
実際、WinMainは2つの機能を実行します。研究者の生活を複雑にし、(すべてがそうである場合)制御をペイロードに移します。 WinMainを経由せず、最初はEIPをPayLoadに直接移動しました。 最初に、通常通り、トロイの木馬は汚れた行為のためにデータを準備します。すべての行を復号化し、必要なAPI関数(ループではなくLoadLibrary + GetProcAddress)のアドレスを見つけます。 文字列暗号化-1バイトのXOR。ただし、キーはどこでも異なります。 アルゴリズムは簡単に認識されます:
.text:0040100E loc_40100E:; コードXREF:decryptXor + 37 j
.text:0040100E mov eax、[ebp + pos]
.text:00401011 inc eax
.text:00401012 mov [ebp + pos]、eax
.text:00401015
.text:00401015 loc_401015:; コードXREF:decryptXor + C j
.text:00401015 push [ebp + lpString]; lpString
.text:00401018 call ds:lstrlenA
.text:0040101E cmp [ebp + pos]、eax
.text:00401021 jge short loc_401039
.text:00401023 mov eax、[ebp + lpString]
.text:00401026 eaxを追加、[ebp + pos]
.text:00401029 movsx eax、byte ptr [eax]
.text:0040102C xor eax、[ebp + key]
.text:0040102F mov ecx、[ebp + lpString]
.text:00401032 add ecx、[ebp + pos]
.text:00401035 mov [ecx]、al
.text:00401037 jmp short loc_40100E
Delphiでは、ちなみに、そのような復号化関数は2ページかかります。 私はデルファイと好きではないもののために。
次に、WSAStartup呼び出しが行われます。WindowsSocketsを使用するための準備、c:\ stopファイル(トロイの木馬はこのファイルの名前で一意に識別されます)を削除し、必要なパスを含む行を準備します。 興味深いのは、トロイの木馬がファイルを読み取り用に開き、読み取り位置を0x43バイトに移動して、そこから8バイトを読み取ることです。 この場所でHIEWを見る... はい、手動で変更されたヘッダーがあります! 0x43は「This program ...」行の始まりに過ぎず、ここではload \ 0です。 プログラムの次の番号は、Windowsシステムカタログへのパスとディスクのシリアル番号に基づいた一意の行の計算です。 これで、トロイの木馬はシステム内の2つのファイルの存在を確認します。現在のユーザーのディレクトリにある%Windows%\ system32 \ drivers \ services.exeとsvchost.exe。 トロイの木馬がシステムにインストールされていない場合、非常に興味深いコードに切り替わります。 まず、文字列(!)から、atoi関数の独自の実装を介して、数値が取得され、1000倍され、結果がSleep関数に渡されます。つまり、調整可能な遅延が実行されます。 トロイの木馬がコマンドライン引数を受け取り、それらをまとめて収集し、WinExecに渡すまでの遅延。 トロイの木馬がファイルを開くためのデフォルトのプログラムとして登録されている可能性があることを疑います。 欠落している引数は正しく処理されます。 破壊的なアクションを実行する前に、トロイの木馬はシステム内のミューテックスの存在をチェックし、ミューテックスが既に存在する場合、その作業を完了します。 兄弟がいない場合、2つのスレッドを作成し、1つはループ内のc:\ stopファイルをチェックし(存在する場合、プロセスを終了します)、2番目はネットワークで作業を実行します。 最後の仕上げは、ユーザーのftp34.dllファイルをユーザーディレクトリとシステムディレクトリに抽出し(XOR暗号化、キーは1バイト)、その後のダウンロードです。 ユーザーの生活を複雑にするために、これらのファイルの作成日はシステムのものと同じになります。
ネットワーク活動。
ネットワークに関するすべての作業は、トロイの木馬ストリームの1つに集中しています。 同じストリーム内で、トロイの木馬は%Windows%\ system32 \ drivers \ services.exe、現在のユーザーのディレクトリのsvchost.exeファイル、およびWindowsメインメニューの「スタートアップ」のuserinit.exeファイルに自分自身をコピーします(日付も修正します)。 (この時点で、私は愚かにトロイの木馬を制御不能にリリースし、イメージからシステムを復元しなければなりませんでした)。 少なくとも5か所のレジスタに登録されています。 そして、予想どおり、EXEファイルを開くためのデフォルトのプログラムとして登録されています。 ThreadProcの先頭にスレッドブロックを配置せず、再び愚かで皮肉なことに、EIPをその先頭に変更します:-)
では、ネットワークについてはどうでしょうか? site.com/shl/?&v=load&lid=1033の形式のURLを要求しようとしました。 Whoisは、このサイトの連絡先石鹸はmail.ruにあり、IPアドレスはロシアのホストに属していると報告しています。 URLには何が渡されますか? 「ロード」は、サイトヘッダーから抽出されたその一部であり、1033はシステム言語の識別子です。 ブラウザでsite.com/shl/にアクセスすると、写真とログインフォームが表示されます。
ここにそのようなロゴがあります!
ベンダーにshttpdを置き、site.comの127.0.0.1をetc / hostsに登録しました。 しかし、問題があります。shttpdは、「?」を含むURLには問題があります。 対処。 この問題は単純に解決されます。wgetを使用してサーバーから目的のファイルをダウンロードし、shl.txtに名前を変更し、トロイの木馬からInternetReadFileを呼び出す前に、メモリ内のURLを修正してsite.com/shl.txtにします。 サーバーはファイルを提供し、トロイの木馬はそれを受け取ります。 最初は、トロイの木馬はユーザー名とパスワードを送信するためにこのページが必要だと思っていました。 しかし、すべてがよりシンプルであることが判明しました。トロイの木馬は、文字列「form method」を検索し、ダウンロードを継続する場合。 今回は、ファイルはsite.com/shl/manda.php?ns=1&id=1212312124 URLからダウンロードされます。idは一意の番号です(上記の領収書を参照)。 しかし、何らかの理由で、このファイルはダウンロードされませんでした:-(おそらく、サーバー上にIPブロッキングがあります。しかし、ファイルは職場でダウンロードされています。URLのリストはプレーンテキストです。コードは非常に単純で、 URLはダウンロードされたファイルであり、実行のために実行されます。これは別のスレッドから行われます。
結果。
キャスパーは名前を間違えました。もう一度、そのようなファイルは少なくともダウンローダーだと確信しました。 トロイの木馬の作者はロシア語を話す同志であり、トロイの木馬を販売しています...コードの20%未満は詳細には解析されませんが、作者のWebサイトの説明とテキスト文字列から判断すると、トロイの木馬はスパムメール用のメールアドレスを収集できます。 ftp34.dllライブラリは、FTPアクセスのパスワードを傍受するために使用される可能性が最も高いです。 仕事では、残りの部分を詳細に選択できると思います。 ここに彼は、トロイの木馬「愚かな」:-)
vilgeforce.habrahabr.ru/blog/44145.htmlの継続を更新