专业级Autoit杀手?
此问题之前曾有人讨论过,见AU3终结者但是原贴中的解决方法并没有用.
下面的代码运行后将秒杀大部份autoit写的程序,请在编译后运行.
有解决方法?
当然是有的,但目前我所找到的方法并不是很理想.附件中是我用不理想方法编译后的程序.
欢迎各路牛人来说说自己的解决方法.我的解决方法将在稍后贴出.
#NoTrayIcon
#include <winapi.au3>
$AutoItPID = @AutoItPID
Local $iPid
While 1
$var = WinList("")
For $i = 1 To $var
$hWnd = $var[$i] ;hwnd
_WinAPI_GetWindowThreadProcessId($hWnd, $iPid)
If $iPid And $iPid <> $AutoItPID Then
MsgBox(64, "检测到autoit程序", "进程ID: " & $iPid & @LF & "进程名称: " & _WinAPI_ProcessGetFilenNme($iPid) & @LF & "窗口将被显示", 5, $hWnd)
_WinAPI_ShowWindow($hWnd, @SW_SHOW)
MsgBox(64, "", "窗口将被最大化及修改标题", 5, $hWnd)
WinSetTitle($hWnd, "", "看到庐山真面目了吧!")
_WinAPI_ShowWindow($hWnd, @SW_MAXIMIZE)
MsgBox(64, "", "目标窗口将被关闭", 5, $hWnd)
WinClose($hWnd)
EndIf
$iPid = 0
Next
Sleep(1)
WEnd
Func _WinAPI_ProcessGetFilenNme($vProcessID = @AutoItPID, $bFullPath = False)
If Not $vProcessID Then Return SetError(1, 0, '')
Local $hProcess, $stFilename, $aRet, $sFilename, $sDLLFunctionName
If $bFullPath Then
$sDLLFunctionName = "GetModuleFileNameEx"
Else
$sDLLFunctionName = "GetModuleBaseName"
EndIf
Local $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'int', BitOR(0x400, 0x10), 'int', 0, 'int', $vProcessID)
If @error Or Not IsArray($hProcess) Then Return SetError(2, 0, "")
$stFilename = DllStructCreate("wchar")
$aRet = DllCall("Psapi.dll", "dword", $sDLLFunctionName & 'W', _
"ptr", $hProcess, "ptr", Chr(0), "ptr", DllStructGetPtr($stFilename), "dword", 32767)
If @error Or Not IsArray($aRet) Then
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $hProcess)
$stFilename = 0
$hProcess = 0
Return SetError(2, 0, "")
EndIf
$sFilename = DllStructGetData($stFilename, 1)
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $hProcess)
$stFilename = 0
$hProcess = 0
Return SetError(0, 0, $sFilename)
EndFunc ;==>_WinAPI_ProcessGetFilenNme
果然有效,赞一个,不过msgbox好像多了个参数。 不错,关注一下。新的挑战又来了…… 试下杀掉这个程序,暂时不贴源码。
回复 4# pusofalse
被检测到了,可是,没有关掉!! 窗口类能不能被修改? 回复 5# itljl
嗯,我测试也是这样。
1# ceoguang兄的代码,原理是枚举所有类名为“AutoIt v3”的窗口,找到后就用WinClose关闭。
而4#的代码工作原理是,改变了窗口(类名为“AutoIt v3”的窗口)默认的窗口过程(消息函数),只截取WM_CLOSE消息,WinClose函数关闭窗口就是通过发送WM_CLOSE实现的。另外,设置了一下进程的权限,使OpenProcess函数失败了。
如果窗口的类名不是“AutoIt v3”,1#的代码就检测不出了,ceoguang兄的demo程序就是这样做的。我试图挂钩User32中的RegisterClassEx函数,结果发现挂钩的时机太晚,那个“AutoIt v3”窗口早就已经创建完成了。也可以 在进程刚刚完成初始化时(但还没有运行起来),立即挂钩它的RegisterClassEx函数,把类名改成别的什么名称,但还要往里面写ShellCode,麻烦至极。 回覆 4# pusofalse
把
WinClose($hWnd)
換成
Run("taskkill /PID "& $iPid)
可以關掉,但為什麼下面這不行
Run("taskkill /PID "& $iPid,@SW_HIDE) 回复 8# xxoojoeooxx
参数写错了,看下Run的帮助。 本帖最后由 xxoojoeooxx 于 2011-2-5 22:09 编辑
回覆 9# pusofalse
不小心太急了{:face (396):}
後來發現原來WinKill=WinClose*3? 难道au3没有象C++里那样的可以自己注册新类名的机制?如象MFC中超类化技术 回复 11# happytc
有。DllCall调用User32.dll中的RegisterClassEx注册类名,同是User32.dll中的CreateWindowEx创建窗口。基本上所有的程序都是这样做的。 本帖最后由 lixiaolong 于 2011-2-5 23:13 编辑
修改窗口类也不行#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <_RegisterClassEx.au3>
$hCursor = _WinAPI_LoadCursor(0, $CURSOR_HELP)
_WinAPI_RegisterClassEx("MyOwnClass", "WindowCallback", 0, $hCursor, 0xFF0000, $CS_DEFAULTSTYLE + $CS_DROPSHADOW); Creates a class with a red bgcolor, and a shadow under the window
$hWnd = _WinAPI_CreateWindowEx(0, "MyOwnClass", "Window with custom class", $WS_OVERLAPPEDWINDOW, 100, 100, 400, 300, 0)
_WinAPI_ShowWindow($hWnd)
WinSetTitle("Window with custom class", '', 'Window')
While 1
Sleep(100)
WEnd
Func WindowCallback($hWnd, $iMsg, $wParam, $lParam)
Switch $iMsg
Case $WM_CLOSE
_WinAPI_UnregisterClass("MyOwnClass")
Exit
EndSwitch
Return _WinAPI_DefWindowProc($hWnd, $iMsg, $wParam, $lParam)
EndFunc ;==>WindowCallbackhttp://www.autoitscript.com/forum/topic/79575-winapi-registerclassex/ 本帖最后由 xxoojoeooxx 于 2011-2-5 23:20 编辑
回复 13# lixiaolong
你没有修改到
要修改的是autoit 原本隐藏的窗口
而不是自己再创建一个 修改窗口类也不行
lixiaolong 发表于 2011-2-5 23:06 http://www.autoitx.com/images/common/back.gif
呵呵,我一楼的附件就是用这个写的.只是这个变是的gui的类而已.默认窗口的是已注册的.
现在的问题是如何改变默认窗口的类,又或者低调一点,直接退出窗口而不退出进程.我试过在代码内自己的DestroyWindow,但结果是直接退出了.