请选择 进入手机版 | 继续访问电脑版

【2020.12.31】创建进程

[复制链接]
小甜心 发表于 2021-1-2 19:44:20 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
CreateProcess

  1. BOOL CreateProcessA(  LPCSTR                lpApplicationName,     //指向一个NULL末端的、用来指定可执行模块的字符串。  LPSTR                 lpCommandLine,         //指向一个以NULL末端的字符串,该字符串指定要执行的下令行。  LPSECURITY_ATTRIBUTES lpProcessAttributes,   //指向一个SECURITY_ATTRIBUTES布局体,这个布局体决定是否返回的句柄可以被子历程继续。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继续。  LPSECURITY_ATTRIBUTES lpThreadAttributes,    //同lpProcessAttribute,不外这个参数决定的是线程是否被继续,通常置为NULL。  BOOL                  bInheritHandles,       //指示新历程是否从调用历程处继续了句柄。  DWORD                 dwCreationFlags,       //指定附加的、用来控制优先类和历程的创建的标志。还用来控制新历程的优先类,优先类用来决定此历程的线程调理的优先级。  LPVOID                lpEnvironment,         //指向一个新历程的情况块。如果此参数为空,新历程使用调用历程的情况。  LPCSTR                lpCurrentDirectory,    //指向一个以NULL末端的字符串,这个字符串用来指定子历程的工作路径。这个字符串必须是一个包罗驱动器名的绝对路径。如果这个参数为空,新历程将使用与调用历程相同的驱动器和目次。  LPSTARTUPINFOA        lpStartupInfo,         //指向一个用于决定新历程的主窗体如何显示的STARTUPINFO布局体。  LPPROCESS_INFORMATION lpProcessInformation   //指向一个用来吸收新历程的识别信息的PROCESS_INFORMATION布局体。);
复制代码
布局体

STARTUPINFO

历程启动时的相关信息,由父历程填充并通报进来。
  1. typedef struct _STARTUPINFOA {  DWORD  cb;                        //指定该布局巨细  LPSTR  lpReserved;                //生存, 置为NULL  LPSTR  lpDesktop;                //指定一个字符串, 包罗该历程的桌面名或窗口位置名  LPSTR  lpTitle;                //指定控制台历程创建的新控制台窗口标题  DWORD  dwX;                        //指定新窗口左上角的X、Y偏移量(像素点)  DWORD  dwY;  DWORD  dwXSize;                //指定新窗口的宽度和高度  DWORD  dwYSize;  DWORD  dwXCountChars;                //指定新窗口的屏幕缓冲区的宽度和高度  DWORD  dwYCountChars;  DWORD  dwFillAttribute;        //指定新窗口的初始文字和配景颜色  DWORD  dwFlags;                //创建窗口标志  WORD   wShowWindow;                //新窗口的显示状态  WORD   cbReserved2;                //生存, 置为0  LPBYTE lpReserved2;                //生存, 必须置为NULL  HANDLE hStdInput;                //指定一个句柄, 该句柄用作历程的标准输入句柄  HANDLE hStdOutput;                //指定一个句柄, 该句柄用作历程的标准输出句柄  HANDLE hStdError;                //指定一个句柄, 该句柄用作历程的标准错误句柄} STARTUPINFOA, *LPSTARTUPINFOA;
复制代码
PROCESS_INFORMATION

在创建历程时相关的数据布局之一,该布局返回有关新历程及其主线程的信息。
  为什么会有线程句柄和线程ID?
  历程的创建过程中一定会创建一个线程,所以该布局体中含有线程信息就能明白。
  1. typedef struct _PROCESS_INFORMATION {  HANDLE hProcess;        //历程句柄  HANDLE hThread;        //线程句柄  DWORD  dwProcessId;        //历程ID  DWORD  dwThreadId;        //线程ID} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
复制代码
创建历程例子

创建一个IE欣赏器历程,并打开网址。
  1. #include #include //创建子历程BOOL CreateChildProcess(PTCHAR szChildProcessName, PTCHAR szCommandLine){        STARTUPINFO si;        PROCESS_INFORMATION pi;        //ZeroMemory:用0来填充一块内存区域        ZeroMemory(&si, sizeof(si));        ZeroMemory(&pi, sizeof(pi));        //设置当前布局体巨细        si.cb = sizeof(si);        //创建子历程        if (!CreateProcess(                szChildProcessName,        //对象名称                szCommandLine,                //下令行                NULL,                        //不继续历程句柄                NULL,                        //不继续线程句柄                FALSE,                        //不继续句柄                0,                        //没有创建标志                NULL,                        //使用父历程情况变量                NULL,                        //使用父历程目次作为当前目次                //in参数,需要通报进去给函数使用的。                &si,                        //STARTUPINFO 布局体详细信息                //out参数,当执行完后通过该指针写效果,相当于返回值。                &pi                        //PROCESS_INFORMATION 布局体历程信息        ))        {                //如果创建子历程失败, 使用 GetLastError 检察错误信息。                printf("CreateChildProcess Error:%d\n", GetLastError());                return FALSE;        }        //释放句柄        CloseHandle(pi.hProcess);        CloseHandle(pi.hThread);        return TRUE;}int main(int argc, char* argv[]){        TCHAR szApplicationName[] = TEXT("C:\\Program Files\\Internet Explorer\\iexplore.exe");        TCHAR szCmdline[] = TEXT(" https://blog.csdn.net/qq_18120361");        CreateChildProcess(szApplicationName, szCmdline);        return 0;}
复制代码
简单反调试例子

  

  • 由于 STARTUPINFO 布局体是由被创建的历程的父历程填充并通报过来的。
  • 所以差别的父历程通报进来的布局体也大概差别。
  • 可以对该布局体中的内容比力,来判断是否被调试。
  1. #include #include void AntiDebug(){        //当前历程初始化信息        //由该历程的父历程通报进来, 差别的父历程通报的布局体内容大概差别        //可以用于反调试        STARTUPINFO tmp;        //获取历程在启动时的 STARTUPINFO 布局体        GetStartupInfo(&tmp);        //没有打印布局体中的所有内容        printf("%x %x %x %x %x %x %x %x\n", tmp.dwX, tmp.dwY, tmp.dwXCountChars, tmp.dwYCountChars, tmp.dwFillAttribute, tmp.dwXSize, tmp.dwYSize, tmp.dwFlags);        return;}
复制代码
 

来源:https://blog.csdn.net/qq_18120361/article/details/112056569
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )