阅读:3371回复:24
非驱动问题:WinLogon进程如何与SAS交互???
1、看了MSDN和《Inside Windows 2000 3rd》,它们对这个问题都是一笔带过。谁能详细说一说?
2、MSDN提到:When Winlogon initializes, it registers the CTRL+ALT+DEL secure attention sequence (SAS) with the system, and then creates three desktops within the WinSta0 window station. 请问Winlogon如何registers “the CTRL+ALT+DEL secure attention sequence (SAS) with the system”?谁能说一下它的详细步骤? |
|
最新喜欢:![]() |
沙发#
发布于:2002-10-14 14:17
可能上面我说得不够仔细!举一下具体的例子,MSDN提到“The WlxLoggedOnSAS function must be implemented by a replacement GINA DLL. Winlogon calls this function when it receives an SAS event while the user is logged on and the workstation is not locked.”
上面所说的SAS event的发送者是谁?那个发送者在什么情况下产生SAS event并向Winlogon进程发送? |
|
板凳#
发布于:2002-10-14 17:14
怎么都没有人回复啊???是不是不明白我在说什么?好,再举一个例子:
MSDN提到“The GINA is responsible for recognizing a secure attention sequence (SAS), monitoring for SAS events, and notifying Winlogon when an SAS has occurred.” GINA通过什么机制来Monitoring SAS evnet???问题应该描述得比较清楚了吧? |
|
地板#
发布于:2002-10-15 08:39
这个问题有难道啊,估计微弱是出于安全原因不会公布这个细节的技术问题。我因为工作关系前一段时间开发了一个GINA,根据MSDN的说法,可以注册一个自定义的SAS,但是查遍所有文档都无法找到如何注册的方法。
|
|
地下室#
发布于:2002-10-16 20:29
SAS的监视工作是由CSRSS(csrss.exe)完成的!CSRSS进程创建了一个原始输入线程(RIT),这个线程打开键盘和鼠标设备并读取数据,然后他会将这些输入事件发送到相应的线程输入队列中。OK,唠叨了这么多,Winlogon注册CTRL+ALT+DEL SAS也就是通过LPC通知CSRSS,希望RIT线程能够监视CTRL+ALT+DEL的键盘输入,Winlogon注册SAS时也会传送过去一个Winlogon创建的窗口句柄(你无法枚举到这个窗口,因为他属于Winlogon桌面),如果SAS发生,CSRSS会向该窗口发送消息,winlogon自然也绘制到。因此,GINA根本不会监视SAS的发生,GINA不过是一个插件罢了,SAS发生时,winlogon会调用GINA的接口。
|
|
5楼#
发布于:2002-10-16 21:11
To:icube
高!!!头脑清醒了不少:),呵呵。 1、我为什么提这个问题? 经常有人询问怎样在Windows 2000下面屏蔽Ctrl + Alt + Del组键,一种常被提到的解决方法就是使用自己写的GINA去替换MSGINA.DLL,然后在WlxLoggedOnSAS里边直接返回WLX_SAS_ACTION_NONE。嘿嘿,说到底这并不是真正地屏蔽了这个组合键,只是直接返回WLX_SAS_ACTION_NONE时,Winlogon进程又自动从\"Winlogon\"桌面切换回原来的“Default”桌面了,而不是显示安全对话框,所以看起来被屏蔽了:)。如果想实现真正意义上地屏蔽,就只有找到事件处理的源头了, 但是我摸不着头绪,所以才提这个问题。 老兄上面已经说了事件处理是从哪个部分开始了,那接下来的问题就是: (1)、有没有可能可以Hook 那个原始输入线程(RIT),截获Ctrl + Alt + Del ?(是不是必须编写驱动?) (2)、如果问题(1)没有办法办到,那既然CSRSS通过向Winlogon建立的窗口发送消息告诉他SAS事件发生了,那么有没有可能可以截获那个窗口的窗口过程(使用SetWindowLong)截获Ctrl + Alt + Del? 注:根据MSDN的说明,LocalSystem帐号用户可以访问Winlogon桌面,因此编写一个系统服务,应该可以访问那个Winlogon桌面的。 2、老兄上面说了“GINA根本不会监视SAS的发生”。但是SAS事件有很多种,比如:WLX_SAS_TYPE_SC_INSERT、WLX_SAS_TYPE_SC_REMOVE、WLX_SAS_TYPE_TIMEOUT,这些事件又是谁在监视? =============== 题外话:我不是程序员,所以这些技术不会使用在什么商业软件当中,仅仅是因为爱好而已。 |
|
6楼#
发布于:2002-10-18 14:26
没有哪位大侠愿意再指点一下吗?
|
|
7楼#
发布于:2002-10-19 12:55
KEYBOARD的打开不是APP能做的. 在KEYBOARD CLASS DRIVER中有一段代码是用于屏蔽APP打开KEYBOARD来读取. 用于确保KEYBOARD仅能被DRIVER打开读取. 至于CSRSS真正如何将KEYBOARD CONNECT到THREAD INPUT QUEUE中, 应当有私有的API. 可能是让W32K.SYS中干.
// // We do not allow user mode opens for read. This includes services (who // have the TCB privilege). // if (Irp->RequestorMode == UserMode && (irpSp->Parameters.Create.SecurityContext->DesiredAccess & FILE_READ_DATA) ) { status = STATUS_ACCESS_DENIED; goto KeyboardClassCreateEnd; } GINA并不监视KEYBOARD QUEUE. 但是在SAS出现时能得到通知. |
|
|
8楼#
发布于:2002-10-20 17:02
(1)你要想hook那个RIT好象不太可能,要想截获Ctrl + Alt + Del可能是要写键盘和鼠标类驱动的过滤驱动程序
(2)我曾经写过一个winlogon notify packet,它是一个dll可以接受winlogon的事件通知(见msdn),我在这个dll接受到登陆通知时运行了spy程序(他运行在winlogon桌面),使用spy你就可以看到winlogon 的确创建了一个sas notify window,不过当我监视这个窗口的消息时,会引起桌面无法切换(?)。我想,截获这个消息理论上是可行的,你可以写个winlogon notify packet,然后在winlogon调用他的时候去调用SetWindowsHookEx来设置WH_GETMESSAGE hook (3)我说过“GINA根本不会监视SAS的发生”,但这句话只在监视Ctrl + Alt + Del时是正确的。对于其他类型的SAS事件,gina负责监视,他要调用WlxSasNotify 来通知winlogon SAS的发生 |
|
9楼#
发布于:2002-10-20 21:57
1、关于截获Ctrl+Alt+Del,正在研究...最近太忙,可能要经过一段时间才能继续这个问题。
2、关于SAS事件的监视,现在连我都对“GINA负责监视SAS事件”这种说法感到不可思议。GINA总共就那10几个函数,实在看不出是哪一部分代码在监视SAS事件!为什么MSDN却说“The GINA is responsible for recognizing a secure attention sequence (SAS), monitoring for SAS events, and notifying Winlogon when an SAS has occurred.” ?????? 如果说是CSRSS.EXE在监视SAS事件还可以让人感到理解,GINA就太那个了:( ================================================= 先给分,但是还希望更位大侠继续赐教...如果答案令人感到满意,我会另开贴给分的:) 还有:为什么我只能给20分?我可是想给100分啊!^_^ |
|
10楼#
发布于:2002-10-21 17:41
我想应该是Winlogon进程吧,当我们登陆Windows时,首先输入用户名和密码,而该信息的输入可通过Gina来实现用户自己的输入,也就是说我们的所有操作通过Gina,而Gina是由Winlogon来加载的(当然Winlogon还需要创建LPC端口和一个线成,还要启动SMC等),以上仅为我个人的观点,不一定正确:)
可能上面我说得不够仔细!举一下具体的例子,MSDN提到“The WlxLoggedOnSAS function must be implemented by a replacement GINA DLL. Winlogon calls this function when it receives an SAS event while the user is logged on and the workstation is not locked.” |
|
|
11楼#
发布于:2002-10-22 14:27
搞定!
通过截获SAS Window的消息,发现按Ctrl + Alt + Del组合键时,WM_HOTKEY消息发生,截获这个消息,那个安全对话框果然不显示了! 哈哈哈...我倒,我再倒:) ================================== //--------------------------------------------------------------------------- //作者 :韦覃武 //网上呢称:BCB_FANS(四大名捕之追杀令)(此为CSDN和www.driverdevelop.com之帐号) //E-Mail :slwqw@163.com //日期 :2002-10-20 // //功能 :在2000下屏蔽Ctrl + Alt + Del组合键。(在Windows 2000 Professional SP3 // 中文版平台下面测试通过) //原理 :采用远程线程注入技术,装载一个DLL到Winlogon进程,然后截获SAS窗口的窗 // 口过程,接管WM_HOTKEY消息,以达到屏蔽Ctrl + Alt + Del之目的。 //开发语言:Borland C++Builder 5.0 Patch2 //技术比较:关于在2000下面如何屏蔽Ctrl + Alt + Del组合键,一种常被提到的解决方法就 // 是使用自己写的GINA去替换MSGINA.DLL,然后在WlxLoggedOnSAS里边直接返回 // WLX_SAS_ACTION_NONE。嘿嘿,说到底这并不是真正地屏蔽了这个组合键,只是 // 直接返回WLX_SAS_ACTION_NONE时,Winlogon进程又自动从\"Winlogon\"桌面切换 // 回原来的\"Default\"桌面了,而不是显示安全对话框,所以看起来被屏蔽了:), // 使用那种方法明显地看到桌面在闪烁!但是使用本文的方法时,你不会看到任 // 何闪烁! //鸣谢 :www.driverdevelop.com上的icube和lu0。 //版权 :转载请注明原作者:) //--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #pragma hdrstop //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- HWND hSASWnd; FARPROC FOldProc; TStringList *MsgList = NULL; LRESULT CALLBACK SASWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam); //--------------------------------------------------------------------------- HANDLE hThread = NULL; DWORD dwThreadId; DWORD WINAPI ThreadFunc(); //--------------------------------------------------------------------------- #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { switch(reason) { case DLL_PROCESS_ATTACH : hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&dwThreadId); break; case DLL_PROCESS_DETACH : if(MsgList != NULL) { MsgList->SaveToFile(\"F:\\\\Inprise\\\\CBuilder5\\\\Projects\\\\RemoteThread\\\\RemoteDll\\\\SAS_MSG.TXT\"); delete MsgList; } SetWindowLong(hSASWnd,GWL_WNDPROC,long(FOldProc)); CloseHandle(hThread); break; } return 1; } //--------------------------------------------------------------------------- DWORD WINAPI ThreadFunc() { HDESK hDesk; hDesk = OpenDesktop(\"Winlogon\",0,false,DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_READOBJECTS | DESKTOP_JOURNALRECORD | DESKTOP_HOOKCONTROL | DESKTOP_ENUMERATE | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU); hSASWnd = NULL; EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowsProc,0); if(hSASWnd != NULL) { MsgList = new TStringList(); FOldProc = (FARPROC)SetWindowLong(hSASWnd,GWL_WNDPROC,long(SASWindowProc)); if(FOldProc == NULL) MsgList->Add(\"Failed to Hook SAS Window Proc.Err = \" + SysErrorMessage(GetLastError())); else MsgList->Add(\"Succeeded in Hooking SAS Window Proc.\"); MsgList->Add(\"\"); } return 1; } //--------------------------------------------------------------------------- //查找\"Winlogon\"桌面的窗口 BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) { char ClassBuf[128]; GetWindowText(hwnd,ClassBuf,sizeof(ClassBuf)); //通过编写系统服务,然后查询得知存在窗口\"SAS window\"。 if(AnsiString(ClassBuf).Pos(\"SAS window\") > 0) { hSASWnd = hwnd; return false; } return true; } //--------------------------------------------------------------------------- //SAS窗口的窗口过程 LRESULT CALLBACK SASWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { MsgList->Add(\"Msg: Wnd = \" + IntToHex((int)hwnd,8) + \" Msg = \" + IntToHex((int)uMsg,8)); //屏蔽Ctrl + Alt + Del if(uMsg == WM_HOTKEY) { WORD wKey = HIWORD(lParam); WORD wModifier = LOWORD(lParam); bool IsCtrlDown = (wModifier & VK_CONTROL != 0); bool IsAltDown = (wModifier & VK_MENU != 0); bool IsShiftDown = (wModifier & VK_SHIFT != 0); //按下Ctrl + Alt + Del组合键 if(IsCtrlDown && IsAltDown && wKey == VK_DELETE) { return 1; } //按下Ctrl + Shift + Esc组合键,这个组合键将显示任务管理器,可根据需要是否屏蔽。 else if(IsCtrlDown && IsShiftDown && wKey == VK_ESCAPE) { // Do nothing } } return CallWindowProc(FOldProc,hwnd,uMsg,wParam,lParam); } //--------------------------------------------------------------------------- =============================== 上面没有贴出远程注入代码,因为网上到处都是,找一下就可以了,如果谁确实想要,可以给我发E-Mail,不过我是使用C++Builder编写的。 |
|
12楼#
发布于:2002-10-22 14:28
我靠,怎么代码格式都乱套了:(
|
|
13楼#
发布于:2002-10-22 16:49
天!你怎么也从csdn到这里来了?
|
|
|
14楼#
发布于:2002-10-23 16:10
大虾!为什么 UnHook 后, C+A+D 永远不起作用了!
必须重启动,注销都不行! 环境 PIII800/256/40G Win2K AdvSvr SP2 ! |
|
15楼#
发布于:2002-10-23 16:33
1、我上面已经说了:在Windows 2000 Professional SP3中文版平台下面测试通过,因此不敢保证在其它平台也同样起作用了。
2、既然Unhook之后,Ctrl + Alt + Del仍然被屏蔽,那就有可能是卸载RemoteDLL.DLL失败,估计是插入卸载远程线程失败引起的,建议老兄自己调试一下。 3、Hook必须和Unhook操作次数一样,不可能Hook两次,Unhook一次。 4、不要叫我“大侠”,我不是什么大侠,纯属菜鸟一个! |
|
16楼#
发布于:2002-10-24 11:45
跟了一下,发现确实是 卸载RemoteDLL.DLL失败!
|
|
17楼#
发布于:2002-10-24 13:16
我在《电脑编程技术/维护》2002.09中看到比较好的方法,就是替换GINA,导出所有MSGINA.dll的接口,它说到MSDN有所有接口的说明,就是那些 Wxx之类的,这样,当用户按下Ctrl+alt+del,winlogon会从注册表中找到GIAN,并调用它,所有如果只是控制Ctrl+alt+del,替换GINA会更安全,根本就不需要写DRIVER。
文中举的例子是Ctrl+alt+del。 |
|
18楼#
发布于:2002-10-24 15:45
To : gz818
我这里没有这种事,希望老兄调试成功后,把结果放上来也好让我知道那个地方出问题。 To : vcmfc 使用GINA当然可以,我只是想找另一种方法而已。 |
|
19楼#
发布于:2002-10-24 16:49
瑞星捣鬼!卸载就可以了!
原因不知! [编辑 - 10/24/02 by gz818] |
|
上一页
下一页