命令行下的工具效率高,速度快,但是當程序的參數太多時,卻不易於使用。所以我們就給它做個界面封裝一下,順 便把我們的大名也加上呵呵為了方便說明我們選用一個比較簡單的程序GetOS.exe它是MS04011工具包中的一個小 工具,主要用來探測目標系統的類型原程序和改造後的效果如圖1和圖2所示
>
參數傳遞:
跟據上面的說明在創建子進程時,可以這樣構建參數傳遞命令
char szCMD[]="c:\getos.exe";
UpdateData(true);
if(m_szIP!="") \m_szIP為EDIT控件用於接受目標IP
...{
char* szIP=m_szIP.LockBuffer();
sprintf(szCMD,"%s %s",szCMD,szIP);//構建參數傳遞命令
CreateProcess(NULL,szCMD,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);//創建進程
}
結果寫入管道:
SECURITY_ATTRIBUTES sa;
PROCESS_INFORMATION pi;
STARTUPINFO si;
HANDLE hRead;
HANDLE hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CreatePipe(&hRead,&hWrite,&sa,0); //創建管道
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si); //設置啟動信息
si.hStdError = hWrite;
si.hStdOutput = hWrite; //將子進程輸出結果寫出管道
si.wShowWindow = SW_HIDE; //隱式調用子程序
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
CreateProcess(NULL,szCMD,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);
把子程序的輸出寫入管道,當子程序執行後就可以用ReadFile來讀取管道的內容
讀取管道內容:
char buffer[4096] = ...{0};
DWord bytesRead;
ReadFile(hRead,buffer,4095,&bytesRead,NULL);//讀取管道內容
m_edit+=buffer; //更新顯示控件
UpdateData(false);
加載資源:
在完成上面的工作以前應該先把CMD程序以資源的形式加載進去,在使用時再釋放出來。加載資源可按
以下步驟
在Resource右鍵選擇IMPORT選擇文件然後輸入類型(比如GETOS)就行了,在使用時可用以下代碼釋放
HRSRC hr=FindResource(0,MAKEINTRESOURCE(IDR_GETOS),"GETOS");\查找資源
if(hr==NULL)
MessageBox("hr error");
dwSize=SizeofResource(NULL,hr);
HGLOBAL hg=LoadResource(NULL,hr);//加載資源
if(hg==NULL)
MessageBox("hg error");
LPSTR lp=(LPSTR)LockResource(hg);//鎖定資源
if(lp==NULL)
MessageBox("lp error");
HANDLE hFile;
hFile = CreateFile("c:\getos.exe",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);//創建文件
if(hFile == NULL)
MessageBox("file error");
WriteFile(hFile,(LPCVOID)LockResource(hg),dwSize,&dwWritten,NULL);//寫入文件
CloseHandle(hFile);