AU3如何正确调用API函数 TerminateProcess?
本帖最后由 cutyourchicken 于 2011-4-9 00:54 编辑如题,尝试了好几次都不行!请大虾指点下!~~~
送上问题代码Func _TerminateProcess($process)
$processid = ProcessExists($process)
If $processid Then
$ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
$re=DllCall('KERNEL32.DLL', 'bool','TerminateProcess','HANDLE',$ai_Handle,'INT',0)
Endif
EndFunc
_TerminateProcess("cmd.exe") 首先你得给你的脚本本身搞高权限才行:EnablePrivilege(SE_DEBUG_NAME,true)
然后还得通知系统进程权限修改了:AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL )
接着就可以用:OpenProcess(............)
TerminateProcess(...........)
,
本帖最后由 netegg 于 2011-4-9 06:36 编辑没开权限吧,用adjustprevilige(?)把权限改了 本帖最后由 pusofalse 于 2011-4-9 07:28 编辑
网上的EnablePrivilege函数其实是个自定义函数,它会在其内部调用AdvApi32.AdjustTokenPrivileges函数开启SeDebugPrivilege特权,函数的功能本就是修改令牌权限,何来 通知系统进程权限已修改?~ 调整令牌权限不同于创建进程,在创建进程时,在最后的(貌似是倒数第二步)步骤中 父进程必须要调用Ntdll.CsrClientCallServer函数通知系统进程csrss.exe 子进程的创建。
当然,当目标进程的访问控制列表 不允许特定的访问时,直接OpenProcess会返回系统错误号5,首先调用AdjustTokenPrivileges开启SeDebugPrivilege特权就能绕过去,HOOK API除外。
楼主的代码出错是因为第10行的$ai_Handle,DllCall的返回值是数组,把$ai_Handle改成$ai_Handle就可以了。另外,如果只是要结束进程,而不对进程进行其他的 例如读写内存的访问操作,把OpenProcess的第1个参数0x1f0fff改成1就行了,这样可以确保在目标进程的访问控制列表允许进程被中止,但不允许进行其他操作的情况下,仍然可以成功调用OpenProcess取得进程句柄。 提高权限吧 p版果然是一代大家风范! 学习了,大家
页:
[1]