Trojan-Dropper.Win32.Agent.rek:「合法的な」ルートキット

このノートでは、前の部分で説明したウイルスによってロードされるドライバーについて説明します。 ドライバーは、オペレーティングシステムのカーネルレベルで動作し、ユーザーモードで動作するトロイの木馬の基本機能に「特権」カバーを提供します(コンポーネントの作成者名はwinnt32.dllです。詳細については、habrahabr.ru/blog/virus/43787.htmlを参照してください)。



短い説明。

プログラムはntドライバーです(レガシードライバーとも呼ばれ、物理デバイスに関連付けられていません)。 これはルートキットです。OSカーネルメカニズムを使用して、他のプログラムからいくつかのファイルやレジストリキーへのアクセスを奪います。

KasperskyによってTrojan-Dropper.Win32.Agent.rekとして検出されます。 サイズは27548バイトです。

叙情的な睡眠不足 「通常の」 ルートキットは、OS実装の欠陥を悪用して、オブジェクト、ファイル、ネットワーク接続などをハードディスクセクターまで隠すことができます。 これを行うために、最も単純なケースでは、システムコールがインターセプトされます。 システムコールは基本的に関数呼び出しであり、関数呼び出しは指定されたアドレスへの制御の転送です。 ルートキットはコードをこのアドレスに書き込み、元の関数の結果を変換します。 たとえば、誰かがウイルスの本体でファイルを開こうとしているかどうかをチェックし、「アクセスが拒否されました」などのエラーコードを返します。
ルートキットは、OS自体の正当な方法を使用してレジストリおよびファイルアクセスをインターセプトします。



ファイルシステム

カーネル関数IoRegisterFsRegistrationChangeを使用して、ドライバーはファイルシステムのアクティブ化/非アクティブ化に関するイベントを受信するようにサブスクライブします。 つまり、OS自体がドライバーに通知し、さらにファイルシステムとそのドライバーの「デバイス」を記述するDEVICE_OBJECT構造体に渡します。 「ファイルシステムデバイス」は、大まかに言って、ユーザーがフォルダとファイルの形式で整理されたディスク上のデータを見る手段です。

ディレクトリには次のように記述されています。IoRegisterFsRegistrationChangeルーチンは、ファイルシステムがアクティブなファイルシステムとして登録または登録解除するたびに呼び出されるファイルシステムフィルタードライバーの通知ルーチンを登録します。




デバイスを記述するDEVICE_OBJECT構造体では、ドライバーはIRP_MJ_CREATE要求ハンドラーを独自のものに置き換えます。 IRP_MJ_CREATE要求は、ファイルが開かれたときにNtCreateFileによって内部的に生成されます。 新しいハンドラーは、要求された名前をドライバー自体のファイル名(Wwwdd.sysの形式でJer24.sysなどのドロッパーによって指定される)と比較し、一致する場合、エラーコードSTATUS_ACCESS_DENIEDを返します。



レジストリキー

レジストリキーへのアクセスも同様に合法です。CmRegisterCallback関数を使用して、ドライバーはレジストリへのすべてのアクセスの通知をサブスクライブします。 コンピューターがどのようにスローダウンし始めるのかについて話す価値はありますか?



ドライバーは、CmRegisterCallbackを呼び出してRegistryCallbackルーチンを登録します。これは、スレッドがレジストリで操作を実行するたびに呼び出されます。




レジストリキーにアクセスする場合:

HKLM \システム\ CurrentControlSet \サービス\ドライバー名

HKLM \システム\ ControlSet001 \サービス\ドライバー名

HKLM \システム\ ControlSet002 \サービス\ドライバー名

HKLM \ System \ CurrentControlSet \ Control \ SafeBoot \ Minimal \ DRIVER-NAME

HKLM \システム\ CurrentControlSet \コントロール\ SafeBoot \ネットワーク\ドライバー名

HKLM \ System \ ControlSet001 \ Control \ SafeBoot \ Minimal \ DRIVER-NAME

HKLM \ System \ ControlSet001 \ Control \ SafeBoot \ Minimal \ DRIVER-NAME

HKLM \ System \ ControlSet002 \ Control \ SafeBoot \ Network \ DRIVER-NAME

HKLM \ System \ ControlSet002 \ Control \ SafeBoot \ Network \ DRIVER-NAME


ドライバーは、エラーコードSTATUS_ACCESS_DENIEDを返します。



スライド。



ファイルの削除を拒否する:

ファイルの削除を拒否する



