itljl 发表于 2010-11-14 18:44:16

请教一下有人实现过禁止某个进程吗?[已解决]

本帖最后由 itljl 于 2011-1-20 13:28 编辑

比如有个进程 test.exe,他会定时创建一个窗口。有办法用AU3实现禁止这个进程吗?

m765555 发表于 2010-11-15 09:29:24

结束这个进程就是了啊

.個朲綉√ 发表于 2010-11-15 13:50:33

如果这个进程创建的窗口是单独进程,可以监控这个进程,出现就结束他。
如果不是单独进程,就监测窗口关闭。。。

boyhong 发表于 2010-11-15 13:54:12

我也是用的一个循环:一发现这进程就杀掉他

pusofalse 发表于 2010-11-15 20:15:55

截取目标进程的User32.CreateWindowEx函数,判断第2个参数lpClassName,如果是指定的类名,则禁止创建。

无名蜘蛛 发表于 2010-11-15 22:50:19

该帖被管理员或版主屏蔽

itljl 发表于 2010-11-17 13:49:27

楼上的楼上是怎么回事,谁敢屏P版的贴啊。

itljl 发表于 2010-11-17 13:49:52

回复 3# .個朲綉√


    进程必须要允许存在,想实现的是不允许其创建窗口(同时也不是发现窗口再关闭,那就迟了)。

pusofalse 发表于 2010-11-17 17:25:53

回复 7# itljl


    是我自己屏蔽的,原因是发现了你的通假字。

itljl 发表于 2010-11-17 20:32:29

回复 9# pusofalse

已修正,请P版指教。

pusofalse 发表于 2010-11-17 20:40:06

回复 10# itljl


    OK,解除屏蔽了。

itljl 发表于 2010-11-17 21:10:11

回复 5# pusofalse

谢谢指点啊,不过这些资料对我来说,要形成可用的代码,还有一定的难度!-_-!

xsjtxy 发表于 2010-11-17 21:51:13

如果这个进程是用system这个用户启动的就没有窗口。

pusofalse 发表于 2010-11-17 22:13:57

挂钩CreateWindowEx函数之后,如果第三方进程不判断窗口是否建立成功,那么很可能会因此引发异常而直接退出,比如内存不能为“read”等等,如果目标进程有异常处理机制还好,就怕它在没判断的情况下直接创建后续的子控件。

以下这个例子还好,我测试了一下不会引发异常,但不能保证大一点的程序同样可以不发生错误。

test.au3(先编译成test.exe)。
Opt("GUIOnEventMode", 1)

$iWindow = 0

$hGUI = GUICreate("Test", 220, 100)
GUISetOnEvent(-3, "_Exit")

GUICtrlCreateButton("Create a new window", 40, 30, 140, 20)
GUICtrlSetOnEvent(-1, "_CreateWindow")

GUISetState(@SW_SHOW, $hGUI)

While 1
        Sleep(100)
WEnd

Func _Exit()
        Exit
EndFunc

Func _CreateWindow()
        GUICreate("Sub window " & $iWindow, 200, 70)
        GUISetOnEvent(-3, "_CloseSubWindow")
        GUISetState(@SW_SHOW)
       
        $iWindow += 1
EndFunc        ;==>_CreateWindow

Func _CloseSubWindow()
        GUIDelete(@GUI_WinHandle)
EndFunc        ;==>_CloseSubWindow

HookCreateWindow.au3:
#include <RTApiHook32.au3>

$hProcess = _RTOpenProcess("test.exe")

$hCallBack = DllCallBackRegister("_CreateWindowCallBack", "dword", "handle;ptr")
$pCallBack = DllCallBackGetPtr($hCallBack)

$pCreateWindowExW = _RTGetProcAddress("User32.dll", "CreateWindowExW")
$tCreateWindowExW = _RTApiHookEx($hProcess, $pCreateWindowExW, 12, $pCallBack, $APIHOOK_Flags_Default)

OnAutoItExitRegister("_Restore")

While 1
        Sleep(100)
WEnd

Func _Restore()
        _RTApiUnhook($hProcess, $pCreateWindowExW, DllStructGetData($tCreateWindowExW, "Entrypoint"))
        DllCallBackFree($hCallBack)
EndFunc        ;==>_Restore

Func _CreateWindowCallBack($hProcess, $pCallInfo)

        Local $pClassName = _RTApiHookReadParam($hProcess, $pCallInfo, 2)
        Local $sClassName = _RTReadProcessMemory($hProcess, $pClassName, "", 1024, "wstr")

;        If ($sClassName = "XXXX") Then

                _RTApiHookSetRetVal($hProcess, $pCallInfo, 0)
                _RTApiHookSetError($hProcess, $pCallInfo, 1407)

                Return $APIHOOK_Flags_Call_Abort
;        EndIf
EndFunc        ;==>_CreateWinowCallBack

测试时先运行test.exe,然后运行HookCreateWindow.au3。

cutyourchicken 发表于 2010-11-17 22:16:59

回复 14# pusofalse


    好帖子。。。学习了
页: [1] 2
查看完整版本: 请教一下有人实现过禁止某个进程吗?[已解决]