Handle WINAPI CreateRemoteThread(
hProcess,线程所属进程的进程句柄
lpThreadAttributes,指向SECURITY_ATTRIBUTES结构指针,线程安全属性,Null。
dwStackSize,线程初始大小,0为默认。
lpStartAddress,地址空间中,线程函数起始地址。
lpParameter,传递线程函数的参数
dwCreationFlags,线程的穿件标志
lpThreadID
);
原理:目标进程中开启一个线程载入LoadLibrary(Ex)。
步骤:
1.VirtualAllocEx在远程你想要注入的程序进程空间分配一块内存存放参数。(
2.WriteProcessMemory复制Dll路径到那个程序进程申请的内存中。
3.GetProcAddress获取LoadLibrary(Ex)在那个远程进程分配的实际地址。
4.CreateRemoteThread远程程序中新创建一个线程,新线程调用LoadLibrary(Ex),传入分配的内存地址。
加载就完事了,然后干活,干完活就干下面的
5.GetProcAddress获得FreeLibrary地址。
6.CreateRemoteThread创建线程,新线程调用那个FreeLibrary地址,传入Dll的HMODULE.
7.VirturalFreeE释放内存。
我靠,弄了这么复杂。
其实1和7不用想都得有,你远程没有内存地址,你还调用个屁啊。申请内存不释放内存不是好习惯。
具体代码:
//提升权限
AdjustProcessTokenPrivilege();
//打开目标进程
hProcess=OpenProcess(PROCESS_ALL_ACCESS所有权限,FALSE,dwProcessId);
//为目标进程分配内存
lpParaAddress=VirtualAllocEx(hProcess,NULL,strlen(pDllname)这里是Dll路径,MEM_COMMIT|MEM_RESERVER,PAGE_EXECUTE_READWRITE);
//讲要注入的Dll路径写入到目标进程
WriteProcessMemory(hProcess,lpParaAddress,pDllName,strlen(pDllName),0);
//获得LoadLibrary的地址
lpStartAddress=(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHand("kernel32"),"LoadLibraryA");
//创建远程线程执行注入DLL操作
hRemoteThread=CreateRomoteThread(hProcess,NULL,lpStartAddress,lpParaAddress,0,NULL);
//等待加载完毕
WaitForSingleObject(hRemoteThread.INFINITE);