hacktricks/reversing/common-api-used-in-malware.md

9.7 KiB
Raw Blame History

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

{% hint style="success" %} AWSハッキングを学び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践するHackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポートする
{% endhint %}

一般的な

ネットワーキング

生のソケット WinAPIソケット
socket() WSAStratup()
bind() bind()
listen() listen()
accept() accept()
connect() connect()
read()/recv() recv()
write() send()
shutdown() WSACleanup()

永続性

レジストリ ファイル サービス
RegCreateKeyEx() GetTempPath() OpenSCManager
RegOpenKeyEx() CopyFile() CreateService()
RegSetValueEx() CreateFile() StartServiceCtrlDispatcher()
RegDeleteKeyEx() WriteFile()
RegGetValue() ReadFile()

暗号化

名前
WinCrypt
CryptAcquireContext()
CryptGenKey()
CryptDeriveKey()
CryptDecrypt()
CryptReleaseContext()

逆解析/VM

関数名 アセンブリ命令
IsDebuggerPresent() CPUID()
GetSystemInfo() IN()
GlobalMemoryStatusEx()
GetVersion()
CreateToolhelp32Snapshot [プロセスが実行中か確認]
CreateFileW/A [ファイルが存在するか確認]

ステルス

名前
VirtualAlloc メモリを割り当てる(パッカー)
VirtualProtect メモリの権限を変更する(パッカーがセクションに実行権限を与える)
ReadProcessMemory 外部プロセスへの注入
WriteProcessMemoryA/W 外部プロセスへの注入
NtWriteVirtualMemory
CreateRemoteThread DLL/プロセス注入...
NtUnmapViewOfSection
QueueUserAPC
CreateProcessInternalA/W

実行

関数名
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システムサービス記述子テーブルはカーネル関数ntoskrnl.exeまたはGUIドライバwin32k.sysを指し、ユーザープロセスがこれらの関数を呼び出すことができる。
  • ルートキットはこれらのポインタを制御するアドレスに変更することがある。
  • IRPI/Oリクエストパケットは、あるコンポーネントから別のコンポーネントにデータの断片を送信する。カーネル内のほぼすべてのものがIRPを使用し、各デバイスオブジェクトにはフック可能な独自の関数テーブルがあるDKOMダイレクトカーネルオブジェクト操作
  • IATインポートアドレステーブル)は依存関係を解決するのに役立つ。このテーブルをフックして呼び出されるコードをハイジャックすることが可能。
  • EATエクスポートアドレステーブル)フック。このフックはユーザーランドから行うことができる。目的はDLLによってエクスポートされた関数をフックすること。
  • インラインフック:このタイプは達成が難しい。関数自体のコードを修正することを含む。おそらく、最初にジャンプを置くことによって。

{% hint style="success" %} AWSハッキングを学び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践するHackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポートする
{% endhint %}