# マルウェアで使用される一般的なAPI
{% hint style="success" %}
AWSハッキングを学び、実践する:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
GCPハッキングを学び、実践する:[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
HackTricksをサポートする
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してハッキングトリックを共有してください。**
{% 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)を指し、ユーザープロセスがこれらの関数を呼び出すことができる。
* ルートキットはこれらのポインタを制御するアドレスに変更することがある。
* **IRP**(**I/Oリクエストパケット**)は、あるコンポーネントから別のコンポーネントにデータの断片を送信する。カーネル内のほぼすべてのものがIRPを使用し、各デバイスオブジェクトにはフック可能な独自の関数テーブルがある:DKOM(ダイレクトカーネルオブジェクト操作)
* **IAT**(**インポートアドレステーブル**)は依存関係を解決するのに役立つ。このテーブルをフックして呼び出されるコードをハイジャックすることが可能。
* **EAT**(**エクスポートアドレステーブル**)フック。このフックは**ユーザーランド**から行うことができる。目的はDLLによってエクスポートされた関数をフックすること。
* **インラインフック**:このタイプは達成が難しい。関数自体のコードを修正することを含む。おそらく、最初にジャンプを置くことによって。
{% hint style="success" %}
AWSハッキングを学び、実践する:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
GCPハッキングを学び、実践する:[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
HackTricksをサポートする
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)を確認してください!
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**Telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローしてください。**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks)および[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してハッキングトリックを共有してください。**
{% endhint %}