找回密码
 加入
搜索
查看: 5769|回复: 14

[系统综合] 关于杀灭进程并删除,类似于杀毒软件发现病毒的处理方法疑问

  [复制链接]
发表于 2015-5-18 21:35:29 | 显示全部楼层 |阅读模式
想写一个软件,根据配置文件检测进程,一旦发现配置文件上的进程,立即杀灭进程并删除这个进程的程序。
(比如腾讯这些日子那个偷偷上传的程序,你终止他过会又运行,只能删除就老实了)

我思路是这样的:检测进程----检测到后杀灭进程并获取进程路径后删除,由于基础太差,弄了一下午最后做到这样就歇菜了,上源码:
根据配置文件杀灭进程:

$inikey="proc"

Sleep(80)
$var = IniReadSection(@ScriptDir&"\sysfile.ini", $inikey)

        ;MsgBox(0,"",$var)
       
If UBound($var)>0 Then          
  For $i = 1 To $var[0][0]
   If  $inikey="proc" Then
    If ProcessExists($var[$i][0]) Then ProcessClose($var[$i][0])
           ;MsgBox(0,"",$var[$i][0])
               
   EndIf
  Next
EndIf

ini文件为:
[proc]
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[0],"long",0,"str",0,"long",255)        
        DllCall("Kernel32.dll","int","CloseHandle","hwnd",$_Hwnd[0])        
        If StringInStr($_Return[3],"\") Then Return $_Return[3]
        Return ""
        EndFunc       
        $prw=_GetModuleFileNameEx($iPid)
       
        MsgBox(0,"",$prw)

删除计划用 FileDelete


可是弄了一下午也无法连贯起来,请高手帮忙,多谢多谢
 楼主| 发表于 2015-5-18 23:08:34 | 显示全部楼层
这个如何加入配置文件实现杀灭多个进程?


$list = ProcessList()      ;获得所有进
$inStrProcessName = "123" ;引号内为进程名所包含的特定字符串
for $i = 1 to $list[0][0]    ;遍历进程     
   If StringInStr($list[$i][0],$inStrProcessName) Then
   $ProcessPath = Processpath($list[$i][1]) ;获取将关闭进程的储存路径
   ProcessClose($list[$i][0])  ;如果进程名中包含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] = 0 Then Return SetError(1, 0, '')
     Local $vStruct = DllStructCreate('int[1024]')
     DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)

     Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)

     If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
     Return $aReturn[3]
EndFunc
发表于 2015-5-19 09:04:34 | 显示全部楼层
这个如何加入配置文件实现杀灭多个进程?


$list = ProcessList()      ;获得所有进
$inStrProcessNam ...
a000000 发表于 2015-5-18 23:08



   用ini文件记录要关闭的多个进程。
inread循环读取,等于""就结束返回。
ini文件写法:
[process]
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
 楼主| 发表于 2015-5-19 09:38:00 | 显示全部楼层
本帖最后由 a000000 于 2015-5-19 09:40 编辑

回复 3# ila


    经过修改成这样,可是不知道为什么只能杀灭并删除第一个进程,然后后边的那几个都不管用
[proc]
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[0][0]    ;遍历进程     
   If StringInStr($list[$i][0],$inStrProcessName) Then
   $ProcessPath = Processpath($list[$i][1]) ;获取将关闭进程的储存路径
   ProcessClose($list[$i][0])  ;如果进程名中包含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] = 0 Then Return SetError(1, 0, '')
     Local $vStruct = DllStructCreate('int[1024]')
     DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)

     Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)

     If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
     Return $aReturn[3]
EndFunc
发表于 2015-5-19 10:51:00 | 显示全部楼层
本帖最后由 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[0][0]    ;遍历进程
    If StringInStr($list[$i][0],$read) Then        ProcessClose($list[$i][0])  ;如果进程名中包含$read就关闭该进程。
next 
EndFunc
 楼主| 发表于 2015-5-19 13:22:18 | 显示全部楼层
又研究了半天,还是不理想,求助
发表于 2015-5-19 14:32:07 | 显示全部楼层
又研究了半天,还是不理想,求助
a000000 发表于 2015-5-19 13:22


解压出来的两个文件放在一起,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[0][0]    ;遍历进程
    If StringInStr($list[$i][0],$read) Then        ProcessClose($list[$i][0])  ;如果进程名中包含QvodUpdate5就关闭该进程。
next 
EndFunc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2015-5-19 15:17:22 | 显示全部楼层

根据配置文件关闭进程并删除这些程序

本帖最后由 a000000 于 2015-5-19 16:15 编辑
解压出来的两个文件放在一起,process_list.ini文件里暂时写了cmd.exe,notepad.exe,winrar.exe三个进程 ...
ila 发表于 2015-5-19 14:32


这个的确可以关闭进程,但是不执行删除动作这又回到了起点,而且配置文件那样的话不好备注

其实开贴也是卡在那个地方,无法把2段代码合起来,

能不能让他达到:根据配置文件关闭进程并删除这些程序
发表于 2015-5-19 16:55:19 | 显示全部楼层
这个的确可以关闭进程,但是不执行删除动作这又回到了起点,而且配置文件那样的话不好备注

其实开贴 ...
a000000 发表于 2015-5-19 15:17


我回贴里的内容在论坛都有,搜索下。
题外话:自己搜索,自己分析,写出来的代码完全印进你脑袋里。


下面代码加了删除程序。
#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[0][0]    ;遍历进程
    If StringInStr($list[$i][0],$read) Then        ProcessClose($list[$i][0])  ;如果进程名中包含QvodUpdate5就关闭该进程。
next 
EndFunc
 楼主| 发表于 2015-5-19 17:46:56 | 显示全部楼层
我回贴里的内容在论坛都有,搜索下。
题外话:自己搜索,自己分析,写出来的代码完全印进你脑袋里。
...
ila 发表于 2015-5-19 16:55


出现:
    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 警告
驨&#901;骘&#901;髈&#901;髸&#901;

难道是版本的问题?
 楼主| 发表于 2015-5-19 17:47:26 | 显示全部楼层
问题已经解决,还是多谢楼上热心帮忙
 楼主| 发表于 2015-5-19 17:49:31 | 显示全部楼层
本帖最后由 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[0][0] ;遍历进程
                If StringInStr( $read,$list[$i][0]) Then
                        $ProcessPath = Processpath($list[$i][1]) ;获取将关闭进程的储存路径
                        ProcessClose($list[$i][0]) 
                        If ProcessWaitClose ( $list,10)=0 Then  MsgBox(0,0,"结束进程超时!",10)
                        
                        ;If $ProcessPath <> "" Then FileDelete($ProcessPath) ;删除进程源文件,慎用哈!
                        MsgBox(0, "8", $list[$i][0]);不知道为什么这个地方不显示啊
                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] = 0 Then Return SetError(1, 0, '')
        Local $vStruct = DllStructCreate('int[1024]')
        DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)

        Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)

        If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
        Return $aReturn[3]
EndFunc   ;==>Processpath
发表于 2015-5-20 09:36:45 | 显示全部楼层
这个似乎以后可以使用,备注下
发表于 2015-5-20 14:51:51 | 显示全部楼层
学习学习学习
发表于 2015-5-21 14:21:00 | 显示全部楼层
学习学习!!!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 02:34 , Processed in 0.086731 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表