レジストリキーの削除の禁止:

レジストリキーの削除の禁止



CDFSに関するルートキット情報を提供するシステムは次のとおりです。
  kd> kb
 ChildEBP RetAddrは子に引数を取ります              
 f9dfbc10 80568d01 818158b8 00000001 818cff38 Qvk71 + 0x1970
 f9dfbc2c f9d3d10b 818cff38 f9d3d970 f9dfbc7c nt!IoRegisterFsRegistrationChange + 0xab
 f9dfbc3c f9d3cdb0 818cff38 00000000 00000000 Qvk71 + 0x110b
 f9dfbc7c 805757dc 818cff38 815dd000 00000000 Qvk71 + 0xdb0
 f9dfbd4c 805758eb 000005b8 00000001 00000000 nt!IopLoadDriver + 0x66c
 f9dfbd74 80533fe6 000005b8 00000000 819ca3c8 nt!IopLoadUnloadDriver + 0x45
 f9dfbdac 805c4cce f7e48cf4 00000000 00000000 nt!ExpWorkerThread + 0x100
 f9dfbddc 805411c2 80533ee6 00000001 00000000 nt!PspSystemThreadStartup + 0x34
 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup + 0x16

 kd> dt -r1 _DEVICE_OBJECT poi(esp + 4)
 nt!_DEVICE_OBJECT
    + 0x000タイプ:3
    + 0x002サイズ:0xb8
    + 0x004 ReferenceCount:1
    + 0x008 DriverObject:0x817eba20 _DRIVER_OBJECT
       + 0x000タイプ:4
       + 0x002サイズ:168
       + 0x004 DeviceObject:0x8172e020 _DEVICE_OBJECT
       + 0x008フラグ:0x92
       + 0x00c DriverStart:0xf9c0c000 
       + 0x010 DriverSize:0xf900
       + 0x014 DriverSection:0x818c9960 
       + 0x018 DriverExtension:0x817ebac8 _DRIVER_EXTENSION
       + 0x01c DriverName:_UNICODE_STRING "\ FileSystem \ Cdfs"
       + 0x024 HardwareDatabase:0x8066ecd8 _UNICODE_STRING "\レジストリ\マシン\ハードウェア\説明\システム"
       + 0x028 FastIoDispatch:0xf9c0e400 _FAST_IO_DISPATCH
       + 0x02c DriverInit:0xf9c19a85 long Cdfs!GsDriverEntry + 0
       + 0x030 DriverStartIo:(null) 
       + 0x034 DriverUnload:0xf9c0fca5 void Cdfs!CdUnload + 0
       + 0x038 MajorFunction:[28] 0xf9c0c400 long Cdfs!CdFsdDispatch + 0
    + 0x00c NextDevice:(null) 
    + 0x010 AttachedDevice:(null) 
    + 0x014 CurrentIrp:(null) 
    + 0x018タイマー:(null) 
    + 0x01cフラグ:0x10840
    + 0x020特性:0
    + 0x024 Vpb:(null) 
    + 0x028 DeviceExtension:(null) 
    + 0x02c DeviceType:3
    + 0x030 StackSize:1 ''
    + 0x034キュー:__unnamed
    + 0x05cアライメント要件:0
    + 0x060 DeviceQueue:_KDEVICE_QUEUE
    + 0x074 Dpc:_KDPC
    + 0x094 ActiveThreadCount:0
    + 0x098 SecurityDescriptor:0xe139df00 
    + 0x09c DeviceLock:_KEVENT
    + 0x0acセクターサイズ:0x800
    + 0x0aeスペア1:0
    + 0x0b0 DeviceObjectExtension:0x81815970 _DEVOBJ_EXTENSION
    + 0x0b4予約済み:(ヌル) 




おわりに

ウイルスとアンチウイルスとの目に見えない戦いの中で、世界中のすべてのものが傍受されている場合、このルートキットで使用される方法は合法であり、したがって最も危険です。 私の大きな鐘楼から、実際にそのようなフックを取り外すことは不可能であると想定できます。 または、そのような通知(CmRegisterCallbackなど)の実際の登録手順をインターセプトして、だれも呼び出しを禁止します。

一方、ウイルスとアンチウイルスを区別する線は細くなっており、テリアはほとんど目立ちません。 同じメカニズムを使用して、データを隠したり、通常のプログラムのパフォーマンスを追跡したりします。 ちなみに、これへのステップは、暗黒面によってさらに行われます。



All Articles