禁止程序运行的方式有很多种,第一种方法是写一个单独的程序并且能够在开机的时候自动运行,而这个程序的作用就是监视进程信息,如果发现目标进程则立即把它干掉,从而达到禁止程序运行的目的。第二种方法是写一个服务,这种方法个人觉得比较隐蔽。下面拿第二种方法实现。
下面就给出windows下的服务程序的源代码。
下面就给出windows下的服务程序的源代码。
- #include <windows.h>
- #include <stdio.h>
- #include<tlhelp32.h>
- #include<stdlib.h>
- #include<string.h>
- #define SLEEP_TIME 5000
- #define LOGFILE "C://MemoryStatus//memstatus.txt"
- // Declare several global variables to share
- // their values across multiple functions of your program.
- SERVICE_STATUS ServiceStatus;
- SERVICE_STATUS_HANDLE hStatus;
- // Make the forward definitions of functions prototypes.
- //
- void ServiceMain(int argc, char** argv);
- void ControlHandler(DWORD request);
- int InitService();
- int ScanProcess();
- int WriteToLog(char* str)
- {
- FILE* log;
- log = fopen(LOGFILE, "a+");
- if (log == NULL){
- OutputDebugString("Log file open failed.");
- return -1;
- }
- fprintf(log, "%s/n", str);
- fclose(log);
- return 0;
- }
- // Service initialization
- int InitService()
- {
- OutputDebugString("Monitoring started.");
- int result;
- result = WriteToLog("Monitoring started.");
- return(result);
- }
- // Control Handler
- void ControlHandler(DWORD request)
- {
- switch(request)
- {
- case SERVICE_CONTROL_STOP:
- OutputDebugString("Monitoring stopped.");
- WriteToLog("Monitoring stopped.");
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- SetServiceStatus (hStatus, &ServiceStatus);
- return;
- case SERVICE_CONTROL_SHUTDOWN:
- OutputDebugString("Monitoring stopped.");
- WriteToLog("Monitoring stopped.");
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- SetServiceStatus (hStatus, &ServiceStatus);
- return;
- default:
- break;
- }
- // Report current status
- SetServiceStatus (hStatus, &ServiceStatus);
- return;
- }
- void ServiceMain(int argc, char** argv)
- {
- int error;
- ServiceStatus.dwServiceType =
- SERVICE_WIN32;
- ServiceStatus.dwCurrentState =
- SERVICE_START_PENDING;
- ServiceStatus.dwControlsAccepted =
- SERVICE_ACCEPT_STOP |
- SERVICE_ACCEPT_SHUTDOWN;
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwServiceSpecificExitCode = 0;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- hStatus = RegisterServiceCtrlHandler(
- "MemoryStatus",
- (LPHANDLER_FUNCTION)ControlHandler);
- if (hStatus == (SERVICE_STATUS_HANDLE)0)
- {
- // Registering Control Handler failed
- return;
- }
- // Initialize Service
- error = InitService();
- if (error)
- {
- // Initialization failed
- ServiceStatus.dwCurrentState =
- SERVICE_STOPPED;
- ServiceStatus.dwWin32ExitCode = -1;
- SetServiceStatus(hStatus, &ServiceStatus);
- return;
- }
- // We report the running status to SCM.
- ServiceStatus.dwCurrentState =
- SERVICE_RUNNING;
- SetServiceStatus (hStatus, &ServiceStatus);
- // MEMORYSTATUS memory;
- // The worker loop of a service
- while (ServiceStatus.dwCurrentState ==
- SERVICE_RUNNING)
- {
- int flag;
- if(ScanProcess())
- flag=1;
- else
- flag=0;
- if (flag==0)
- {
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- ServiceStatus.dwWin32ExitCode = -1;
- SetServiceStatus(hStatus, &ServiceStatus);
- return;
- }
- Sleep(SLEEP_TIME);
- }
- return;
- }
- int ScanProcess()
- {
- PROCESSENTRY32 pe;
- char *name=(char *)malloc(sizeof(char)*128);
- if(name==NULL)
- {
- WriteToLog("无法分配内存!");
- return 0;
- }
- FILE *fp;
- HANDLE process;
- fp=fopen("C://MemoryStatus//ScrutinyProcess.txt","rb");
- if(!fp)
- {
- WriteToLog("无法打开文件");
- return 0;
- }
- fgets(name,128,fp);
- HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
- Process32First(hSnapshot,&pe);
- do{
- if(!strcmp(name,pe.szExeFile))
- {
- process=OpenProcess(PROCESS_TERMINATE,FALSE,pe.th32ProcessID);
- if(process)
- {
- TerminateProcess(process,0);
- WriteToLog(name);
- }
- }
- }while(Process32Next(hSnapshot,&pe));
- free(name);
- CloseHandle(hSnapshot);
- fclose(fp);
- return 1;
- }
- void main(int argc, char* argv[])
- {
- SERVICE_TABLE_ENTRY ServiceTable[2];
- ServiceTable[0].lpServiceName = "MemoryStatus";
- ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
- ServiceTable[1].lpServiceName = NULL;
- ServiceTable[1].lpServiceProc = NULL;
- // Start the control dispatcher thread for our service
- StartServiceCtrlDispatcher(ServiceTable);
- }
把想要禁止运行的进程名字写在日志文件里就可以达到目的,接下来安装服务器。