Win7交互式服务编程,不弹出交互式服务检测
第一次写Windows服务程序,XP下一个MessageBox都弹不出来,在Services.msc中允许其与桌面交互后,MessageBox就能正常弹出。但在Win7下总是弹出[Windows交互式服务检测]的对话框,即使选择显示消息,也完全是在另一个环境下显示的,这是在Win7下交互式服务所面临的共同问题。
在百度上查了一下,知道交互式服务检测由Interactive Services Detection服务完成。当有服务要与桌面交互的时候,就会触发Interactive Services Detection服务,接着弹出[Windows交互式服务检测]的对话框。
禁用Interactive Services Detection是无法解决问题的,这样连[Windows交互式服务检测]都不会出现,更何况是与桌面交互的内容呢。
后来我想到新建一个子程序,由这个子程来显示我的对话框
服务无法显示出对话框,子程不是一个服务,不存在与桌面交互的限制,我想这样应该没问题了吧。。。
现实是残酷的。。。我就运行Calc.exe,可爱的计算器压根都出不来,出来的还是那个该死的[Windows交互式服务检测]。。。那时我想屎的心都有了。。。
困扰我N多天,我突然发觉不对劲。同样作为服务,为什么Interactive Services Detection就能弹出[Windows交互式服务检测]的对话框,我们写的服务就弹不出呢???凭什么丫
于是我把焦点集中在Interactive Services Detection服务上。查看Interactive Services Detection服务主程序UI0Detect.exe的输入表,看到CreateProcessAsUser的时候好像想到了些什么。再次运行我的服务,出现[Windows交互式服务检测]的时候打开ProcExp,看到两个UI0Detect.exe,互为父子进程。父进程是服务,子进程不是。想到CreateProcessAsUser,查看一下,果然,父进程的用户为SYSTEM,子进程的用户为当前我用的帐户。
这时候,一切问题都该迎刃而解了吧。
以下代码Win7下测试通过,XP也能用。运行Windows计算器,Windows计算器界面出现正常,不弹出[Windows交互式服务检测]。
.686p
.model flat,stdcall
option casemap:none
include Windows.inc
include User32.inc
include Kernel32.inc
include AdvApi32.inc
include NtDll.inc
include Wtsapi32.inc
includelib User32.lib
includelib Kernel32.lib
includelib AdvApi32.lib
includelib NtDll.lib
includelib Wtsapi32.lib
.data?
hSS dd ?
hToken dd ?
stSS SERVICE_STATUS <?>
@WTS_SESSION_INFO_SessionId dd ?
@WTS_SESSION_INFO_pWinStationName dd ?
@WTS_SESSION_INFO_WTS_CONNECTSTATE_CLASS dd ?
Proc1 STARTUPINFO <?>
Proc2 PROCESS_INFORMATION <?>
.data
@stSTE_lpServiceName dd offset SrvName
@stSTE_lpServiceProc dd offset ServiceMain
.const
SrvName dw 'G','F','K','r','n','l',0
cmd dw 'C',':','\','w','i','n','d','o','w','s','\','S','y','s','t','e','m','3','2','\','c','a','l','c','.','e','x','e',0
.code
SrvCtrlProc Proc _dwControl
pushad
mov eax,_dwControl
.IF eax == SERVICE_CONTROL_STOP
mov stSS.dwCurrentState,SERVICE_STOPPED
invoke SetServiceStatus,hSS,offset stSS
.ElSEIF eax == SERVICE_CONTROL_INTERROGATE
invoke SetServiceStatus,hSS,offset stSS
.EndIF
popad
ret
SrvCtrlProc endp
assume fs:nothing
ServiceMain Proc _dwArgc,_lpszArgv
pushad
invoke RegisterServiceCtrlHandlerW,offset SrvName,offset SrvCtrlProc
mov hSS,eax
mov stSS.dwServiceType,SERVICE_WIN32_OWN_PROCESS
mov stSS.dwCurrentState,SERVICE_RUNNING
mov stSS.dwControlsAccepted,SERVICE_ACCEPT_STOP
mov stSS.dwWin32ExitCode,NO_ERROR
invoke SetServiceStatus,hSS,offset stSS
invoke WTSGetActiveConsoleSessionId
invoke WTSQueryUserToken,eax,offset hToken
invoke CreateProcessInternalW,hToken,offset cmd,0,0,0,FALSE,NORMAL_PRIORITY_CLASS,0,0,offset Proc1,offset Proc2,0
LoopA:
invoke Sleep,-1
jmp LoopA
popad
ret
ServiceMain endp
Start:
invoke StartServiceCtrlDispatcherW,offset @stSTE_lpServiceName
invoke NtTerminateProcess,-1,0
end Start
以上代码思路就是,获取当前用户的Token,以当前用户身份创建子进程,想显示出来的东西由这个子程完成。
注册服务的Reg文件:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\GFKrnl]
"DisplayName"="Cheege Games Filter Kernel Services"
"ImagePath"=hex(2):45,00,3a,00,5c,00,47,00,4d,00,46,00,6c,00,74,00,72,00,5c,00,\
47,00,46,00,53,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00
"Description"="XXXXX"
"ObjectName"="LocalSystem"
"ErrorControl"=dword:00000001
"Start"=dword:00000003
"Type"=dword:00000110
"FailureActions"=hex:00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,14,00,00,\
00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00
"RequiredPrivileges"=hex(7):53,00,65,00,54,00,63,00,62,00,50,00,72,00,69,00,76,\
00,69,00,6c,00,65,00,67,00,65,00,00,00,53,00,65,00,4c,00,6f,00,61,00,64,00,\
44,00,72,00,69,00,76,00,65,00,72,00,50,00,72,00,69,00,76,00,69,00,6c,00,65,\
00,67,00,65,00,00,00,00,00
"ServiceSidType"=dword:00000001
注意RequiredPrivileges,要有SeTcbPrivilege,不然有可能CreateProcessInternalW失败。还要有SeAssignPrimaryTokenPrivilege权限,否则WTSQueryUserToken失败。
我的编程风格可能有点不适合大家的口味,我爱自己在源码里拼凑结构体数据,dw定义Unicode字符串,爱用W结尾的API
Win7交互式服务编程,不弹出交互式服务检测相关推荐
- 计算机总是跳出交互式检测,交互式服务检测,教您如何解决电脑总是弹出交互式服务检测...
电脑总是会弹出交互式服务检测窗口,无法关掉,只能"点击稍后提醒我",但一会儿又会提醒,这让人感觉很烦.其实,只要在系统服务里将Interactive Services Detect ...
- 安了锐捷后电脑总是弹出交互式检测
未解决 ...... 治本不治标的方法 选择(开始)→(搜索程序或文件),有的Windows系统是(运行) 2.在(搜索程序或文件)框里输入(services.msc),输入完后点击上面出现的打开. ...
- win7怎么选择java打开网页_大神研习win7系统打开网页会弹出“应用程序已被JAVA安全阻止”的修复技巧...
win7系统有很多人都喜欢使用,我们操作的过程中常常会碰到对win7系统打开网页会弹出"应用程序已被JAVA安全阻止进行设置的解决思路却鲜为人知,小编前几天就遇到了打开网页会弹出" ...
- windows7的用户账户控制每次重启计算机时都会被关闭,win7系统更改设置总是弹出用户账户控制的解决方法...
很多小伙伴都遇到过win7系统更改设置总是弹出用户账户控制的困惑吧,一些朋友看过网上零散的win7系统更改设置总是弹出用户账户控制的处理方法,并没有完完全全明白win7系统更改设置总是弹出用户账户控制 ...
- window7系统为什么老是弹出交互式服务检测
用户反映最近电脑一直显示"交互式服务检测"提示,很是烦人!当点击"查看消息",出现的是网页,不知道该怎么弄掉,问如何将其关闭. 开始(WIN+R组合键 ctrl ...
- 关闭windows server 2016弹出交互式服务检测窗口
在使用windows server 2016的时候,忘记点了什么之后,一直弹出: 如何关闭呢? 1.Win+R组合键打开运行,输入services.msc,点击回车: 2.在服务列表中找到Intera ...
- 建行找不到服务器或DNS错误,Win7用浏览器上网总是弹出提示是否停止运行此脚本窗口...
腾讯视频/爱奇艺/优酷/外卖 充值4折起 最近,小编的朋友用浏览器上网,总是弹出提示"是否停止运行此脚本"窗口.询问小编后,得出结论,应该是流氓程序通过病毒篡改了浏览器的注册表,以 ...
- c语言编程为啥弹出的框会闪退,js中提示框闪退问题
Canvas绘图基础(一) 简单图形绘制 矩形:描边与填充 Canvas的API提供了三个方法,分别用于矩形的清除.描边及填充 clearRect(double x, double y, double ...
- win7html.exe,Win7无法打开exe可执行文件弹出打开方式的对话框
点评:想要打开一些已经安装的软件的程序的时候却弹出来一个要选择打开方式的对话框,也就是本身的可执行文件无法直接打开,下面与大家分享下有关此问题的解决方法 Exe可执行文件可以加在到内存中,并且由操作系 ...
最新文章
- 机房管理系列之文件服务器管理
- 成功解决Error while trying to retrieve text for error ORA-12154
- python进程实例
- Flask web开发之路二
- Error Domain=NSCocoaErrorDomain Code=3840 JSON text did not start with array or object and option
- Java面试宝典————基础篇
- php warning: array_merge(),php数组合并array_merge()函数使用注意事项_php技巧
- spark-08-SparkStraming简介与kafka0.8集群安装
- 七人表决器VHDL代码
- react中使用video标签显示本地视频不生效问题
- MacOS 下 Safari、Chrome 等浏览器 无法打开知到(智慧树)等网页解决方案
- linux命令get命令使用,Linux apt-get命令使用方法
- python3 读取.plist文件_在Python中解析plist文件
- hao123站长李兴平的成功史
- 乔戈里推荐的新版Java学习路线,开源!
- 数据可视化大屏的应用与落地实践
- 再见c罗再见梅西_再见眼镜你好smartglasses
- 网络编程之FTP文件传输协议
- 串的匹配 (KPM算法由来引导)
- Flink on Kubernetes