lvjing79 发表于 2012-6-8 14:30:23

为何跨进程API Hook无法Hook到系统服务方式运行的进程

我使用了P版编写的RTApiHook32.au3,目的是想Hook一个进程的CreateFile函数,并修改其中的某个参数。
程序编写好后,一直无法Hook到该进程的信息,后来分析可能该进程是以系统服务的方式启动的,于是将服务停止,手工从开始菜单的“运行”启动该进程,这样该进程就是以explorer.exe启动的了。这样我的程序可以成功Hook到信息了。
后来我又查找论坛,使用了http://www.autoitx.com/forum.php?mod=viewthread&tid=16759&highlight=%BD%F8%B3%CC中提到的_CreateProcessAsSystem以及设置父进程为services.exe和http://www.autoitx.com/forum.php?mod=viewthread&tid=18059&extra=&highlight=%B7%FE%CE%F1&page=1中将Hook程序通过系统服务启动的方式,但都无法成功Hook到以服务方式运行的进程信息。
我想要Hook的进程是war-ftpd.exe,是一个免费的FTP服务器程序,下载地址是http://www.warftp.org/?menu=344。
如果P版有时间的话,能否帮我看看怎么能Hook到它?
谢谢!

lvjing79 发表于 2012-6-11 10:49:06

自己顶一下。

pusofalse 发表于 2012-6-14 00:02:32

服务是以SYSTEM权限启动的,挂钩之前需要启用DEBUG特权。

lvjing79 发表于 2012-6-14 21:26:12

挂钩之前需要启用DEBUG特权。
pusofalse 发表于 2012-6-14 00:02 http://www.autoitx.com/images/common/back.gif
请问启用debug特权该如何操作呢?是否在 LocalSecurityAuthority.au3 中能找到吗?

lvjing79 发表于 2012-6-15 17:28:52

$hToken = _OpenProcessToken(-1)
If Not $hToken Then WriteLog("获取自身进程令牌失败")
Local $aPriv = [[$SE_DEBUG_NAME, 2]]
If Not _IsPrivilegeEnabled($hToken, $SE_DEBUG_NAME) Then
        If Not _AdjustTokenPrivileges($hToken, $aPriv) Then WriteLog("设置Debug权限失败")
EndIf我使用了上面的代码,但是还是无法hook到进程的API,请再帮忙看看。

pusofalse 发表于 2012-6-16 07:12:13

仔细想了一下,这个库确实无法操作服务程序。普通进程运行在Default桌面下,而服务进程则不然,分处于两个不同桌面的进程无法实现消息传递,而这个库在截取到API调用时,内部则是调用了SendMessage函数来通知Autoit进程,因此导致了这个BUG。若要操作服务程序,需要重写整个库文件。
感谢楼主兄提出的这个问题,我现在才知道它确是有很多BUG。

lvjing79 发表于 2012-6-16 15:38:33

还好被hook的程序能够以非服务方式起动。看来au3在处理这些底层方面还是比较弱,希望能越来越完善吧。

曼菲士 发表于 2012-6-16 16:42:45

学习了,积累经验也是件好事。

pusofalse 发表于 2012-6-16 16:50:25

回复 7# lvjing79


    只是我在编写之初没有考虑全面而已,何以见得Au3在处理这所谓底层的问题时不够强大?

menfan1 发表于 2012-6-17 11:12:19

希望早日见到P版的新作品哈。

lvjing79 发表于 2012-6-17 20:27:09

回复 9# pusofalse
大体就是觉得windows系统编程的代码大多是用c或c++编写的,但转换为au3对于我来说还是高深了一点。但个人没有看低au3的意思,反而觉得au3在某些方面是非常方便好用的。
页: [1]
查看完整版本: 为何跨进程API Hook无法Hook到系统服务方式运行的进程