マルウェアで使用される一般的なAPI

Reading time: 6 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

一般

ネットワーキング

Raw SocketsWinAPI Sockets
socket()WSAStratup()
bind()bind()
listen()listen()
accept()accept()
connect()connect()
read()/recv()recv()
write()send()
shutdown()WSACleanup()

永続性

RegistryFileService
RegCreateKeyEx()GetTempPath()OpenSCManager
RegOpenKeyEx()CopyFile()CreateService()
RegSetValueEx()CreateFile()StartServiceCtrlDispatcher()
RegDeleteKeyEx()WriteFile()
RegGetValue()ReadFile()

暗号化

Name
WinCrypt
CryptAcquireContext()
CryptGenKey()
CryptDeriveKey()
CryptDecrypt()
CryptReleaseContext()

逆解析/VM

Function NameAssembly Instructions
IsDebuggerPresent()CPUID()
GetSystemInfo()IN()
GlobalMemoryStatusEx()
GetVersion()
CreateToolhelp32Snapshot [プロセスが実行中か確認]
CreateFileW/A [ファイルの存在確認]

ステルス

Name
VirtualAllocメモリを割り当てる (packers)
VirtualProtectメモリの権限を変更する (packerがセクションに実行権限を与える)
ReadProcessMemory外部プロセスへの注入
WriteProcessMemoryA/W外部プロセスへの注入
NtWriteVirtualMemory
CreateRemoteThreadDLL/プロセス注入...
NtUnmapViewOfSection
QueueUserAPC
CreateProcessInternalA/W

実行

Function Name
CreateProcessA/W
ShellExecute
WinExec
ResumeThread
NtResumeThread

その他

  • GetAsyncKeyState() -- キーロギング
  • SetWindowsHookEx -- キーロギング
  • GetForeGroundWindow -- 実行中のウィンドウ名を取得 (またはブラウザからのウェブサイト)
  • LoadLibrary() -- ライブラリをインポート
  • GetProcAddress() -- ライブラリをインポート
  • CreateToolhelp32Snapshot() -- 実行中のプロセスをリスト
  • GetDC() -- スクリーンショット
  • BitBlt() -- スクリーンショット
  • InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- インターネットにアクセス
  • FindResource(), LoadResource(), LockResource() -- 実行可能ファイルのリソースにアクセス

マルウェア技術

DLL注入

別のプロセス内で任意のDLLを実行する

  1. 悪意のあるDLLを注入するプロセスを特定する: CreateToolhelp32Snapshot, Process32First, Process32Next
  2. プロセスを開く: GetModuleHandle, GetProcAddress, OpenProcess
  3. プロセス内にDLLのパスを書く: VirtualAllocEx, WriteProcessMemory
  4. 悪意のあるDLLをロードするスレッドをプロセス内に作成する: CreateRemoteThread, LoadLibrary

使用する他の関数: NTCreateThreadEx, RtlCreateUserThread

反射DLL注入

通常のWindows API呼び出しを行わずに悪意のあるDLLをロードする。
DLLはプロセス内にマッピングされ、インポートアドレスを解決し、リロケーションを修正し、DllMain関数を呼び出す。

スレッドハイジャック

プロセスからスレッドを見つけて悪意のあるDLLをロードさせる

  1. ターゲットスレッドを見つける: CreateToolhelp32Snapshot, Thread32First, Thread32Next
  2. スレッドを開く: OpenThread
  3. スレッドを一時停止する: SuspendThread
  4. 被害者プロセス内に悪意のあるDLLのパスを書く: VirtualAllocEx, WriteProcessMemory
  5. ライブラリをロードするスレッドを再開する: ResumeThread

PE注入

ポータブル実行注入: 実行可能ファイルは被害者プロセスのメモリに書き込まれ、そこから実行される。

プロセスホロウイング

マルウェアはプロセスのメモリから正当なコードをアンマップし、悪意のあるバイナリをロードする

  1. 新しいプロセスを作成する: CreateProcess
  2. メモリをアンマップする: ZwUnmapViewOfSection, NtUnmapViewOfSection
  3. プロセスメモリに悪意のあるバイナリを書く: VirtualAllocEc, WriteProcessMemory
  4. エントリポイントを設定し、実行する: SetThreadContext, ResumeThread

フック

  • SSDT (System Service Descriptor Table) はカーネル関数 (ntoskrnl.exe) またはGUIドライバ (win32k.sys) を指し示し、ユーザープロセスがこれらの関数を呼び出せるようにする。
  • ルートキットはこれらのポインタを制御するアドレスに変更することができる。
  • IRP (I/O Request Packets) はデータの断片を一つのコンポーネントから別のコンポーネントに送信する。カーネル内のほぼすべてのものがIRPを使用し、各デバイスオブジェクトにはフック可能な独自の関数テーブルがある: DKOM (Direct Kernel Object Manipulation)
  • IAT (Import Address Table) は依存関係を解決するのに役立つ。このテーブルをフックして呼び出されるコードをハイジャックすることが可能である。
  • EAT (Export Address Table) フック。このフックはユーザーランドから行うことができる。目的はDLLによってエクスポートされた関数をフックすることである。
  • インラインフック: このタイプは達成が難しい。これは関数自体のコードを修正することを含む。おそらく、最初にジャンプを置くことによって。

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする