关于杀灭进程并删除,类似于杀毒软件发现病毒的处理方法疑问
想写一个软件,根据配置文件检测进程,一旦发现配置文件上的进程,立即杀灭进程并删除这个进程的程序。(比如腾讯这些日子那个偷偷上传的程序,你终止他过会又运行,只能删除就老实了)
我思路是这样的:检测进程----检测到后杀灭进程并获取进程路径后删除,由于基础太差,弄了一下午最后做到这样就歇菜了,上源码:
根据配置文件杀灭进程:
$inikey="proc"
Sleep(80)
$var = IniReadSection(@ScriptDir&"\sysfile.ini", $inikey)
;MsgBox(0,"",$var)
If UBound($var)>0 Then
For $i = 1 To $var
If$inikey="proc" Then
If ProcessExists($var[$i]) Then ProcessClose($var[$i])
;MsgBox(0,"",$var[$i])
EndIf
Next
EndIf
ini文件为:
0.exe=BT下载工具
1.exe=BT下载工具
2.exe=00000
获取进程的路径:
$iPid=ProcessExists("mgrservice.exe")
;MsgBox(0,"",_GetModuleFileNameEx($iPid))
Func _GetModuleFileNameEx($_Pid)
$_Hwnd=DllCall("Kernel32.dll","hwnd","OpenProcess","dword",0x0400+0x0010,"int",0,"dword",$_Pid)
$_Return=DllCall("Psapi.dll","long","GetModuleFileNameEx","hwnd",$_Hwnd,"long",0,"str",0,"long",255)
DllCall("Kernel32.dll","int","CloseHandle","hwnd",$_Hwnd)
If StringInStr($_Return,"\") Then Return $_Return
Return ""
EndFunc
$prw=_GetModuleFileNameEx($iPid)
MsgBox(0,"",$prw)
删除计划用 FileDelete
可是弄了一下午也无法连贯起来,请高手帮忙,多谢多谢 这个如何加入配置文件实现杀灭多个进程?
$list = ProcessList() ;获得所有进
$inStrProcessName = "123" ;引号内为进程名所包含的特定字符串
for $i = 1 to $list ;遍历进程
If StringInStr($list[$i],$inStrProcessName) Then
$ProcessPath = Processpath($list[$i]) ;获取将关闭进程的储存路径
ProcessClose($list[$i]);如果进程名中包含QvodUpdate5就关闭该进程。
Sleep(1000) ;等待进程关闭
;If$ProcessPath <> "" Then FileDelete($ProcessPath) ;删除进程源文件,慎用哈!
Endif
Next
Func Processpath($iPID)
Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
If $aProc = 0 Then Return SetError(1, 0, '')
Local $vStruct = DllStructCreate('int')
DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc, 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc, 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
If StringLen($aReturn) = 0 Then Return SetError(2, 0, '')
Return $aReturn
EndFunc 这个如何加入配置文件实现杀灭多个进程?
$list = ProcessList() ;获得所有进
$inStrProcessNam ...
a000000 发表于 2015-5-18 23:08 http://www.autoitx.com/images/common/back.gif
用ini文件记录要关闭的多个进程。
inread循环读取,等于""就结束返回。
ini文件写法:
1=qq.exe
2=qq2.exe
.
.
.Dim $i=1,$path="c:\process_list.ini"
If Not FileExists($path) Then
MsgBox(16,0,"无法加载进程list文件")
else
While 1
$read=IniRead($path,"process",$i,"error")
If $read="" or $read="error" Then ExitLoop
;条件符合,接下来的进行其他操作
$i+=1
WEnd
EndIf 本帖最后由 a000000 于 2015-5-19 09:40 编辑
回复 3# ila
经过修改成这样,可是不知道为什么只能杀灭并删除第一个进程,然后后边的那几个都不管用
0.exe=BT下载工具
1.exe=BT下载工具
只对0.exe管用,后面的1.exe没杀灭也没删除,帮忙看看错了哪里
Dim $i=1,$path="0.ini"
If Not FileExists($path) Then
MsgBox(16,0,"无法加载进程list文件")
else
While 1
$read=IniRead($path,"process",$i,"error")
If $read="" or $read="error" Then ExitLoop
;条件符合,接下来的进行其他操作
$i+=1
MsgBox(0,"",$read)
$list = ProcessList() ;获得所有进
$inStrProcessName = $read ;引号内为进程名所包含的特定字符串
MsgBox(0,"2",$inStrProcessName)
for $i = 1 to $list ;遍历进程
If StringInStr($list[$i],$inStrProcessName) Then
$ProcessPath = Processpath($list[$i]) ;获取将关闭进程的储存路径
ProcessClose($list[$i]);如果进程名中包含QvodUpdate5就关闭该进程。
Sleep(1000) ;等待进程关闭
If$ProcessPath <> "" Then FileDelete($ProcessPath) ;删除进程源文件,慎用哈!
MsgBox(0,"8",$inStrProcessName);不知道为什么这个地方不显示啊
Endif
Next
WEnd
EndIf
Func Processpath($iPID)
Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
If $aProc = 0 Then Return SetError(1, 0, '')
Local $vStruct = DllStructCreate('int')
DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc, 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc, 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
If StringLen($aReturn) = 0 Then Return SetError(2, 0, '')
Return $aReturn
EndFunc 本帖最后由 ila 于 2015-5-19 10:54 编辑
下面代码可以用,但我这段遍历进程,匹配需要的进程的代码抄论坛的,
好像要循环到第三次才关闭后一个,按思路应该循环到第二次关闭下一个。
你加个msgbox在关闭进程代码后面试试就知。 $Dim $i=1,$path="0.ini"
If Not FileExists($path) Then
MsgBox(16,0,"无法加载进程list文件")
else
While 1
$read=IniRead($path,"process",$i,"error")
If $read="" or $read="error" Then ExitLoop
;条件符合,接下来的进行其他操作
_process($read)
If Not ProcessExists($read) Then$i+=1
WEnd
EndIf
Func _process($read)
$list = ProcessList() ;获得所有进程
for $i = 1 to $list ;遍历进程
If StringInStr($list[$i],$read) Then ProcessClose($list[$i]);如果进程名中包含$read就关闭该进程。
next
EndFunc 又研究了半天,还是不理想,求助 又研究了半天,还是不理想,求助
a000000 发表于 2015-5-19 13:22 http://www.autoitx.com/images/common/back.gif
解压出来的两个文件放在一起,process_list.ini文件里暂时写了cmd.exe,notepad.exe,winrar.exe三个进程名。
可以按数字顺序自己添加。
你打开这三个进程:cmd,记事本,winrar压缩软件,再运行脚本,依次关闭,没问题。
如果连手动都无法关闭的进程,用这脚本也不能关闭。#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_Outfile=按list关闭进程.exe
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
Dim $i=1,$path="process_list.ini"
If Not FileExists($path) Then
MsgBox(16,0,"无法加载进程list文件")
else
While 1
$read=IniRead($path,"process",$i,"error")
If $read="" or $read="error" Then ExitLoop
;条件符合,接下来的进行其他操作
_process($read)
If Not ProcessExists($read) Then$i+=1
WEnd
EndIf
Func _process($read)
$list = ProcessList() ;获得所有进程
for $i = 1 to $list ;遍历进程
If StringInStr($list[$i],$read) Then ProcessClose($list[$i]);如果进程名中包含QvodUpdate5就关闭该进程。
next
EndFunc
根据配置文件关闭进程并删除这些程序
本帖最后由 a000000 于 2015-5-19 16:15 编辑解压出来的两个文件放在一起,process_list.ini文件里暂时写了cmd.exe,notepad.exe,winrar.exe三个进程 ...
ila 发表于 2015-5-19 14:32 http://www.autoitx.com/images/common/back.gif
这个的确可以关闭进程,但是不执行删除动作这又回到了起点,而且配置文件那样的话不好备注
其实开贴也是卡在那个地方,无法把2段代码合起来,
能不能让他达到:根据配置文件关闭进程并删除这些程序 这个的确可以关闭进程,但是不执行删除动作这又回到了起点,而且配置文件那样的话不好备注
其实开贴 ...
a000000 发表于 2015-5-19 15:17 http://www.autoitx.com/images/common/back.gif
我回贴里的内容在论坛都有,搜索下。
题外话:自己搜索,自己分析,写出来的代码完全印进你脑袋里。
下面代码加了删除程序。#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_Outfile=按list关闭进程.exe
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#Include <WinAPIEx.au3>
Dim $i=1,$path="c:\process_list.ini"
If Not FileExists($path) Then
MsgBox(16,0,"无法加载进程list文件")
else
While 1
$read=IniRead($path,"process",$i,"error")
If $read="" or $read="error" Then ExitLoop
;条件符合,接下来的进行其他操作
_process($read)
$Pid = ProcessExists($read);根据进程名获取pid
$exepath=_WinAPI_GetModuleFileNameEx($pid);根据pid获取进程全路径
FileDelete($exepath)
If Not ProcessExists($read) Then$i+=1
WEnd
EndIf
Func _process($read)
$list = ProcessList() ;获得所有进程
for $i = 1 to $list ;遍历进程
If StringInStr($list[$i],$read) Then ProcessClose($list[$i]);如果进程名中包含QvodUpdate5就关闭该进程。
next
EndFunc
我回贴里的内容在论坛都有,搜索下。
题外话:自己搜索,自己分析,写出来的代码完全印进你脑袋里。
...
ila 发表于 2015-5-19 16:55 http://www.autoitx.com/images/common/back.gif
出现:
C:\Users\Administrator\Desktop\新建 AutoIt v3 脚本 (2).au3(46,42) : 错误: _WinAPI_GetModuleFileNameEx(): 未定义的函数.
$exepath=_WinAPI_GetModuleFileNameEx($pid)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Users\Administrator\Desktop\新建 AutoIt v3 脚本 (2).au3 - 1 错误, 0 警告
驨΅骘΅髈΅髸΅
难道是版本的问题? 问题已经解决,还是多谢楼上热心帮忙 本帖最后由 a000000 于 2015-5-19 17:51 编辑
多谢“无语凭阑”大版主,最终源码为:
$path = "list.txt"
If Not FileExists($path) Then
MsgBox(16, 0, "无法加载进程list文件")
Exit
EndIf
While 1
$read = FileRead($path)
If $read = "" Or $read = "error" Then ExitLoop
$list = ProcessList() ;获得所有进
For $i = 1 To $list ;遍历进程
If StringInStr( $read,$list[$i]) Then
$ProcessPath = Processpath($list[$i]) ;获取将关闭进程的储存路径
ProcessClose($list[$i])
If ProcessWaitClose ( $list,10)=0 ThenMsgBox(0,0,"结束进程超时!",10)
;If $ProcessPath <> "" Then FileDelete($ProcessPath) ;删除进程源文件,慎用哈!
MsgBox(0, "8", $list[$i]);不知道为什么这个地方不显示啊
EndIf
Next
Sleep(200)
WEnd
Func Processpath($iPID)
Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
If $aProc = 0 Then Return SetError(1, 0, '')
Local $vStruct = DllStructCreate('int')
DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc, 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc, 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
If StringLen($aReturn) = 0 Then Return SetError(2, 0, '')
Return $aReturn
EndFunc ;==>Processpath
这个似乎以后可以使用,备注下 学习学习学习 学习学习!!!!!
页:
[1]