目录
1.远程线程注入
原理:利用CreateRemoteThread()函数,将自己创建的的线程加载到远程空间进程里去执行。
CreateRemoteThread function (processthreadsapi.h) - Win32 apps | Microsoft Docs
注入流程:
- OpenProcess 打开被注入进程句柄。
- VirtualAllocEx 在注入进程里申请空间,用于存放注入插件路径的字符串,不然在注入进程里找不到参数。
- WriteProcessMemory 往申请的空间里写路径字符串
- CreateRemoteThread 注入进程,函数第四个参数写LoadLibrary,因为LoadLibrary函数地址在Kernel32.dll中,在每个进程中映射地址都一样,所以不需要再去注入进程查找该函数地址了。第五个参数写路径字符串地址,为LoadLibrary函数的参数。
- WaitForSingleObject 等待线程执行完成返回,VirtualFreeEx释放申请空间。
示例代码:
#define TARGETEXE L"notepad.exe"
WCHAR InjectDll[] = L"C:\\Users\\k\\source\\repos\\ConsoleApplication3\\x64\\Release\\TestDll.dll";
DWORD dTargetpid = 0;
{
HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32W pe32;
pe32.dwSize = sizeof(PROCESSENTRY32W);
if (Process32FirstW(hSnapshot, &pe32))
{
do {
if (wcscmp(pe32.szExeFile, TARGETEXE) == 0)
{
dTargetpid = pe32.th32ProcessID;
break;
}
} while (Process32NextW(hSnapshot, &pe32));
}
}
CloseHandle(hSnapshot);
}
HANDLE hTargethandle = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dTargetpid);
if (hTargethandle != INVALID_HANDLE_VALUE)
{
//必须具备 PROCESS_VM_OPERATION 访问权限
LPVOID vaAddress = VirtualAllocEx(hTargethandle, NULL, sizeof(InjectDll), MEM_COMMIT, PAGE_READWRITE);
if (vaAddress != nullptr)
{
if (WriteProcessMemory(hTargethandle, vaAddress, InjectDll, sizeof(InjectDll), NULL))
{
HMODULE hKernel32module = GetModuleHandle(L"kernel32.dll");
if (hKernel32module)
{
LPTHREAD_START_ROUTINE loadLibraryFunction = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32module, "LoadLibraryW");
//必须具备 PROCESS_CREATE_THREAD、 PROCESS_QUERY_INFORMATION、 PROCESS_VM_OPERATION、 PROCESS_VM_WRITE和 PROCESS_VM_REA

本文详细解析远程线程注入、消息钩子、输入法、注册表、EIP、APC及SSDT替换等Windows系统常见的代码注入技术,包括原理、流程和注意事项,以及防注入策略的探讨。
最低0.47元/天 解锁文章
2万+





