slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
阅读:3369回复:24

非驱动问题:WinLogon进程如何与SAS交互???

楼主#
更多 发布于:2002-10-14 13:00
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”?谁能说一下它的详细步骤?

最新喜欢:

vxer_moonvxer_m...
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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进程发送?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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???问题应该描述得比较清楚了吧?
ghc
ghc
驱动牛犊
驱动牛犊
  • 注册日期2002-06-13
  • 最后登录2009-08-12
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-15 08:39
这个问题有难道啊,估计微弱是出于安全原因不会公布这个细节的技术问题。我因为工作关系前一段时间开发了一个GINA,根据MSDN的说法,可以注册一个自定义的SAS,但是查遍所有文档都无法找到如何注册的方法。
icube
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2004-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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的接口。

slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
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,这些事件又是谁在监视?

===============

题外话:我不是程序员,所以这些技术不会使用在什么商业软件当中,仅仅是因为爱好而已。
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-18 14:26
没有哪位大侠愿意再指点一下吗?
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
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出现时能得到通知.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
icube
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2004-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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的发生
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
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分啊!^_^
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
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.”

上面所说的SAS event的发送者是谁?那个发送者在什么情况下产生SAS event并向Winlogon进程发送?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
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编写的。

slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-10-22 14:28
我靠,怎么代码格式都乱套了:(
favorit
驱动牛犊
驱动牛犊
  • 注册日期2002-01-21
  • 最后登录2002-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-10-22 16:49
天!你怎么也从csdn到这里来了?
我一睁开眼,世界就变了样
gz818
驱动小牛
驱动小牛
  • 注册日期2002-02-26
  • 最后登录2008-11-15
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-10-23 16:10
大虾!为什么 UnHook 后, C+A+D 永远不起作用了!
必须重启动,注销都不行!
环境 PIII800/256/40G Win2K AdvSvr SP2 !
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-10-23 16:33
1、我上面已经说了:在Windows 2000 Professional SP3中文版平台下面测试通过,因此不敢保证在其它平台也同样起作用了。

2、既然Unhook之后,Ctrl + Alt + Del仍然被屏蔽,那就有可能是卸载RemoteDLL.DLL失败,估计是插入卸载远程线程失败引起的,建议老兄自己调试一下。

3、Hook必须和Unhook操作次数一样,不可能Hook两次,Unhook一次。

4、不要叫我“大侠”,我不是什么大侠,纯属菜鸟一个!
gz818
驱动小牛
驱动小牛
  • 注册日期2002-02-26
  • 最后登录2008-11-15
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-10-24 11:45
跟了一下,发现确实是 卸载RemoteDLL.DLL失败!
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
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。
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-10-24 15:45
To : gz818

我这里没有这种事,希望老兄调试成功后,把结果放上来也好让我知道那个地方出问题。

To : vcmfc

使用GINA当然可以,我只是想找另一种方法而已。
gz818
驱动小牛
驱动小牛
  • 注册日期2002-02-26
  • 最后登录2008-11-15
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-10-24 16:49
瑞星捣鬼!卸载就可以了!
原因不知!

[编辑 -  10/24/02 by  gz818]
上一页
游客

返回顶部