结束WAR3.EXE进程!!

jvjvlglg 2008-06-12 08:25:27
小弟我最近想写一个小程序,用来禁止我电脑上边的魔兽争霸运行。本来想用系统钩子,但是写的很困难,
所以就改用监视进程的办法,获得快照后逐个对比szExeFile,然后结束进程。这种办法非常笨且占CPU。
但我也不会别的,不过貌似这样也不能结束War3.exe的进程,不知道为什么,请高手指点下。如果有更高明的办法,
比如用钩子来实现,麻烦把源码发上来,谢谢。

#include "stdafx.h"
#include <windows.h>
#include <string.h>
#include <tlhelp32.h>
#pragma comment(linker, "/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")


void KillProcess(DWORD Pid)
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
int a=TerminateProcess(hProcess,0);
}

void scan()
{
char *p="War3.exe";

PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

BOOL bProcess=Process32First(hProcessSnap,&pe32);
while(bProcess)
{
if(*pe32.szExeFile==*p){KillProcess(pe32.th32ProcessID);break;}
bProcess=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
}

int main()
{
while(TRUE)
{
scan();
}
return 0;
}
...全文
644 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
过去的我 2008-06-13
  • 打赏
  • 举报
回复
试了一下6楼的,发现改名对有版本信息的exe无效,很好的解法啊
palmax 2008-06-13
  • 打赏
  • 举报
回复
直接注册NtDDK里的PsSetCreateProcessNotifyRoutineEx在回调函数里很容易判断
过去的我 2008-06-13
  • 打赏
  • 举报
回复
通过文件名判断这种方法,改个名字就失效了
zhengq06 2008-06-13
  • 打赏
  • 举报
回复
帮顶.
zhoujianhei 2008-06-13
  • 打赏
  • 举报
回复
钩住NtCreateProcess
stonewater 2008-06-13
  • 打赏
  • 举报
回复
while(TRUE)
{
scan();
}
中好歹也加个Sleep(1000);休息下
Amuro1987218 2008-06-13
  • 打赏
  • 举报
回复
挂个WH_CBT钩子然后在HCBT_CREATEWINDOW里替换SARS的窗口过程,实现终止,似乎麻烦了点啊

其实我看在HCBT_ACTIVE里直接蹦了这个进程就满好的.
jvjvlglg 2008-06-13
  • 打赏
  • 举报
回复
嗯,修改注册表确实是不错的办法,一劳永逸。。。谢了,
不过很容易被被人发现,(他WAR3打不开,第一反应就是去看注册表。。)目的就达不到了,呵呵。
我把我发的东西改了下,把进程名字伪装成explore.exe,呵呵,但是就算增加了Sleep(),也太占CPU了。。也比较明显
我觉得8楼的大哥说的不错,就是不知道对系统处理的速度影响大不大,我再试试。
再次谢谢大家关心。。。
zys85 2008-06-12
  • 打赏
  • 举报
回复
禁止/恢复运行
	char szFilters[]=
"exe Files (*.exe)|*.exe|All Files (*.*)|*.*||";

CFileDialog fileDlg (TRUE, "exe", "*.exe",
OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);

fileDlg.m_ofn.lStructSize = 88;
if( fileDlg.DoModal ()==IDOK )
{
SetAppRun(fileDlg.GetFileName());
}



void SetAppRun(LPCTSTR lpAppName, BOOL bRun)
{
HKEY hKey;
LONG lRet;
DWORD dw1;

CString strSubKey;
strSubKey.Format("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%s",
lpAppName);

if(!bRun)
{

lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE,strSubKey,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dw1);

LPCTSTR lpNoRun = "DisabledRun";
RegSetValueEx(hKey,"Debugger",0,REG_SZ,(CONST BYTE *)lpNoRun,strlen(lpNoRun)+1);

RegCloseKey(hKey);
}
else
{
RegDeleteKey(HKEY_LOCAL_MACHINE,strSubKey);
}

MessageBox("设置完成!");
}
cnzdgs 2008-06-12
  • 打赏
  • 举报
回复
代码很少,就是FindWindow然后SendMessage。只要检测频率低一些,占用系统资源可以忽略不计。另外也可以用SetWindowsHookEx的方法,不过这种方法比较复杂,而且要向每个进程插入DLL,效果可能还不如自己检测的好。
jvjvlglg 2008-06-12
  • 打赏
  • 举报
回复
嗯,比较字符串确实得用stricmp,我的错误。
不过我还得问下沙发,具体怎么实现,能把代码贴出来么?
还有,有没有占系统资源少的方法呢??谢谢
cnzdgs 2008-06-12
  • 打赏
  • 举报
回复
说错了,更正一下,你这样写法是比较第1个字符是否相同。
cnzdgs 2008-06-12
  • 打赏
  • 举报
回复
发现你上面程序中一处错误:(*pe32.szExeFile==*p)这样是比较两个指针是否相等,结果肯定是不等的,应该用stricmp函数来比较。
cnzdgs 2008-06-12
  • 打赏
  • 举报
回复
换种方法试试,用Spy++查出War3.exe的窗口类名,程序中用FindWindow给出类名查找窗口,找到之后向其发送WM_CLOSE消息。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