デルファイプロセスインジェクションの方法は?
以下の関数が用いられます:
- OpenProcess: 目標プロセスを開いて、そのプロセスハンドルを取得します。
- VirtualAllocEx: ターゲットプロセス内にメモリの領域を確保し、そこに注入するコードを格納します。
- WriteProcessMemory:割り当てられたメモリ空間に注入するコードを書き込みます。
- GetProcAddress:ターゲットプロセス内に呼び出す必要がある関数のアドレスを取得します。
- CreateRemoteThread:ターゲットプロセス内でインジェクトされたコードを実行するリモートスレッドを作成します。
サンプルコードを以下に示します、ターゲットプロセスにDLLを注入するには次のとおりです。
procedure InjectDLL(dwProcessID: DWORD; DLLPath: string);
var
hProcess: THandle;
pRemoteBuffer: Pointer;
pLoadLibrary: Pointer;
dwBufferSize: DWORD;
begin
// 打开目标进程
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessID);
if hProcess = 0 then
Exit;
// 在目标进程中分配内存空间
dwBufferSize := Length(DLLPath) + 1;
pRemoteBuffer := VirtualAllocEx(hProcess, nil, dwBufferSize, MEM_COMMIT, PAGE_READWRITE);
if pRemoteBuffer = nil then
begin
CloseHandle(hProcess);
Exit;
end;
// 将DLL路径写入分配的内存空间
WriteProcessMemory(hProcess, pRemoteBuffer, PChar(DLLPath), dwBufferSize, nil);
// 获取LoadLibrary函数的地址
pLoadLibrary := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA');
// 创建远程线程执行注入代码
CreateRemoteThread(hProcess, nil, 0, pLoadLibrary, pRemoteBuffer, 0, nil);
// 关闭进程句柄
CloseHandle(hProcess);
end;
指定したDLLファイルのパスをターゲットプロセスのメモリ空間に書き込み、ターゲットプロセスにリモートスレッドを作成してLoadLibrary関数を呼び出すことで、DLLインジェクションを行います。