windows下禁止程序运行

本文介绍了一种通过编写Windows服务程序来阻止特定进程运行的方法。该服务能够开机自启,并持续监控目标进程,一旦发现即刻终止。文章提供了C语言实现的服务程序源代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

windows下禁止程序运行 选择自 yyjw 的 Blog 关键字 windows下禁止程序运行 出处 禁止程序运行的方式有很多种,第一种方法是写一个单独的程序并且能够在开机的时候自动运行,而这个程序的作用就是监视进程信息,如果发现目标进程则立即把它干掉,从而达到禁止程序运行的目的。第二种方法是写一个服务,这种方法个人觉得比较隐蔽。下面我就拿第二种方法作一下讲解。 写服务的方法也有很多,而笔者比较喜欢的是用c来写,用c写服务比较直观,也比较随心所欲。如果有的读者不知道该如何写windows下的服务程序,请自行查阅相关资料。下面就给出程序的源代码。 #include #include #include #include #include #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); } 把想要禁止运行的进程名字写在日志文件里就可以达到目的,如果不知道如何安装服务那你可要好好学习了^_^ by:yyjw 转载请注明出处。 作者Blog:http://blog.youkuaiyun.com/yyjw/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值