天天看点

远程线程注入技术 屏蔽ctrl+alt+del

在NT/2000中怎么禁用Ctrl+Alt+Delete?(不能用gina,键盘驱动) 

在Windows2000中Ctrl-Alt-Delete组合键的处理如下:

Winlogon初始化的时候,在系统中注册了CTRL+ALT+DEL Secure Attention Sequence(SAS)热键,并且在WinSta0 Windows 系统中创建三个桌面。 

SAS热键的注册使得Winlogon成为第一个处理CTRL+ALT+DEL的进程,所以保证了没有其他应用程序能够处理这个热键。

在 Windows NT/Windows 2000/Windows XP 中, WinSta0 是表示物理屏幕、鼠标和键盘的Windows系统对象的名字。Winlogon在WinSta0 Windows系统中创建了 SAS窗口(窗口标题是"SAS Window")和如下三个桌面。 

1、Winlogon 桌面 

2、应用程序 桌面 

3、屏幕保护 桌面

当用户按下Ctrl-Alt-Delete组合键时,Winlogon桌面上的SAS窗口收到它注册的系统热键消息(WM_HOTKEY) 

SAS Window窗口处理这个消息调用Graphical Identification and Authentication(GINA)动态连接库中的相关函数

要中断Ctrl-Alt-Delete组合键的处理,可以有以下方式

1、从键盘驱动层捕获Ctrl-Alt-Delete 

2、替换Winlogon 

3、替换GINA 

Hook Winlogon 上SAS窗口的窗口过程(需要当前登录用户有调试权限) 

Hook  GINA里边的函数WlxLoggedOnSAS,然后返回WLX_SAS_ACTION_NONE(未研究)

更多信息

鉴于系统的更新可能造成我们替换的系统文件和其他系统文件不兼容(著名的DLL地狱),所以不推荐替换Winlogon.exe和GINA的方法。这里我们讨论Hook Winlogon 上的SAS窗口的窗口过程的方法。 

因为SAS窗口和我们的程序内存地址空间不同,所以要写一个动态连接库,加载到SAS窗口的内存空间中。下面是动态连接库的源代码。 

这样,如果Winlogon加载了这个动态连接库,那么就替换了SAS窗口的窗口过程。如果Winlogon卸载了这个动态连接库,则恢复了SAS窗口的窗口过程。

为了让Winlogon加载我们的动态连接库,首先要找到Winlogon进程,然后在进程中分配空间存放我们的代码,再通过创建远程线程赖执行我们的代码。下面是Hook部分的代码

注意

如果Windows的后续版本更改了Ctrl+Alt+Delete的处理,本文所提供的技术可能不再工作。如果你在你的代码中使用了本文的技术,请注意你可能必须在未来修改你的代码。

已知问题

尚无Unicode版本 

VirtualAllocEx分配的内存没有用VirtualFreeEx释放 

在Debug方式下运行会造成Winlogon出错(出错后请不要确认或取消那个出错对话框,然后保存打开的所有文档,关闭所有程序,通过正常的途径关机,否则Windows会立刻关机)

参考

如果需要更多信息,单击下面的连接查看CSDN论坛中的讨论 

在NT/2000中怎么禁用Ctrl+Alt+Delete?(不能用gina,键盘驱动) 。 

MSDN文档库中的文章 

Q226359 HOWTO: Disable Task Switching on Win32 Platforms 

Q195027 STOP 0xC000021A in Winlogon Caused by PCAnywhere 

Q229033 Programs That Replace Msgina.dll May Cause "STOP 0x0000001E" Error Message 

Q192298 Third Party GINAs May Fail with Service Pack 4 Causing STOP 0x21A in WINLOGON 

Q164486 Winlogon May Fail if the Third-Party Gina.dll File is Missing or Corrupted 

Q180854 Access Violation in Winlogon with Third-Party Gina.dll 

Q193361 MSGINA.DLL does not Reset WINLOGON Structure

