- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
进程基础
进程的定义与概念
进程的组成
创建进程
可执行文件
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; }
 
-  



















