找回密码
 加入
搜索
查看: 17582|回复: 43

[系统综合] 专业级Autoit杀手?

 火... [复制链接]
发表于 2011-2-5 12:42:43 | 显示全部楼层 |阅读模式
此问题之前曾有人讨论过,见AU3终结者
但是原贴中的解决方法并没有用.
下面的代码运行后将秒杀大部份autoit写的程序,请在编译后运行.
有解决方法?
当然是有的,但目前我所找到的方法并不是很理想.附件中是我用不理想方法编译后的程序.
欢迎各路牛人来说说自己的解决方法.我的解决方法将在稍后贴出.

#NoTrayIcon
#include <winapi.au3>
$AutoItPID = @AutoItPID
Local $iPid

While 1
        $var = WinList("[CLASS:AutoIt v3]")
        For $i = 1 To $var[0][0]
                $hWnd = $var[$i][1] ;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[32767]")
        $aRet = DllCall("Psapi.dll", "dword", $sDLLFunctionName & 'W', _
                        "ptr", $hProcess[0], "ptr", Chr(0), "ptr", DllStructGetPtr($stFilename), "dword", 32767)
        If @error Or Not IsArray($aRet) Then
                DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $hProcess[0])
                $stFilename = 0
                $hProcess = 0
                Return SetError(2, 0, "")
        EndIf
        $sFilename = DllStructGetData($stFilename, 1)
        DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $hProcess[0])
        $stFilename = 0
        $hProcess = 0
        Return SetError(0, 0, $sFilename)
EndFunc   ;==>_WinAPI_ProcessGetFilenNme

本帖子中包含更多资源

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

×
发表于 2011-2-5 14:18:29 | 显示全部楼层
果然有效,赞一个,不过msgbox好像多了个参数。
发表于 2011-2-5 20:07:55 | 显示全部楼层
不错,关注一下。新的挑战又来了……

评分

参与人数 1金钱 +5 收起 理由
ceoguang + 5 感谢参与

查看全部评分

发表于 2011-2-5 20:58:33 | 显示全部楼层
试下杀掉这个程序,暂时不贴源码。

本帖子中包含更多资源

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

×

评分

参与人数 1金钱 +5 收起 理由
ceoguang + 5 感谢参与

查看全部评分

发表于 2011-2-5 21:20:38 | 显示全部楼层
回复 4# pusofalse


    被检测到了,可是,没有关掉!!

评分

参与人数 1金钱 +5 收起 理由
ceoguang + 5 感谢参与

查看全部评分

发表于 2011-2-5 21:24:27 | 显示全部楼层
窗口类能不能被修改?
发表于 2011-2-5 21:43:56 | 显示全部楼层
回复 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,麻烦至极。
发表于 2011-2-5 21:54:57 | 显示全部楼层
回覆 4# pusofalse


WinClose($hWnd)

換成
Run("taskkill /PID "& $iPid)

可以關掉,但為什麼下面這不行
Run("taskkill /PID "& $iPid,@SW_HIDE)

评分

参与人数 1金钱 +5 收起 理由
ceoguang + 5 感谢参与

查看全部评分

发表于 2011-2-5 21:57:49 | 显示全部楼层
回复 8# xxoojoeooxx


    参数写错了,看下Run的帮助。
发表于 2011-2-5 22:05:29 | 显示全部楼层
本帖最后由 xxoojoeooxx 于 2011-2-5 22:09 编辑

回覆 9# pusofalse
不小心太急了

後來發現原來WinKill=WinClose*3?
发表于 2011-2-5 22:27:39 | 显示全部楼层
难道au3没有象C++里那样的可以自己注册新类名的机制?如象MFC中超类化技术

评分

参与人数 1金钱 +5 收起 理由
ceoguang + 5 感谢参与

查看全部评分

发表于 2011-2-5 22:33:51 | 显示全部楼层
回复 11# happytc


    有。DllCall调用User32.dll中的RegisterClassEx注册类名,同是User32.dll中的CreateWindowEx创建窗口。基本上所有的程序都是这样做的。
发表于 2011-2-5 23:06:49 | 显示全部楼层
本帖最后由 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   ;==>WindowCallback
http://www.autoitscript.com/forum/topic/79575-winapi-registerclassex/

评分

参与人数 1金钱 +5 收起 理由
ceoguang + 5 感谢参与

查看全部评分

发表于 2011-2-5 23:18:27 | 显示全部楼层
本帖最后由 xxoojoeooxx 于 2011-2-5 23:20 编辑

回复 13# lixiaolong


    你没有修改到
    要修改的是autoit 原本隐藏的窗口
    而不是自己再创建一个
 楼主| 发表于 2011-2-5 23:20:11 | 显示全部楼层
修改窗口类也不行
lixiaolong 发表于 2011-2-5 23:06

呵呵,我一楼的附件就是用这个写的.只是这个变是的gui的类而已.默认窗口的是已注册的.
现在的问题是如何改变默认窗口的类,又或者低调一点,直接退出窗口而不退出进程.我试过在代码内自己的DestroyWindow,但结果是直接退出了.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 01:26 , Processed in 0.125502 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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