ファイル操作
CreateFile
新しいファイルの作成または既存のファイルを開いてそのハンドルを返す.
HANDLE CreateFile(
LPCTSTR lpFileName, // ファイル名
DWORD dwDesiredAccess, // アクセスモード
DWORD dwShareMode, // 共有モード
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // セキュリティ記述子
DWORD dwCreationDisposition, // 作成方法
DWORD dwFlagsAndAttributes, // ファイル属性
HANDLE hTemplateFile // テンプレートファイルのハンドル
);
ReadFile
ファイルからデータを読み取る.
BOOL ReadFile(
HANDLE hFile, // ファイルのハンドル
LPVOID lpBuffer, // データバッファ
DWORD nNumberOfBytesToRead, // 読み取り対象のバイト数
LPDWORD lpNumberOfBytesRead, // 読み取ったバイト数
LPOVERLAPPED lpOverlapped // オーバーラップ構造体のバッファ
);
WriteFile
ファイルにデータを書き込む.
BOOL WriteFile(
HANDLE hFile, // ファイルのハンドル
LPCVOID lpBuffer, // データバッファ
DWORD nNumberOfBytesToWrite, // 書き込み対象のバイト数
LPDWORD lpNumberOfBytesWritten, // 書き込んだバイト数
LPOVERLAPPED lpOverlapped // オーバーラップ構造体のバッファ
);
DeleteFile
既存のファイルを削除する.
BOOL DeleteFile(
LPCTSTR lpFileName // ファイル名
);
MapViewOfFile
呼び出し側プロセスのアドレス空間にファイルのビューをマップする.
ランチャーやローダー,インジェクターはPEファイルを読み込んで改変するためにこの関数を利用する.
マルウェアはファイルのコンテンツを改変する際にWriteFileの代わりにこの関数を利用することがある.
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // ファイルマッピングオブジェクトのハンドル
DWORD dwDesiredAccess, // アクセスモード
DWORD dwFileOffsetHigh, // オフセットの上位 DWORD
DWORD dwFileOffsetLow, // オフセットの下位 DWORD
SIZE_T dwNumberOfBytesToMap // マップ対象のバイト数
);
ファイル実行
WinExec
指定されたアプリケーションを実行する.
例:ダミーの文書ファイルの表示,ドロップされたファイルの実行
UINT WinExec(
LPCSTR lpCmdLine, // コマンドラインへのポインタ
UINT uCmdShow // ウィンドウの表示状態
);
CreateProcess
新しいプロセスを作成して実行する.
BOOL CreateProcess(
LPCTSTR lpApplicationName, // 実行可能モジュールの名前
LPTSTR lpCommandLine, // コマンドラインの文字列
LPSECURITY_ATTRIBUTES lpProcessAttributes, // セキュリティ記述子
LPSECURITY_ATTRIBUTES lpThreadAttributes, // セキュリティ記述子
BOOL bInheritHandles, // ハンドルの継承オプション
DWORD dwCreationFlags, // 作成のフラグ
LPVOID lpEnvironment, // 新しい環境ブロック
LPCTSTR lpCurrentDirectory, // カレントディレクトリの名前
LPSTARTUPINFO lpStartupInfo, // スタートアップ情報
LPPROCESS_INFORMATION lpProcessInformation // プロセス情報
);
system
Cランタイムライブラリによって提供されるプログラムを起動する.
Windows上では,この関数はCreateProcess関数のラッパー関数として機能している.
int system(
const char *command
);
ShellExecute
指定されたファイルに対して,指定された操作を実行する.
HINSTANCE ShellExecute(
HWND hwnd, // 親ウィンドウのハンドル
LPCTSTR lpVerb, // 操作
LPCTSTR lpFile, // 操作対象のファイル
LPCTSTR lpParameters, // 操作のパラメータ
LPCTSTR lpDirectory, // 既定のディレクトリ
INT nShowCmd // 表示状態
);
メモリ管理
GetProcessHeap
呼び出し側プロセスのヒープのハンドルを取得する.
その後,HeapAlloc,HeapReAlloc,HeapFree,HeapSize の各関数でこのハンドルを使用できる.
HANDLE GetProcessHeap(VOID);
HeapAlloc
メモリブロックをヒープから割り当てる.
LPVOID HeapAlloc(
HANDLE hHeap, // プライベートヒープブロックのハンドル
DWORD dwFlags, // ヒープの割り当て方法の制御
SIZE_T dwBytes // 割り当てたいバイト数
);
HeapCreate
呼び出し側プロセスが使用できるヒープオブジェクトを作成する.
この関数はプロセスの仮想アドレス空間内の領域を予約し,このブロック内の指定された初期のパートに物理格納域を割り当てる.
HANDLE HeapCreate(
DWORD flOptions, // ヒープ割り当て方法の属性
SIZE_T dwInitialSize, // 初期のヒープサイズ
SIZE_T dwMaximumSize // 最大ヒープサイズ
);
HeapReAlloc
ヒープからメモリブロックを再割り当てする.
この結果,メモリブロックのサイズや他のプロパティを変更できる.
LPVOID HeapReAlloc(
HANDLE hHeap, // ヒープブロックのハンドル
DWORD dwFlags, // ヒープ再割り当てのオプション
LPVOID lpMem, // 再割り当てしたいメモリへのポインタ
SIZE_T dwBytes // 再割り当てしたいバイト数
);
HeapSize
HeapAlloc 関数または HeapReAlloc 関数を使ってヒープから割り当てたメモリブロックのサイズをバイト単位で取得する.
DWORD HeapSize(
HANDLE hHeap, // ヒープのハンドル
DWORD dwFlags, // ヒープサイズに関するオプション
LPCVOID lpMem // メモリへのポインタ
);
HeapFree
HeapAlloc 関数または HeapReAlloc 関数がヒープから割り当てたメモリブロックを解放する.
BOOL HeapFree(
HANDLE hHeap, // ヒープのハンドル
DWORD dwFlags, // ヒープ解放オプション
LPVOID lpMem // メモリへのポインタ
);
HeapSetInformation
指定されたヒープの機能を有効にする.
BOOL WINAPI HeapSetInformation(
HANDLE HeapHandle,
HEAP_INFORMATION_CLASS HeapInformationClass,
PVOID HeapInformation,
SIZE_T HeapInformationLength
);
ReadProcessMemory
指定されたプロセスのメモリ領域からデータを読み取る.
ただし,読み取られる領域全体がアクセス可能でなければならない.
BOOL ReadProcessMemory(
HANDLE hProcess, // プロセスのハンドル
LPCVOID lpBaseAddress, // 読み取り開始アドレス
LPVOID lpBuffer, // データを格納するバッファ
DWORD nSize, // 読み取りたいバイト数
LPDWORD lpNumberOfBytesRead // 読み取ったバイト数
);
WriteProcessMemory
指定されたプロセスのメモリ領域にデータを書き込む.
書き込みたい領域全体がアクセス可能でなければならない.
BOOL WriteProcessMemory(
HANDLE hProcess, // プロセスのハンドル
LPVOID lpBaseAddress, // 書き込み開始アドレス
LPVOID lpBuffer, // データバッファ
DWORD nSize, // 書き込みたいバイト数
LPDWORD lpNumberOfBytesWritten // 実際に書き込まれたバイト数
);
スレッド
GetCurrentThread
現在のスレッドの擬似ハンドルを取得する.
HANDLE GetCurrentThread(VOID);
GetCurrentThreadId
呼び出し側スレッドのスレッド識別子を取得する.
DWORD GetCurrentThreadId(VOID);
SuspendThread
指定されたスレッドの実行を中断する.
DWORD SuspendThread(
HANDLE hThread // スレッドのハンドル
);
ResumeThread
スレッドのサスペンド(中断)カウントを 1 減らす.
サスペンドカウントが 0 になるとスレッドの実行が再開される.
DWORD ResumeThread(
HANDLE hThread // スレッドのハンドル
);
GetThreadContext
指定したスレッドのコンテキストを取得する.
スレッドのコンテキストは,レジスタ値や現在の状態などスレッドの全ての情報を格納している.
BOOL GetThreadContext(
HANDLE hThread, // コンテキストを持つスレッドのハンドル
LPCONTEXT lpContext // コンテキストを受け取る構造体のアドレス
);
SetThreadContext
指定したスレッドのコンテキストを設定する.
いくつかのインジェクション技術でこの関数を利用される.
BOOL SetThreadContext(
HANDLE hThread, // このテキストを持つスレッドのハンドル
CONST CONTEXT *lpContext
// コンテキストが入った構造体のアドレス
);
CreateRemoteThread
別のプロセスのアドレス空間で稼働するスレッドを作成する.
ランチャーやステルスマルウェアが他のプロセスに対してコードインジェクションする際にこの関数を利用することがある.
HANDLE CreateRemoteThread(
HANDLE hProcess, // 新しいスレッドを稼働させるプロセスを識別するハンドル
LPSECURITY_ATTRIBUTES lpThreadAttributes,
// スレッドのセキュリティ属性へのポインタ
DWORD dwStackSize, // 初期のスタックサイズ (バイト数)
LPTHREAD_START_ROUTINE lpStartAddress,
// スレッド関数へのポインタ
LPVOID lpParameter, // 新しいスレッドの引数へのポインタ
DWORD dwCreationFlags,// 作成フラグ
LPDWORD lpThreadId // 取得したスレッド識別子へのポインタ
);
ディレクトリ
GetTempPath
一時ファイル用のディレクトリのパスを取得する.
マルウェアがこの関数を呼び出している場合,一時ファイルパスにファイルの読み書きをしているかどうかを確認する.
DWORD GetTempPath(
DWORD nBufferLength, // バッファのサイズ
LPTSTR lpBuffer // パスを格納するバッファ
);
GetModuleFilename
指定されたモジュールを含む実行ファイルの,フルパス名とファイル名を取得する.
マルウェアは現在の実行プロセス内でファイルをコピーまたは改変するためにこの関数を使用する.
DWORD GetModuleFileName(
HMODULE hModule, // モジュールのハンドル
LPTSTR lpFilename, // モジュールのファイル名
DWORD nSize // バッファのサイズ
);
レジストリ
RegOpenKey
指定されたレジストリキーを開く.
LONG RegOpenKey(
HKEY hKey, // 開いている親キーのハンドル
LPCTSTR lpSubKey, // 開くべきサブキーの名前
PHKEY phkResult // 開くことに成功したサブキーのハンドル
);
ネットワーク
WSAStartup
ローレベルのネットワーク機能(Winsock DLL)の初期化を行う.
このAPIを探索するのが,ネットワークに関連する機能が開始する位置を特定するための簡単な手法である.
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
send
リモートマシンにデータを送信する.
マルウェアはC&Cサーバにデータを送信する際にこの関数をよく利用している.
int send(
SOCKET s,
const char *buf,
int len,
int flags
);
recv
リモートマシンからデータを受信する.
マルウェアはC&Cサーバからデータを受信する際にこの関数をよく利用している.
int recv(
SOCKET s,
char *buf,
int len,
int flags
);
bind
ローカルアドレスとソケットを関連付ける.
int bind(
SOCKET s,
const struct sockaddr *name,
int namelen
);
accept
外部からの接続試行を許可する.
SOCKET accept(
SOCKET s,
struct sockaddr *addr,
int *addrlen
);
コードページ
GetACP
システムで現在有効になっている ANSI コードページの識別子を取得する.
GetOEMCP
システムで現在有効になっている OEM コードページの識別子を取得する.
GetCPInfo
インストール済みの有効なコードページまたは利用可能なコードページに関する情報を取得する.
BOOL GetCPInfo(
UINT CodePage, // コードページの識別子
LPCPINFO lpCPInfo // 情報が格納されるバッファ
);
GetConsoleCP
呼び出し側プロセスのコンソールが使う入力コードページを返す.
コンソールはその入力コードページを使ってキーボード入力を対応する文字値に変換する.
デバッガ検出
IsDebuggerPresent
呼び出し側プロセスがデバッガのコンテキストで実行されているかどうかを調べる.
BOOL IsDebuggerPresent(VOID);
CheckRemoteDebuggerPresent
特定のプロセスが
デバッグされているかどうかをチェックする.
この関数はマルウェアのアンチデバッグ技術の一部として時折使用される.
BOOL WINAPI CheckRemoteDebuggerPresent(
HANDLE hProcess,
PBOOL pbDebuggerPresent
);
未分類
GetModuleHandle
ロードされているモジュールのハンドルを取得する.
マルウェアは当該モジュール位置の取得,コード改変,コードインジェクションのポイントを検索するためにこの関数を使用する.
HMODULE GetModuleHandle(
LPCTSTR lpModuleName // モジュール名
);
GetProcAddress
ダイナミックリンクライブラリ(DLL)が持つ,指定されたエクスポート済み関数のアドレスを取得する.
PEファイルヘッダにインポートされた関数に加えて,他のDLLから関数をインポートするのに使用される.
FARPROC GetProcAddress(
HMODULE hModule, // DLL モジュールのハンドル
LPCSTR lpProcName // 関数名
);
LoadLibrary
指定された実行可能モジュールを,呼び出し側プロセスのアドレス空間内にマップする.
ほぼ全てのWin32プログラムによってインポートされている関数である.
HMODULE LoadLibrary(
LPCTSTR lpFileName // モジュールのファイル名
);
CreateMutex
名前付きまたは名前なしのミューテックス(mutually exclusive;相互排他)オブジェクトを作成または開く.
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // セキュリティ記述子
BOOL bInitialOwner, // 最初の所有者
LPCTSTR lpName // オブジェクトの名前
);
CreateService
サービスオブジェクトを作成し,サービス制御マネージャ(Service Control Manager:SCM)の指定されたデータベースに追加する.
SC_HANDLE CreateService(
SC_HANDLE hSCManager, // SCM データベースのハンドル
LPCTSTR lpServiceName, // 開始したいサービスの名前
LPCTSTR lpDisplayName, // 表示名
DWORD dwDesiredAccess, // サービスのアクセス権のタイプ
DWORD dwServiceType, // サービスのタイプ
DWORD dwStartType, // サービスを開始する時期
DWORD dwErrorControl, // サービスに失敗したときの深刻さ
LPCTSTR lpBinaryPathName, // バイナリファイル名
LPCTSTR lpLoadOrderGroup, // ロード順序を決定するグループ名
LPDWORD lpdwTagId, // タグ識別子
LPCTSTR lpDependencies, // 複数の依存名からなる配列
LPCTSTR lpServiceStartName, // アカウント名
LPCTSTR lpPassword // アカウントのパスワード
);
GetStartupInfo
呼び出し側プロセスを作成する際に指定された構造体の内容を取得する.
VOID GetStartupInfo(
LPSTARTUPINFO lpStartupInfo // スタートアップ情報
);
EnumProcess
システム内の各プロセスオブジェクト用のプロセス識別子を取得する.
BOOL EnumProcesses(
DWORD * lpidProcess, // プロセス識別子を受け取る配列
DWORD cb, // 配列のサイズ
DWORD * cbNeeded // 返されたバイト数
);
EnumProcessModules
指定されたプロセス内の各モジュールのハンドルを取得する.
BOOL EnumProcessModules(
HANDLE hProcess, // プロセスのハンドル
HMODULE * lphModule, // モジュールハンドルを受け取る配列
DWORD cb, // 配列のサイズ
LPDWORD lpcbNeeded // 必要なバイト数
);
GetVersionEx
現在動作しているオペレーティングシステムのバージョンに関する拡張情報を取得する.
動作環境の調査やバージョンの異なるWindows間で変更されている文書化されていない構造体にアクセスするためのオフセット選択のために利用される.
BOOL GetVersionEx(
LPOSVERSIONINFO lpVersionInfo // バージョン情報
);
SetWindowsHookEx
アプリケーション定義のフックプロシージャをフックチェーン内にインストールする.
HHOOK SetWindowsHookEx(
int idHook, // フックタイプ
HOOKPROC lpfn, // フックプロシージャ
HINSTANCE hMod, // アプリケーションインスタンスのハンドル
DWORD dwThreadId // スレッドの識別子
);
VirtualAllocEx
指定されたプロセスの仮想アドレス空間内のメモリ領域の予約とコミットの一方または両方を行う.
LPVOID VirtualAllocEx(
HANDLE hProcess, // 割り当てたいメモリを保持するプロセス
LPVOID lpAddress, // 割り当てたい開始アドレス
DWORD dwSize, // 割り当てたい領域のバイト単位のサイズ
DWORD flAllocationType, // 割り当てのタイプ
DWORD flProtect // アクセス保護のタイプ
);
VirtualProtectEx
指定されたプロセスの仮想アドレス空間内のコミット済みページ領域に対するアクセス保護の状態を変更する.
BOOL VirtualProtectEx(
HANDLE hProcess, // プロセスのハンドル
LPVOID lpAddress, // コミット済みページ領域のアドレス
DWORD dwSize, // 領域のサイズ
DWORD flNewProtect, // 希望のアクセス保護
PDWORD lpflOldProtect
// 従来のアクセス保護を取得する変数のアドレス
);
gethostbyname
ホストデータベースからホスト名に対応するホスト情報を取得する.
リモートホストに対してIPコネクションを確率する前に特定のホスト名でDNSルックアップを実行するのに使用される.
C&Cサーバとして機能するホスト名はネットワークベースのシグネチャを作成するのに利用できる.
struct hostent* FAR gethostbyname(
const char *name
);
gethostname
ローカルコンピュータの標準ホスト名を取得する.
バックドアはターゲットマシンの調査にこの関数を利用することがある.
int gethostname(
char *name,
int namelen
);
GetCurrentProcess
現在のプロセスに対応する疑似ハンドルを取得する.
HANDLE GetCurrentProcess(VOID);
GetCurrentProcessId
呼び出し側プロセスのプロセス識別子を取得する.
DWORD GetCurrentProcessId(VOID);
CreateToolhelp32Snapshot
プロセスとプロセスが使っているヒープ,モジュール,スレッドのスナップショットを作成する.
マルウェアはしばしばプロセスまたはスレッドに対して反復処理するコードでこの関数を利用する.
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
CallNextHookEx
現在のフックチェーン内の次のフックプロシージャにフック情報を渡す.
SetWindowsHookEx関数によってセットされるイベントをフックするコードで使用される.
SetWindowsHookExによってセットされるフックの目的を特定するためにはこの関数の分析を行うとよい.
LRESULT CallNextHookEx(
HHOOK hhk, // 現在のフックのハンドル
int nCode, // フックプロシージャに渡すフックコード
WPARAM wParam, // フックプロシージャに渡す値
LPARAM lParam // フックプロシージャに渡す値
);
最終更新:2014年11月10日 00:17