用CreateProcess启动目标进程,将我们的DLL注入目标进程。 当调用 CreateProcess后会自动返回一个进程句柄,这个时候我们就可以远程插入DLL了
CreateProcess创建暂停进程流程顺序
' 进程信息设置
' CreateProcess启动目标进程,以挂起的方式创建进程,。
' 申请内存空间
' 将DLL路径写入内存
' 获取LoadLibraryA函数地址
' 创建远程线程调用LoadLibraryA函数 远程线程句柄=hThread
' 唤醒主线程
CreateProcess函数
如果以CREATE_SUSPENDED(4) 以挂起的方式创建进程,系统只会分配4G空间,而不会执行拉伸等后续操作,此时可以就可以对这个空间进行注入操作。
.版本 2
.DLL命令 CreateProcessA, 整数型, "kernel32.dll", "CreateProcessA", , 创建进程。
.参数 lpApplicationName, 文本型
.参数 lpCommandLine, 文本型
.参数 lpProcessAttributes, 整数型
.参数 lpThreadAttributes, 整数型
.参数 bInheritHandles, 逻辑型
.参数 dwCreationFlags, 整数型
.参数 lpEnvironment, 整数型
.参数 lpCurrentDriectory, 文本型
.参数 lpStartupInfo, STARTUPINFO
.参数 lpProcessInformation, 进程结构, , 进程结构
.版本 2
.数据类型 STARTUPINFO
.成员 cbSize, 整数型
.成员 lpReserved, 整数型
.成员 lpDesktop, 整数型
.成员 lpTitle, 整数型
.成员 dwX, 整数型
.成员 dwY, 整数型
.成员 dwXSize, 整数型
.成员 dwYSize, 整数型
.成员 dwXCountChars, 整数型
.成员 dwYCountChars, 整数型
.成员 dwFillAttribute, 整数型
.成员 dwFlags, 整数型
.成员 wShowWindow, 长整数型
.成员 cbReserved2, 长整数型
.成员 lpReserved2, 整数型
.成员 hStdInput, 整数型
.成员 hStdOutput, 整数型
.成员 hStdError, 整数型
.数据类型 进程结构
.成员 进程句柄, 整数型, , , hProcess
.成员 线程句柄, 整数型, , , hThread
.成员 进程标识符, 整数型, , , dwProcessId
.成员 线程标识符, 整数型, , , dwThreadId
CreateProcess注入源码:
.版本 2
.支持库 spec
' //进程信息设置
si.cbSize = 254
' si.lpDesktop = “WinSta0\Default”
si.dwFlags = #STARTF_USESHOWWINDOW
si.wShowWindow = #SW_SHOW ' 显示窗口
sret = CreateProcessA (文件名路径, “”, 0, 0, 假, #CREATE_SUSPENDED, 0, 运行目录, si, pi)
调试输出 (sret)
' 申请内存空间
dll文件大小 = 取文本长度 (模块名称) + 1
Param = VirtualAllocEx (pi.进程句柄, 0, dll文件大小, 4096, #PAGE_READWRITE)
调试输出 (“申请内存地址” + 到文本 (Param))
' 将DLL路径写入内存
WriteProcessMemory (pi.进程句柄, Param, 模块名称, 取字节集长度 (到字节集 (模块名称)), 0)
' 获取LoadLibraryA函数地址
LoadlibrarA地址 = GetProcAddress (GetModuleHandleA (“Kernel32.dll”), “LoadLibraryA”)
' 创建远程线程调用LoadLibraryA函数 远程线程句柄=hThread
hThread = CreateRemoteThread (pi.进程句柄, 0, 0, LoadlibrarA地址, Param, 0, 0)
调试输出 (hThread)
.判断开始 (hThread = 0) ' 失败
信息框 (“创建线程注入失败!”, 0, , )
.默认
.判断结束
' 唤醒主线程
ResumeThread (pi.线程句柄)
' 测试
WaitForSingleObject (hThread, -1)
' 关闭
CloseHandle (hThread)