MSDN杂志中的文章

MSDN Magazine > September 2002 > Typename, Disabling Keys in Windows XP with TrapKeys(Paul DiLascia) 

MSDN Magazine > June 2002 > Windows XP Escape from DLL Hell with Custom Debugging and Instru****tion Tools and Utilities

VC知识库中的文章

Windows XP系统中如何屏蔽 Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列 

文章类型 : kbhowto 

-------------------------------------------------

众 所周知,在Windows 9X/Me系统中,屏蔽Ctrl+Del+Alt和各种任务开关键可以很轻松地通过API函数 SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,TRUE,&bOldState,0)解决, 但在Windows NT/2K/XP系列操作系统中,Ctrl+Del+Alt升级为最高级别组合键序列,成为系统安全预留的紧急出口,上述操作就无法实现了,即使采用 WM_KEYBOARD_LL低级键盘钩子也无法拦截,但也不是绝对没有办法,不然也就不会有本文了。

系统启动过程

在Windows NT/2K/XP 中,用户登陆采用新版的WinLogon和GINA(Graphical Identification and Authentication)即图形化身份认证,此外还提供了一个网络服务的动态链接库Network Provider DLL。由于用户认证策略是在Gina DLL中独立设计的,我们可以通过替换此文件的方式进行智能卡或指纹等方面的认证开发。

小知 识:WinLogon是Windows操作系统的一部分,提供用户交互式登陆支持,而GINA则是WinLogon实现认证的一个DLL,实际文件名 为:Windows NT/system32/msgina.dll。 Windows则是用这个DLL实现用户名+密码进行身份认证。古老的GINA木马就是利用的这一点来获取系统的登陆密码的。

WinSta0 是显示器、鼠标和键盘的Windows系统对象的名称,Winlogon初始化的时候,在WinSta0 Windows系统中创建了SAS窗口(窗口标题是“SAS Window”)并首先注册了CTRL+ALT+DEL Secure Attention Sequence(SAS)热键,接下来创建了三个桌面,即Winlogon 桌面(显示安全登陆界面),应用程序桌面(即正常进入所显示的我的电脑界面),屏幕保护桌面。由于SAS热键的注册使得 Winlogon成为第一个处理CTRL+ALT+DEL的进程,这保证了没有其它应用程序能够处理这个热键。

当用户按下Ctrl+Alt+ Del组合键时,Winlogon桌面上的SAS窗口收到它注册的系统热键消息(WM_HOTKEY)。SAS Window窗口处理这个消息调用 GINA DLL中的WlxInitialize、WlxActivateUserShell函数进行初始化和调用用户外壳程序。Windows就是用这个机制进行 用户和密码判断的,所以要中断Ctrl+Alt+Del组合键的处理,可以有以下方式:

1. 使用DDK(驱动程序开发包)编写键盘低层驱动程序捕获Ctrl+Alt+Del。

2. 替换Winlogon。

3. 编写GINA 代理DLL。

4. Hook Winlogon上SAS窗口的窗口过程(需要当前登录用户有调试权限)。

Socket:由于操作系统的升级换代非常容易引起用户自编写的DLL文件与系统文件之间的不兼容(著名的DLL地狱),由此不建议使用Winlogon.exe和GINA的方法,倾向于Hook Winlogon 上的SAS窗口并进行窗口子类化的方法。

开发原理

动 态嵌入技术是指将用户自己代码嵌入到正在运行的进程中技术。理论上讲,Windows每个进程都有自己私有内存空间,其它进程禁止访问其私有空间。但实际 上我们可用种种方法访问并操作其它进程的私有空间,这就是动态嵌入的DLL木马所采用的技术。在多种嵌入技术(HOOK 窗口,API挂接,远程线程)中,远程线程嵌入技术对用户要求不高,只要有基本的进程线程概念和DLL相关知识即可。

