想通过匿名管道实现对hashcat这个程序的控制,即模拟键盘输入与获取输出。问题如下:程序运行后,可以通过一些按键来进行控制,如下图
。
按下s键后可以显示一些信息,如下图
。
想要通过匿名管道实现对这个程序的控制,并接受显示信息。程序启动后打印的信息可以正常接受,我创建的匿名管道感觉应该没有什么问题,我尝试创建cmd程序,然后通过管道输入"cmd\n",子程序执行,并回显。
程序的代码如下
#include"windows.h"
#include"tchar.h"
#include
usingstd::wstring;
DWORDWINAPIThreadWritePipe(LPVOIDlParam)
{
HANDLEhWrite=*(HANDLE*)lParam;
DWORDdwWritten;
while(1)
{
Sleep(1000);
DWORDtoWrite=3;
charctrlc[2]={0x03,0};
WriteFile(hWrite,"s",1,&dwWritten,NULL);
}
}
voidmain()
{
SECURITY_ATTRIBUTESsa;
HANDLEhRead,hWrite2,hRead2,hWrite;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;//使用系统默认的安全描述符
sa.bInheritHandle=TRUE;//创建的进程继承句柄
if(!CreatePipe(&hRead,&hWrite,&sa,0))//创建匿名管道,作为子进程的输出。
{
::MessageBox(NULL,_T("CreatePipeFailed!"),_T("提示"),MB_OK|MB_ICONWARNING);
return;
}
if(!CreatePipe(&hRead2,&hWrite2,&sa,0))//创建匿名管道,作为子进程的输入。
{
::MessageBox(NULL,_T("CreatePipeFailed!"),_T("提示"),MB_OK|MB_ICONWARNING);
return;
}
STARTUPINFOsi;
PROCESS_INFORMATIONpi;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdInput=hRead2;//子进程读,即是父进程写
si.hStdError=hWrite;
si.hStdOutput=hWrite;//新创建进程的标准输出连在写管道一端
si.wShowWindow=SW_HIDE;//隐藏窗口
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
wstringinputcmd=_T("E:\\Security\\Project\\CrackFile\\CrackFile\\Debug\\cuda\\cuda\\cudahashcat64-m13000-a0E:\\Security\\Project\\CrackFile\\CrackFile\\Debug\\cuda\\filehash.txt\
E:\\Security\\Project\\CrackFile\\hashcat-3.10\\dict.txt-oE:\\Security\\Project\\CrackFile\\CrackFile\\Debug\\cuda\\out.txt");
if(!CreateProcess(NULL,(LPWSTR)inputcmd.c_str(),NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))//创建子进程
{
inta=GetLastError();
::MessageBox(NULL,_T("CreateProcessFailed!"),_T("提示"),MB_OK|MB_ICONWARNING);
return;
}
DWORDdwId;
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadWritePipe,&hWrite2,0,&dwId);
CloseHandle(hWrite);//关闭管道句柄
//CloseHandle(hRead2);
DWORDdwWritten;
//WriteFile(hWrite2,"sssss",5,&dwWritten,NULL);
inta=GetLastError();
charbuffer[4096]={0};
DWORDbytesRead;
while(1){
PeekNamedPipe(hRead,buffer,4095,&bytesRead,NULL,NULL);
if(bytesRead==0)continue;
if(ReadFile(hRead,buffer,4095,&bytesRead,NULL)==NULL)//读取管道
break;
}
TCHARtBuffer[4096];
_sntprintf_s(tBuffer,(strlen(buffer)+1)*sizeof(CHAR),_TRUNCATE,_T("%S"),buffer);
}
分 -->
|