a000000 发表于 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
   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


可是弄了一下午也无法连贯起来,请高手帮忙,多谢多谢

a000000 发表于 2015-5-18 23:08:34

这个如何加入配置文件实现杀灭多个进程?


$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

ila 发表于 2015-5-19 09:04:34

这个如何加入配置文件实现杀灭多个进程?


$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:38:00

本帖最后由 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: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    ;遍历进程
    If StringInStr($list[$i],$read) Then        ProcessClose($list[$i]);如果进程名中包含$read就关闭该进程。
next
EndFunc

a000000 发表于 2015-5-19 13:22:18

又研究了半天,还是不理想,求助

ila 发表于 2015-5-19 14:32:07

又研究了半天,还是不理想,求助
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 15:17:22

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

本帖最后由 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段代码合起来,

能不能让他达到:根据配置文件关闭进程并删除这些程序

ila 发表于 2015-5-19 16:55:19

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

其实开贴 ...
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

a000000 发表于 2015-5-19 17:46:56

我回贴里的内容在论坛都有,搜索下。
题外话:自己搜索,自己分析,写出来的代码完全印进你脑袋里。
...
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:47:26

问题已经解决,还是多谢楼上热心帮忙

a000000 发表于 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 ;遍历进程
                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

ap112 发表于 2015-5-20 09:36:45

这个似乎以后可以使用,备注下

hsyl4125 发表于 2015-5-20 14:51:51

学习学习学习

r437984177 发表于 2015-5-21 14:21:00

学习学习!!!!!
页: [1]
查看完整版本: 关于杀灭进程并删除,类似于杀毒软件发现病毒的处理方法疑问