小知识:远程线程技术是指在一个进程中创建远程线程的手段进入目标进程的内存空间。通过CreateRemoteThread函数在目标进程内创建远程线程,共享目标进程的内存空间和其它资源,并且可以任意修改远程进程的数据,所以,此种作法风险极高。

通过将代码直接拷贝到远程线程内运行来完成动态嵌入,这种思想给了在应用程序中可动态屏蔽Ctrl+Alt+Del组合键的思路。在这之前我们要对Windows系统的内存偏移量也即相对内存进行修改,重点应用以下API函数:

1.首先我们要用FindWindow得到SAS窗口的句柄,因为我们要通过它获知运行后所在进程的ID,下面就是FindWindow的用法:

2.采用GetProcAddress得到窗口相对应的进程ID,函数用法如下:

3.得到进程ID后,接下来的事是要以最高权限打开进程,所用到的函数OpenProcess的具体使用方法如下:

在DwDesiredAccess之处就是设存取方式的地方,可设的权限很多,这里只使用PROCESS_ALL_ACCESS来打开进程就可以,更详细可查阅MSDN。

4.打开进程后,使用WriteProcessMemory来对内存地址写入数据即可:

5.创建远程线程以运行所嵌入的代码。

6.CloseHandle(HANDLE hObject)关闭进程句柄。

工程实践

在 系统集成的项目中,由于所开发的专业软件往往采用独占方式运行,软件开发中对用户无操作的空闲时段处理是必须考虑的问题。笔者在这种类型的项目中,考虑到 后期代码维护和模块集成调试方便,设计时摒弃了传统的DLL(动态链接库)嵌入形式,采用远程线程代码嵌入技术对核心部分也是最困难部分NT/2000平 台下屏蔽Ctrl+Alt+Del组合键进行处理。完成后程序运行稳定,实验效果非常良好。以下是核心代码:

1. 定义基本函数

我们需要用来给自身进程加入DEBUG权限的函数(有足够权限对别的进程进行操作),一个通过进程名得到进程ID的函数(Toolhelp 函数和PSAPI函数返回进程标识符(PID)值两种实现方式)。

2. 定义全局数据变量,准备线程的参数结构

定义对第一个处理Ctrl+Alt+Del组合键的WinLogon进程的文件名:

定义线程所嵌入代码的地址结构:

3. 定义嵌入代码的功能函数

对远程线程嵌入的代码进行功能划分,子类化SAS窗口模块、子类化窗口进程的远程线程模块、恢复被子类化的窗口进程的远程线程设置模块、返回远程线程的窗口句柄(Winlogon)模块四个功能函数,下面以子类化SAS窗口进行嵌入代码为演示,其余函数编码与此类似:

4. 远程线程嵌入代码实现

此时进行内存分配操作,远程线程空间嵌入用户编写的代码。将上述功能函数和地址结构INJECTDATA复制到远程线程空间,在默认的WinLogon窗口的进程内,远程调用函数InjectFunc(),进行Ctrl+Alt+Del组合热键屏蔽。

具体实现是在远程线程地址空间内依次写入GetSASWnd()代码模块拷贝、SASWindowProc()模块拷贝和初始化的INJECTDATA地址结构的拷贝。上述操作成功后,进行InjectFunc()函数拷贝的执行。

5. 复原系统设置

在这一步中进行出错处理和内存释放等系统复原工作,利用上述代码嵌入技术执行函数EjectFunc()完成清除卸载工作。

演 示程序在Windows2K+SP4平台上用VC6.0+SP6调试通过,在NT/XP平台上测试正常。程序代码中根据需要实时对编译器环境作了调整,关 闭了增量链接模式、优化和堆栈检查功能。由于DEBUG开发环境的设置出现了编译警告,但在RELEASE环境中编译正常。代码经过优化修改后已被某商用 项目采用,较圆满实现了锁定NT/2K/XP的特殊组合键Ctrl+Del+Alt,最后感谢《黑客防线》编程类文章给予作者的灵感!

继续阅读