1、进程和线程的区别
1).什么是进程
(来源:百度百科)
计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。
什么是线程
(来源:百度百科)
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
总结:
进程就是一个正在运行的应用程序,是资源分配的最小单位,而一个进程中有着多个线程共同协作来完成一个进程中的不同功能。举个简单的例子,做饭是一个进程,而洗菜,放调料,翻炒这些则为线程。
DLL远线程注入基础
CreateRemoteThread函数及说明
在另一个进程的虚拟地址空间中创建一个线程。
CreateRemoteThread函数原型:
HANDLE WINAPI CreateRemoteThread(
__in HANDLE hProcess,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out LPDWORD lpThreadId
);
参数说明:(来源:百度百科)
hProcess [in]
线程所属进程的进程句柄.
该句柄必须具有 PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE,和PROCESS_VM_READ 访问权限.
lpThreadAttributes [in]
一个指向 SECURITY_ATTRIBUTES 结构的指针, 该结构指定了线程的安全属性.
dwStackSize [in]
线程栈初始大小,以字节为单位,如果该值设为0,那么使用系统默认大小.
lpStartAddress [in]
在远程进程的地址空间中,该线程的线程函数的起始地址.远程进程中线程的起始位置。
lpParameter [in]
传给线程函数的参数.
dwCreationFlags [in]
线程的创建标志.
值————含义
0------------线程创建后立即运行
CREATE_SUSPENDED 0x00000004——————————线程创建后先将线程挂起,直到 ResumeThread 被调用.
STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000————————dwStackSize 参数指定为线程栈预订大小,如果STACK_SIZE_PARAM_IS_A_RESERVATION没有被指定,dwStackSize 参数指定为线程栈分配大小.
lpThreadId [out]
指向所创建线程ID的指针,如果创建失败,该参数为NULL.
进行DLL远程注入
#include <iostream>
#include <Window.h>
void Inject(int pid,char* Path)
{
// 1.打开需要注入的进程,成功则返回目标进程的句柄
// 打开目标进程,成功则返回进程的句柄,失败则返回NULL;第一个参数为获取当前进程可能的所有权限,第二个为是否继承句柄,第三个为进程ID(ProcessId)
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACESS,FALSE,pid);
// 2.申请一块内存给自己写好的DLL的路径
LPVOID pReturnAddress = VirtualAllocEx(hProcess, NULL, strlen(Path) + 1, MEN_CONMMIT, PAGE_READWRITE);
// 3.将路径写入pReturnAddress中,并将此内存写入目标进程中
WriteProcessMemory(hProcess, pReturnAddress, Path, strlen(Path) + 1, Null);
// 4.将DLL加载到调用该进程的地址空间中,并获取LoadLibraryA的句柄,参数为LoadLibraryA所在库的DLL。
HMODULE hModule = LoadLibrary("kernel132.dll");
// 5.需要远程的调用LoadLibraryA方法去加载自己的DLL,所以要先得到LoadLibraryA的函数地址。
LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTIINE)GetProcAddress(hModule, "LoadLibraryA");
// 6.创建一个远程线程,并将DLL注入。成功则返回新线程句柄,失败则返回NULL。
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, pReturnAddress, 0, NULL);
// 7.等待线程返回句柄,防止阻塞
WaitForSingleObject(hThread, 2000);
// 8.防止内存泄漏
CloseHandle(hThread);
CloseHandle(hProcess);
}
int main()
{
// Inject();
system("pause");
return 0;
}
卸载残留的dll模块
// 语法如下
FreeLibrary(HMODULE);
补充:HANDLE、HMODULE的区别:
Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。
系统对内核对象以链表的形式进行管理,载入到内存中的每一个内
核对象都有一个线性地址,同时相对系统来说,在串列中有一个索引位置,这个索引位置就是内核对象的handle。
HMODULE 是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。
结束语
本文为个人看视屏的学习笔记,功力不足,仅供参考,如发现不足还望指出。