senderman
BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Еще одна реализация скрытия окна консоли с открытым кодом hidcon.cpp Код: // hidcon.cpp : Defines the entry point for the application. // #include "stdafx.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { STARTUPINFO si; PROCESS_INFORMATION pi; int bWait = 0; /* Получение адреса запущенной программы hidxxx.exe. */ TCHAR szFileName[_MAX_PATH] = {0}; TCHAR REVszFileName[_MAX_PATH] = {0}; GetModuleFileName(0, szFileName, sizeof(szFileName)); /* Выделение пути к запущенной програме. */ int i = sizeof(szFileName) - 1; while (szFileName[i--] != atoi("92")); strncpy(REVszFileName, szFileName, i + 2); /* Формирование имени командного файла. */ LPTSTR lpFNLine = szFileName; lpFNLine += (i + 2); i = 0; while (lpFNLine[i++] != '\0'); lpFNLine[i - 5] = '.'; lpFNLine[i - 4] = 'c'; lpFNLine[i - 3] = 'm'; lpFNLine[i - 2] = 'd'; lpFNLine[i - 1] = '\0'; /* Если командная строка не пустая, исполнять её содержимое, иначе, содержимое строки lpFNLine. */ if (lpCmdLine[0]) { lpFNLine = lpCmdLine; /* По ключу командной строки "W,w" активизировать флаг ожидания завершения процесса. */ if ((lpFNLine[0] == '/')&&((lpFNLine[1] == 'w')||(lpFNLine[1] == 'W'))&&(lpFNLine[2] == 0x20)) { bWait = 1; lpFNLine += 3; } } /* Проверка имени командного файла. */ i = 0; LPTSTR lpFNLineS = lpFNLine; while (lpFNLineS[i++] != '\0'); lpFNLineS += (i -5); if (!(lpFNLineS[0] == '.' && (lpFNLineS[1] == 'c' || lpFNLineS[1] == 'C') && (lpFNLineS[2] == 'm' || lpFNLineS[2] == 'M') && (lpFNLineS[3] == 'd' || lpFNLineS[3] == 'D'))) { MessageBox(NULL, lpFNLine, "Не верное имя файла CMD:", MB_OK); return 0; } /* Если исполняемый файл не найден в текущем каталоге, использовать адрес запущенной программы hidxxx.exe. */ LPCTSTR lpCurrentDirectory = NULL; WIN32_FIND_DATA fd; HANDLE fh = FindFirstFile(lpFNLine, &fd); if (fh == INVALID_HANDLE_VALUE) { lpCurrentDirectory = REVszFileName; } /* Создайть процесс с новой консолью. */ memset(&si, 0, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; ZeroMemory(&pi, sizeof(pi)); if(!CreateProcess(NULL, lpFNLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, lpCurrentDirectory, &si, &pi)) { MessageBox(NULL, lpFNLine, "Не удалось создать процесс:", MB_OK); return 0; } if(bWait) WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; } | stdafx.h Код: // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) #define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers // Windows Header Files: #include <windows.h> // C RunTime Header Files #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h> // Local Header Files // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) | Компилировать можно как в VC, так и сторонними компиляторами. Программа в директории, где исполняется сама или текущей директории, ищет по имени, присвоенному ей, файл с расширением CMD и исполняет его. Окно консоли при этом не появляется. Можно активизировать флаг ожидания завершения процесса. При наличии командной строки она передается исполняемому файлу. Эта реализация скрытия окна консоли получилась достаточно компактной. Почти все аналоги этой программы с закрытым кодом, что потенциально опасно (некоторые самопроизвольно обращаются к внешним адресам) - это достаточно веская причина для использования программ с открытым кодом. | Всего записей: 1488 | Зарегистр. 16-03-2019 | Отправлено: 10:16 03-03-2020 | Исправлено: senderman, 22:06 15-03-2020 |
|