远程线程注入DLL
1.提升本进程的系统权限
2.进入宿主的内存空间
a.OpenProcess(),修改宿主进程的一些属性,如允许远程创建线程等
c.WriteProcessMemory(),往宿主内存中写入DLL名称
3.在宿主中启动新的线程
a.GetProcAddress(),得到Kernel32.dll中的函数LoadLibraryW(A)的入口地址
b.CreateRemoteThread(),创建远程线程,让其附加执行我们的DLL代码
2.进入宿主的内存空间
a.OpenProcess(),修改宿主进程的一些属性,如允许远程创建线程等
HANDLE OpenProcess(
DWORD dwDesiredAccess, // 访问标志
BOOL bInheritHandle, // 继承句柄标志
DWORD dwProcessId // 进程ID
);
b.VirtualAllocEx(),在宿主进程中开辟一块内存空间,用来存放DLL的文件名DWORD dwDesiredAccess, // 访问标志
BOOL bInheritHandle, // 继承句柄标志
DWORD dwProcessId // 进程ID
);
LPVOID VirtualAllocEx(
HANDLE hProcess, // 宿主进程句柄
LPVOID lpAddress, // 分配空间的起始地址,一般用NULL,这样会在系统认为最合适的位置分配
SIZE_T dwSize, // 分配空间的大小
DWORD flAllocationType, // 分配空间的类型,一般用MEM_COMMIT为指定空间提交物理内存
DWORD flProtect // 访问保护类型,PAGE_READWRITE表示可读可写
);
HANDLE hProcess, // 宿主进程句柄
LPVOID lpAddress, // 分配空间的起始地址,一般用NULL,这样会在系统认为最合适的位置分配
SIZE_T dwSize, // 分配空间的大小
DWORD flAllocationType, // 分配空间的类型,一般用MEM_COMMIT为指定空间提交物理内存
DWORD flProtect // 访问保护类型,PAGE_READWRITE表示可读可写
);
c.WriteProcessMemory(),往宿主内存中写入DLL名称
BOOL WriteProcessMemory(
HANDLE hProcess, // 宿主进程的句柄
LPVOID lpBaseAddress, // 要写的内存地址
LPCVOID lpBuffer, // 要写入数据的缓冲区指针
SIZE_T nSize, // 要写入的bytes数
SIZE_T * lpNumberOfBytesWritten // 实际写入的bytes数
);
HANDLE hProcess, // 宿主进程的句柄
LPVOID lpBaseAddress, // 要写的内存地址
LPCVOID lpBuffer, // 要写入数据的缓冲区指针
SIZE_T nSize, // 要写入的bytes数
SIZE_T * lpNumberOfBytesWritten // 实际写入的bytes数
);
3.在宿主中启动新的线程
a.GetProcAddress(),得到Kernel32.dll中的函数LoadLibraryW(A)的入口地址
b.CreateRemoteThread(),创建远程线程,让其附加执行我们的DLL代码
HANDLE CreateRemoteThread(
HANDLE hProcess, // 被注入进程的句柄
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全指针一般NULL就可以了
SIZE_T dwStackSize, // 线程初始化尺寸,一般用0
LPTHREAD_START_ROUTINE lpStartAddress, // 一个指向要执行线程函数的指针
LPVOID lpParameter, // 函数的参数
DWORD dwCreationFlags, // 控制创建标志,用0表示线程立刻执行
LPDWORD lpThreadId // 返回标识变量我觉得没什么用,反正句柄都有了
HANDLE hProcess, // 被注入进程的句柄
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全指针一般NULL就可以了
SIZE_T dwStackSize, // 线程初始化尺寸,一般用0
LPTHREAD_START_ROUTINE lpStartAddress, // 一个指向要执行线程函数的指针
LPVOID lpParameter, // 函数的参数
DWORD dwCreationFlags, // 控制创建标志,用0表示线程立刻执行
LPDWORD lpThreadId // 返回标识变量我觉得没什么用,反正句柄都有了