使用CreateProcess函数实现隐秘的程序调用

// 所有原创文章转载请注明作者及链接
//
blackboycpp(AT)gmail.com
// QQ群: 135202158

 

 

有时候,我们需要在自己的程序里调用另一个程序,比如说一个控制台程序,然后希望利用它的输出。

简单的调用system, WinExec, ShellExecute等当然都是可以完成这个目的的,但是呢,这几个函数执行时会蹦出一个黑黑的控制台窗口来,显得我们的程序很不专业:D  所以呢,为了达到掩人耳目的目的,我们可以使用CreateProcess函数。

 

下面是一个小例子:

使用CreateProcess函数实现隐秘的程序调用_第1张图片

 

void CCPTFDlg::OnBnClickedBtnPing() { UpdateData(TRUE); // 拼接要执行的命令行,如"ping.exe www.google.com" CString sAddr; GetDlgItem(IDC_EDIT_ADDR)->GetWindowText(sAddr); CString sCmdLine = _T("ping.exe ") + sAddr; // 设置文件句柄安全属性 SECURITY_ATTRIBUTES sa; ::ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; // 必须为TRUE sa.lpSecurityDescriptor = NULL; // 创建将重定向到的文件的句柄 HANDLE hFile = ::CreateFile(_T("NetStatus.txt"), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // 确定文件句柄的正确创建 ASSERT(hFile != INVALID_HANDLE_VALUE); // 设置进程的启动信息,这是一个输入参数 STARTUPINFO si; ::ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; // 这个必须设置,否则仍将显示窗口 si.hStdOutput = hFile; // 默认为标准输出,即控制台窗口。我们必须把它设置成刚才创建的文件句柄 si.wShowWindow = SW_HIDE; // 不显示窗口 // 设置进程信息,这是一个输出参数。我们需要从这个结构中取得创建成功的进程及其主线程的句柄 PROCESS_INFORMATION pi; ::ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); // 使用刚才设置的各个参数创建隐秘的进程 // 此进程将把ping程序运行的结果写到NetStatus.txt文件 BOOL hRet = FALSE; hRet = ::CreateProcess(NULL, sCmdLine.GetBuffer(), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); ASSERT(hRet == TRUE); // 等待进程对象的结束。即等待ping程序运行完成 ::WaitForSingleObject(pi.hProcess, INFINITE); // 清理资源 ::CloseHandle(pi.hProcess); ::CloseHandle(pi.hThread); ::CloseHandle(hFile); // 打开刚才写好的文本文件,并将其写到图形界面上。各个过程,用户没有感觉执行了ping.exe CFile fTxt(_T("NetStatus.txt"), CFile::modeRead); ASSERT(fTxt.m_hFile != NULL); char* pszContent = new char[(unsigned int)fTxt.GetLength() + 1]; ::ZeroMemory(pszContent, (size_t)fTxt.GetLength() + 1); fTxt.Read(pszContent, (UINT)fTxt.GetLength()); fTxt.Close(); ::DeleteFile(_T("NetStatus.txt")); GetDlgItem(IDC_EDIT_OUT)->SetWindowText(CString(pszContent)); delete pszContent; }

 

你可能感兴趣的:(Security,File,null,delete,System,attributes)