cutyourchicken 发表于 2011-4-9 00:42:32

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")

happytc 发表于 2011-4-9 02:46:57

首先你得给你的脚本本身搞高权限才行:EnablePrivilege(SE_DEBUG_NAME,true)
然后还得通知系统进程权限修改了:AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL )

接着就可以用:OpenProcess(............)
                     TerminateProcess(...........)

netegg 发表于 2011-4-9 06:35:08

本帖最后由 netegg 于 2011-4-9 06:36 编辑

没开权限吧,用adjustprevilige(?)把权限改了

pusofalse 发表于 2011-4-9 07:26:40

本帖最后由 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取得进程句柄。

kadingxiaodi 发表于 2011-4-9 07:43:45

提高权限吧

haijie1223 发表于 2011-4-9 13:09:51

p版果然是一代大家风范!

浪迹红客 发表于 2011-4-10 08:23:51

学习了,大家
页: [1]
查看完整版本: AU3如何正确调用API函数 TerminateProcess?