zoukankan      html  css  js  c++  java
  • 进程

    1.    进程实例句柄: hInstance .将进程数据加载到内存基地址
    2.    进程命令行. 获取命令行指针: PTSTR GetCommandLine();
    3.    环境变量: GetEnvironmentStrings(),FreeEnvironmentStrings()
    DWORD GetEnvironmentVariable(PCTSTR pszName,PTSTR pszValue,DWORD cchValue);
    4.    进程关联性
    5.    错误模式UINT SetErrorMode(UINT fuErrorMode);
    6.    进程所在驱动器和目录. 被该进程所有线程共享.
    DWORD GetCurrentDirectory(DWORD cchCurDir,PTSTR pszCurDir);
        BOOL SetCurrentDirectory(PCTSTR pszCurDir);
    7.    进程创建
     BOOL CreateProcess(
    PCTSTR pszApplicationName,  //可执行文件名称
    PTSTR pszCommandLine,            //传入的命令行,非常量字符串
    PSECURITY_ATTRIBUTES psaProcess,                //NULL, 默认
    PSECURITY_ATTRIBUTES psaThread,                //NULL, 默认
    BOOL bInheritHandles,                                //FALSE
    DWORD fdwCreate,                                        //NULL 默认打开界面方式
    PVOID pvEnvironment,                                    //GETenvironment()或者默认
    PCTSTR pszCurDir,                                        //exe的目录或者NULL
    PSTARTUPINFO psiStartInfo,                        //ps初始为大小带入
    PPROCESS_INFORMATION ppiProcInfo);            //进程id和句柄等信息构成的结构体
    8.    进程枚举函数: EnumProcesses(pids, sizeof(pids), &pSize)
       第一个参数: dword类型数组, 第2个参数该数组字节数, 第3个参数存储返回的pid值*大小字节数.  枚举后的进程id复制到pids数组中.如pNum = pSize / sizeof(DWORD);for (int i = 0; i < pNum; i++)    printf("%d
    ", pids[i]);
    打开进程 : HANDLE WINAPI OpenProcess(
      _In_ DWORD dwDesiredAccess,
      _In_ BOOL  bInheritHandle,
      _In_ DWORD dwProcessId
    ); 得到进程id句柄后,枚举进程模块EnumProcessModules(参数和枚举进程类似). 获取进程名: GetModuleBaseName(参数和枚举进程类似)

    进程权限问题安全token, sid,安全描述符,所有者标识. acl,ace luid

    安全令牌, 筛选的令牌 token 相关api:

    v OpenProcessToken  3个参数1.进程句柄,访问方式,token句柄地址

    v OpenThreadToken 类似

    v AdjustTokenGroups

    v AdjustTokenPrivileges

    v GetTokenInformation

    v SetTokenInformation

    主要是特权问题:

    1.获取进程token信息:

    首先定义缓冲区:

    PTOKEN_PRIVILEGES  pTokeninfo = (PTOKEN_PRIVILEGES)malloc(1000);

    返回的长度: DWORD dwLength;

    获取信息:    

    GetTokenInformation(hToken,TokenPrivileges,pTokeninfo,buffsize,&dwLength);

    遍历获取信息,和该结构体有关 TokenPrivileges

         for (iCount=0;iCount<pTokeninfo->PrivilegeCount;iCount++)

         {

           //重复使用缓冲区前清空缓冲区

         memset(PrivilegeDisplayName,'',sizeof(PrivilegeDisplayName));

         memset(PrivilegeName,'',sizeof(PrivilegeName));

         NameLength=sizeof(PrivilegeName)/sizeof(TCHAR);

         DisplayNameLength=sizeof(PrivilegeDisplayName)/sizeof(TCHAR);

           LookupPrivilegeName(NULL,  //本地系统

             &(pTokeninfo->Privileges[iCount].Luid), //luid地址

             PrivilegeName,  //存放特权字符串首地址

             &NameLength  //返回多长到缓存区中

             );

           LookupPrivilegeDisplayName(NULL,

             PrivilegeName,  //英文特权名称

             PrivilegeDisplayName, //目标语言特权名称

             &DisplayNameLength, //返回多长

             &langID); //语言id}

    2.提权(激活权限): 这里所谓的提权只是将进程禁用的原有的权限进行激活,不能将原来不存在的权限赋予给它.所以非管理员权限运行的程序一般没有SE_DEBUG_NAME权限,所以无法通过这种方式进行提权.

      OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &tH);

    LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&NewTUid.Privileges[0].Luid);

      NewTUid.PrivilegeCount=1;

    NewTUid.Privileges->Attributes=SE_PRIVILEGE_ENABLED;

      //参数说明: 1,本进程token句柄,2,不禁用.3token地址,token包含了想要的特权  //4,token结构大小.56参数全为0,没用.

    AdjustTokenPrivileges(tH,FALSE,&NewTUid,sizeof(NewTUid),NULL,NULL);

    3.以管理员权限执行一个子进程

    SHELLEXECUTEINFO se={sizeof(SHELLEXECUTEINFO)};//这个结构体只需要初始化4个参数

      se.lpVerb=TEXT("runas");//硬编码了

      se.lpFile=TEXT("F:\c_project\练习\release\安全性.exe");//exe路径

      se.nShow=SW_SHOWNORMAL;//正常显示

      ShellExecuteEx(&se);//调用

    二.获取进程信息类

    #pragma once
    
    #ifndef __PRO_H_
    #define __PRO_H_
    #include "stdafx.h"
    class process
    {
    public:
        //提供进程id进行获取信息或者提供进程名获取信息
        process(DWORD processId);
        process(WCHAR* processName);
        ~process();
        
        void getProcessPath(WCHAR* processName);
        void getProcessExePath(WCHAR* exePath);
        DWORD getProcessParentId();
        DWORD getProcessNumThreads();
        DWORD getProcessId();
        HANDLE getProcessHandle();
        void setProcessInfo();
        void setModulesPath();
        void showProcessInfo();
        static DWORD findProcessNameById(DWORD processId,WCHAR* processName);
        static DWORD findProcessIdByName(WCHAR* processName);
        static HANDLE getProcessHandle(DWORD flags, DWORD processId);
        void setProcessHandle(DWORD desireAccess);
        
    private:
        WCHAR processName[MAX_PATH];
        WCHAR exePath[MAX_PATH];
        DWORD processId;
        HANDLE hHandle;
        DWORD numThreads;
        DWORD th32ParentProcessID;
        DWORD numModules;
        WCHAR moduleNames[20][MAX_PATH]; //默认最多获取20个模块名字
    };
    
    process::process(DWORD processId)
    {
        memset((void*)(this->exePath), 0, sizeof(this->exePath));
        memset((void*)(this->processName), 0, sizeof(this->processName));
        this->numThreads = 0;
        this->processId = processId;
        this->hHandle = INVALID_HANDLE_VALUE;
        this->th32ParentProcessID = 0;
        for (int i=0;i<20;i++)
        {
            memset(this->moduleNames[i], 0, sizeof(this->moduleNames[i]));
        }
        setProcessInfo();
        setModulesPath();
        lstrcpy(this->exePath, this->moduleNames[0]);
    }
    
    process::process(WCHAR * processName)
    {
        memset((void*)(this->exePath), 0, sizeof(this->exePath));
        memset((void*)(this->processName), 0, sizeof(this->processName));
        wcscpy(this->processName, processName);
        this->numThreads = 0;
        this->processId = 0;
        this->hHandle = INVALID_HANDLE_VALUE;
        this->th32ParentProcessID = 0;
        for (int i = 0; i < 20; i++)
        {
            memset(this->moduleNames[i], 0, sizeof(this->moduleNames[i]));
        }
        setProcessInfo();
        setModulesPath();
        lstrcpy(this->exePath, this->moduleNames[0]);
    }
    
    process::~process()
    {
        memset((void*)(this->exePath), 0, sizeof(this->exePath));
        memset((void*)(this->processName), 0, sizeof(this->processName));
        if (this->hHandle!=INVALID_HANDLE_VALUE)
        {
            CloseHandle(hHandle);
        }
        this->numThreads = 0;
        this->processId = processId;
        this->hHandle = INVALID_HANDLE_VALUE;
        this->th32ParentProcessID = 0;
        for (int i = 0; i < 20; i++)
        {
            memset(this->moduleNames[i], 0, sizeof(this->moduleNames[i]));
        }
    }
    
    inline void process::getProcessPath(WCHAR* processName)
    {
        wcscpy(processName, this->processName);
    }
    
    inline void process::getProcessExePath(WCHAR * exePath)
    {
        wcscpy(exePath, this->exePath);
    }
    
    inline DWORD process::getProcessParentId()
    {
        return this->th32ParentProcessID;
    }
    
    inline DWORD process::getProcessNumThreads()
    {
        return this->numThreads;
    }
    
    inline DWORD process::getProcessId()
    {
        return this->processId;
    }
    
    inline HANDLE process::getProcessHandle()
    {
        return this->hHandle;
    }
    
    inline void process::setProcessInfo()
    {
        /************************************************************************/
        /* 循环遍历进程快照,先判断是否提供进程id进行寻找  ,否则判断是否提供进程名进行寻找
        如果都没提供就直接退出
        关注: 进程路径, 进程id,父进程id,进程线程数
        */
        /************************************************************************/
        PROCESSENTRY32W process;
        HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        process.dwSize = sizeof(PROCESSENTRY32W);
        DWORD result = 0;
        if (this->processId!=0)
        {
            result = Process32FirstW(hProcessSnap, &process);
            do
            {
                if (result)
                {
                    if (process.th32ProcessID == this->processId)
                    {
                        //_tcscpy(this->exePath, process.szExeFile);
                        this->numThreads = process.cntThreads;
                        wcscpy(this->processName, process.szExeFile);
                        this->th32ParentProcessID = process.th32ParentProcessID;
                        break;
                    }
                }
                else
                {
                    break;
                }
    
            } while (Process32NextW(hProcessSnap, &process));
            
        }
        else if(this->processName!=NULL)
        {
            result = Process32FirstW(hProcessSnap, &process);
            do
            {
                if (result)
                {
                    if (lstrcmpW(this->processName,process.szExeFile)==0)
                    {    
                        this->numThreads = process.cntThreads;
                        this->processId = process.th32ProcessID;
                        this->th32ParentProcessID = process.th32ParentProcessID;
                        break;
                    }
                    
                }
                else
                {
                    break;
                }
    
            } while (Process32NextW(hProcessSnap, &process));
        }
    
        CloseHandle(hProcessSnap);
    }
    
    void process::setModulesPath()
    {
        MODULEENTRY32W me;
        me.dwSize = sizeof(MODULEENTRY32W);
        HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, this->processId);
        if (Module32FirstW(hSnap,&me))
        {
            lstrcpy(this->moduleNames[0], me.szExePath);    
            for (int i=1;i<20;i++)
            {
                lstrcpy(this->moduleNames[i], me.szExePath);
                if (!Module32NextW(hSnap, &me))
                {
                    break;
                }
            }
        }
        CloseHandle(hSnap);
    }
    
    DWORD process::findProcessNameById(DWORD processId,WCHAR* processName)
    {
        //向外提供的查询信息函数,processName用于接收信息,获取成功返回1,否则返回0
        PROCESSENTRY32W process;
        HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        process.dwSize = sizeof(PROCESSENTRY32W);
        do 
        {
            if (Process32FirstW(hProcessSnap, &process))
            {
                if (process.th32ProcessID == processId)
                {
                    CloseHandle(hProcessSnap);
                    wcscpy(processName, process.szExeFile);
                    return 1;
                }
            }
    
        } while (Process32NextW(hProcessSnap,&process));
        CloseHandle(hProcessSnap);
        return 0;
    }
    
    DWORD process::findProcessIdByName(WCHAR * processName)
    {
        PROCESSENTRY32W process;
        HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        process.dwSize = sizeof(PROCESSENTRY32W);
        do
        {
            if (Process32FirstW(hProcessSnap, &process))
            {
                if (lstrcmp(processName,process.szExeFile) == 0)
                {
                    CloseHandle(hProcessSnap);
                    return process.th32ProcessID;
                }
            }
    
        } while (Process32NextW(hProcessSnap, &process));
        CloseHandle(hProcessSnap);
        return NULL;
    }
    
    HANDLE process::getProcessHandle(DWORD flags, DWORD processId)
    {
        //先激活权限
        HANDLE hToken;
        LUID newLuid;
        TOKEN_PRIVILEGES tr;
        tr.PrivilegeCount = 1;
        tr.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
    
        OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &newLuid);
        tr.Privileges->Luid = newLuid;
    
        AdjustTokenPrivileges(hToken, FALSE, &tr, sizeof(tr), 0, 0);
        if (GetLastError() == ERROR_SUCCESS)
        {
            CloseHandle(hToken);
            return INVALID_HANDLE_VALUE;
        }
        CloseHandle(hToken);
        return OpenProcess(flags,0,processId);
    }
    
    void process::setProcessHandle(DWORD desireAccess)
    {
        //先激活权限
        HANDLE hToken;
        LUID newLuid;
        TOKEN_PRIVILEGES tr;
        tr.PrivilegeCount = 1;
        tr.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
    
        OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &newLuid);
        tr.Privileges->Luid = newLuid;
    
        AdjustTokenPrivileges(hToken, FALSE, &tr, sizeof(tr), 0, 0);
        this->hHandle = OpenProcess(desireAccess, 0, this->processId);
        CloseHandle(hToken);
    }
    
    inline void process::showProcessInfo()
    {
        wprintf(L"进程名:%ls
    ", this->processName);
        wprintf(L"进程路径:%ls
    ", this->exePath);
        wprintf(L"进程句柄:%d
    ", (DWORD)this->hHandle);
        wprintf(L"进程id:%d
    ", this->processId);
        wprintf(L"父进程id:%d
    ", this->th32ParentProcessID);
        wprintf(L"创建的线程数:%d
    ", this->numThreads);
        wprintf(L"加载的模块:
    ");
        for (int i=1;i<20;i++)
        {
            if (lstrlen(this->moduleNames[i]))
            {
                wprintf(L"%ls
    ", this->moduleNames[i]);
            }
        }
    
    }
    
    #endif // __PRO_H_
  • 相关阅读:
    Java通过Mybatis实现批量插入数据到Oracle中
    SpringMVC+Spring+Mybatis整合,使用druid连接池,声明式事务,maven配置
    图片懒加载原理
    js参考---sort函数
    css参考---纯css实现三角形
    css参考---实现元素水平垂直居中
    javascript疑难问题---13、函数防抖
    javascript疑难问题---12、函数节流
    闭包执行注意(函数节流为例)
    javascript疑难问题---11、回调函数
  • 原文地址:https://www.cnblogs.com/freesec/p/6516868.html
Copyright © 2011-2022 走看看