- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
进程基础
进程的定义与概念
进程的组成
创建进程
可执行文件
CreateProces
执行流程
GetStartupInfo
进程终止
进程句柄
创建进程
打开进程
进程提权
内核模拟
回溯对象
自身进程
-
进程基础
-
进程的定义与概念
-
什么是进程?
-
进程可以被定义为一个执行中程序的实例。
-
进程提供了程序执行所需的所有资源和环境。
-
进程与程序的区别
-
程序是一组指令和静态数据的集合,它是存储在磁盘或其他永久存储设备上的一个文件。
-
进程,与之相对,是程序的动态执行实例。程序本身不执行任何操作;当它被操作系统加载到内存并开始执行时,它变成一个或多个进程。
-
-
进程的组成
-
进程内存布局(代码段、数据段、堆、栈等)
-
代码段(Text Segment)
-
也称为文本区域,包含程序的可执行代码。
-
通常是只读的,以防止程序自我修改。
-
-
数据段(Data Segment)
-
存储程序中的全局变量和静态变量。
-
根据变量是否初始化分为初始化的数据段和未初始化的数据段(BSS)。
-
-
堆(Heap)
-
用于动态内存分配,如C中的
malloc
或C++中的new
操作。 -
堆的大小可以在运行时动态扩展和收缩。
-
-
栈(Stack)
-
存储函数的局部变量、函数参数、返回地址等。
-
每当调用新函数时,系统会自动在栈上分配空间。函数返回时,相应的栈空间被释放。
-
-
进程上下文和环境
-
包含了操作系统用于管理和调度进程的所有信息。这包括进程的状态(运行、就绪、等待)、程序计数器、寄存器内容、打开的文件描述符、安全属性、进程ID等。
-
-
创建进程
-
可执行文件
-
Windows 平台的可执行文包括exe、dll、sys 等扩展名的文件。
-
exe是指可执行(executable),创建进程必须使用exe 文件。
-
dll是动态链接库,一些基础、共用的代码和数据存在于 d1l文件中。
-
sys 是内核驱动程序。
-
Windows 平台的可执行文件基本都是PE格式的。
-
-
-
CreateProces
-
#include <iostream> #include <Windows.h> int main() { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); si.cb = sizeof(si); TCHAR szCmd[] = TEXT("notepad.exe \"123.txt\""); CreateProcess( /*TEXT("C:\\Windows\\System32\\notepad.exe")*/NULL, szCmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); return 0; }
-
-
执行流程
-
进程的启动过程
-
进程的启动通常是由用户发起的一个事件,如双击应用程序图标、从命令行运行可执行文件、系统启动时自动运行等。
-
用户行为或触发事件:用户通过各种方式请求启动一个程序,如通过用户界面或命令行。
-
操作系统响应:操作系统响应这一请求,调用相关系统函数例如
CreateProcess
,ShellExecute
等。 -
创建进程对象:操作系统分配进程标识符(PID),创建进程所需的内核对象和数据结构。
-
分配资源:为新进程分配内存,打开必需的系统资源和文件。
-
创建主线程:操作系统创建进程的主线程,并将其指向程序的入口点。
-
开始执行:主线程开始执行,加载程序代码到内存,初始化程序,开始执行程序指令。
-
加载需要的动态链接库:程序如果依赖于其他动态链接库(DLLs),操作系统将它们加载到进程空间中。
-
执行完成:主线程执行完成后,它将退出。如果是多线程程序,所有线程都结束后,进程才真正结束。
-
-
主线程和工作线程
-
当一个进程启动时,操作系统会创建一个线程来执行程序代码,这个线程被称为主线程。在多线程程序中,除了主线程外,还可以创建额外的线程,这些线程称为工作线程。
-
主线程:
-
是程序执行的入口点。
-
负责执行程序初始化和调用其他线程。
-
主线程结束时,通常意味着进程的结束。
-
-
工作线程:
-
是由主线程显式创建的用于执行特定任务的线程。
-
可以同时执行多个任务,与主线程并行工作。
-
可以提高应用程序性能,尤其是在多核处理器上运行时。
-
-
-
-
GetStartupInfo
-
#include <iostream> #include <Windows.h> int main() { STARTUPINFO si = { sizeof(si) }; GetStartupInfo(&si); return 0; }
-
进程终止
- 进程终止是操作系统中进程生命周期的最后一个阶段。
- ExitProcess
-
#include <iostream> #include <Windows.h> /* void ExitProcess ( [in] UINT uExitCode //进程和所有线程的退出代码 ); */ int main() { //结束自身 ExitProcess(0/*GetExitCodeProcess*/); return 0; }
-
- TerminateProcess
-
#include <iostream> #include <Windows.h> /* BOOL TerminateProcess ( [in] HANDLE hProcess, //终止进程句柄 [in] UINT uExitCode //进程退出代码 ); */ int main() { STARTUPINFO si = { 0 }; si.cb = sizeof(si); PROCESS_INFORMATION pi = { 0 }; BOOL bRet = CreateProcess( TEXT("D:\\Debug\\PE_Die\\die.exe"), NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi ); if (bRet == 0) return 0; system("pause"); TerminateProcess(pi.hProcess, 0/*GetExitCodeProcess*/); return 0; }
-
- ExitProcess
进程句柄
-
创建进程
-
CreateProcess - ProcessInformation - ProcessHandle
typedef struct _PROCESS_INFORMATION { HANDLE hProcess; //新创建进程的句柄。 HANDLE hThread; //新创建的进程的主线程的句柄。 DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
-
-
打开进程
-
OpenProcess
- 打开一个已经存在的进程并获取对应进程句柄。
-
#include <iostream> #include <Windows.h> int main() { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 2036/*进程ID*/); if (hProcess != NULL) { if (!TerminateProcess(hProcess, 0)) { std::cout << GetLastError() << std::endl; } } return 0; }
-
-
进程提权
-
OpenProcessToken;
-
LookupPrivilegeValue;
-
AdjustTokenPrivileges;
#include <iostream> #include <Windows.h> int main() { HANDLE hProcess = NULL; HANDLE hToken = NULL; LUID luid = { 0 }; TOKEN_PRIVILEGES tp = { 0 }; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { std::cout << "OpenProcessToken ErrorCode -> " << GetLastError() << std::endl; return 0; } if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) { std::cout << "LookupPrivilegeValue ErrorCode -> " << GetLastError() << std::endl; return 0; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { return 0; } return 0; }
-
内核模拟
- 示例代码
#include <iostream>
#include <Windows.h>
int main()
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 2576/*进程ID*/);
if (hProcess != NULL)
{
printf("%x \r\n", hProcess);
system("pause");
}
return 0;
}
-
定位进程程
-
查找句柄
回溯对象
自身进程
- GetCurrentProcess
-
#include <iostream> #include <Windows.h> int main() { HANDLE hProcess = GetCurrentProcess(); TerminateProcess(hProcess, 0); return 0; }
-
- GetCurrentProcessId
-
#include <iostream> #include <Windows.h> int main() { DWORD dwPid = GetCurrentProcessId(); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); TerminateProcess(hProcess, -1); return 0; }
-