alaphate Posted August 27, 2008 Posted August 27, 2008 I want to convert a batch file (clean.bat) to clean.exe, but I dislike the console window.Any buddy knows how to hide the cmd window? Thanks a lot.WinExec and ShellExecute seem can not fit my requirement.del /f /s /q "%userprofile%\Local Settings\Temp\*.*" del /f /s /q "%userprofile%\recent\*.*"reg delete "HKCU\Software\Microsoft\Internet Explorer\TypedURLs" /va /freg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU" /va /freg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs" /f//clean.exe#include <windows.h>#include <process.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR pCmdLine, int iCmdShow) { system("del /f /s /q \"%userprofile%\Local Settings\Temp\*.*\""); return 0;}
Ufo-Pu55y Posted August 27, 2008 Posted August 27, 2008 Surely not what you meant, but at least you can run it minimized like this:@echo offif not "%1"=="" goto %1start /MIN cmd.exe /C "%~nx0 begin"goto:eof:begin del /f /s /q "%userprofile%\Local Settings\Temp\*.*" del /f /s /q "%userprofile%\recent\*.*" reg delete "HKCU\Software\Microsoft\Internet Explorer\TypedURLs" /va /f reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU" /va /f reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs" /f goto:eof
alaphate Posted August 27, 2008 Author Posted August 27, 2008 Ufo-Pu55y, your batch file is awesome.However,I'm wondering how to hide the console window when I call function system("dir > a.txt").
Ufo-Pu55y Posted August 27, 2008 Posted August 27, 2008 @echo offif not "%1"=="" goto %1start /MIN cmd.exe /C "%~nx0 begin"goto:eof:begin del /f /s /q "%userprofile%\Local Settings\Temp\*.*" del /f /s /q "%userprofile%\recent\*.*" reg delete "HKCU\Software\Microsoft\Internet Explorer\TypedURLs" /va /f reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU" /va /f reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs" /f goto:eof:dir %1 %2 %3 %4 %5 %6 %7 %8goto:eofThere are tons of batch tutorials out there btw..
human Posted August 27, 2008 Posted August 27, 2008 what a problem to change in pe header from console to windowed.also on net there are many tools that hide windows. even windowed ones.most av detect them, due people us it to hide tools.imagine runing command on remote pc and suddenly user see your proggy window:P
evlncrn8 Posted August 28, 2008 Posted August 28, 2008 Yep, pe header modification from console -> gui would do the trick, or alternatively you could use pipes and createprocess so the console window never 'shows'...
STN Posted August 28, 2008 Posted August 28, 2008 ShowWindow(GetModuleHandle(0),SW_HIDE); at the start of your program.
alaphate Posted August 28, 2008 Author Posted August 28, 2008 Thanks for replying. I found a tool to convert bat to exe with ghost mode. http://www.computerhope.com/download/utili...e_Converter.zip But my kaspersky warned me with virus!!
CondZero Posted August 28, 2008 Posted August 28, 2008 Yep, pe header modification from console -> gui would do the trick, or alternatively you could use pipes and createprocess so the console window never 'shows'...I used this trick in my "PunchIt" application available on Arteam releases page.Here's the main function for hiding a console window. I launch PECompact'sconsole version of their packer / encrypter below:// The following function is a shortened variant of Q190351 - HOWTO: Spawn Console Processes with Redirected Standard Handles// Included is commented code for creating a console window and extracting the output buffer as a possible alternative// Run via CreateProcess the PECompact2 console program and provide feedbackBOOL RunPEC2(void){ // If so desired, set the bInheritHandle flag so pipe handles are inherited. ZeroMemory( &sa, sizeof(sa) ); sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; /* NOTE:If using anonymous pipes include below, This is more elegant because we can hide the child process */ CreatePipe(&hStdOutputReadPipe, &hStdOutputWritePipe, &sa, 0); // create a inheritable pipe // duplicate the "write" end as inheritable stdout DuplicateHandle(GetCurrentProcess(), hStdOutputWritePipe, GetCurrentProcess(), &hStdOutput, 0, TRUE, DUPLICATE_SAME_ACCESS); // duplicate stdout as inheritable stderr DuplicateHandle(GetCurrentProcess(), hStdOutput, GetCurrentProcess(), &hStdError, 0, TRUE, DUPLICATE_SAME_ACCESS); // no longer need the non-inheritable "write" end of the pipe CloseHandle(hStdOutputWritePipe); ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( π, sizeof(pi) ); ZeroMemory( &b, sizeof(b) ); /* initialize STARTUPINFO */ si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.hStdOutput = hStdOutput; si.hStdError = hStdError; si.wShowWindow = SW_HIDE; /* If using a console window include below */ /* if (!AllocConsole()) { MessageBoxError("AllocConsole failed!"); return FALSE; } else { isConsole=TRUE; } */ // Start the child process. if(!CreateProcess( NULL, // If no module name (use command line). bbuffer, // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. TRUE, // Set handle inheritance to TRUE. CREATE_NEW_CONSOLE|NORMAL_PRIORITY_CLASS, // when using anonymous pipes, otherwise 0. NULL, // Use parent's environment block. temppath, // Use Start in Folder for (target) process &si, // Pointer to STARTUPINFO structure. π )) // Pointer to PROCESS_INFORMATION structure. { sprintf(b, "CreateProcess: %s", bbuffer); MessageBoxError(b); return FALSE; } // Send update status to dialog's progress control do { PostMessage(hwndCmp, WM_PROGRESS,0,0); } while(WaitForSingleObject(pi.hProcess,500)!=WAIT_OBJECT_0); // update at 500ms = 1/2 second intervals until done! dwRet = 0x00000000; GetExitCodeProcess(pi.hProcess, &dwRet); ReadFile(hStdOutputReadPipe, bigbuf, sizeof(bigbuf), &dwRead, NULL); // This block is for anonymous pipes // Print the exit code //*b = '\0'; //sprintf(b, "Exit code is: %01X\n", dwRet); //strcat(bigbuf, b); goto NEXT; // // This block of code for reading console buffer // /* hConsoleOut = GetStdHandle( STD_OUTPUT_HANDLE ); GetConsoleScreenBufferInfo(hConsoleOut, &csbi); lineWidth = csbi.dwSize.X; count = ((csbi.dwCursorPosition.Y-lastpos.Y)*lineWidth+(csbi.dwCursorPosition.X-lastpos.X)); cbuf = (LPTSTR) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, count*sizeof(TCHAR)); // read newly output characters starting from last cursor position ReadConsoleOutputCharacter(hConsoleOut, cbuf, count-1, lastpos, &dwRead); // fill screen buffer with zeroes FillConsoleOutputCharacter(hConsoleOut, '\0', count, lastpos, &dwRead); CloseHandle(hConsoleOut); if (isConsole) { FreeConsole(); } MessageBox(0, cbuf,"PUNCHIT",MB_OK+MB_TASKMODAL+MB_ICONINFORMATION); LocalFree(cbuf); */ NEXT: return TRUE;}cheers
alaphate Posted August 29, 2008 Author Posted August 29, 2008 Although CreateProcess is a complicated method, it really worked. Thanks buddies
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now