关于Windows解锁的那些事
这里说的解锁,意思是从Windows锁定桌面返回到用户桌面。普通用户怎么解锁呢?很简单,按下热键CTRL+ALT+DEL,出现密码输入框,输入正确的密码,然后回车或点击登录即可。对于程序员来说,如何通过程序实现这个功能呢?
一、发送 CTRL+ALT+DEL 热键
1、Windows 2000、Windows XP、Windows 2003:
procedure MySendHotKey; const WM_HOTKEY = $0312; var HDesk_WL: HDESK; begin HDesk_WL := OpenDesktop('Winlogon', 0, False, DESKTOP_JOURNALPLAYBACK); if (HDesk_WL <>0) then begin if (SetThreadDesktop(HDesk_WL) = True) then begin PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT or MOD_CONTROL, VK_DELETE)); CloseDesktop(HDesk_WL); end; end; end;
原理就是切换到winlogon桌面然后模拟键盘热键,所以这个函数必须拥有system权限(比如说服务程序)才能执行成功。
2、Windows Vista及更高版本:
调用sas.dll里面的函数SendSAS(注意:这个Dll是Windows 7后才存在,早期的系统比如说Windows Vista需要自己从Windows7等高版本系统拷贝该Dll过去)。
procedure SendSAS( AsUser:BOOL );stdcall;external 'sas.dll';
这个函数有一个参数,意思是调用程序是何权限(user或system)。如果是user权限,还需要满足以下条件:
a、该程序拥有合法的数字签名。
b、该进程位于可信目录下(例如:Windows目录或Program Files目录)
另外,不管是何种权限,还需要修改组策略:
在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System下新建一个REG_DWORD类型的名称为SoftwareSASGeneration的Item,值设为1(system)或2(user)。
这个函数本质其实是一个RPC调用,如果不想调用该Dll,也可以自己实现RPC客户端或间接调用:
function WmsgSendMessage(theSession : dword; theMagic : dword; thePid : dword; theRet : LPARAM):dword;stdcall;external ‘WMsgAPI.dll’;
其中第一个参数是会话ID,第二个参数是$0208,第三个参数是当前的进程ID。
二、获取已登录用户密码
直接搜索lsass.exe的内存。点这里下载源码(来源:看雪论坛)。注意:对于Windows 8及后面的系统需要修改注册表并重启后才有效。
以前有一个产品,外表是一个USB的U盘,当插入到电脑后,会自动解锁并返回到桌面,很神奇。原理其实是一个badusb,先模拟键盘呼出“讲述人”的驱动安装,然后安装驱动后,在驱动里面注入,获取密码、输入密码并回车。
三、无密码直接解锁已登录桌面
1、 Windows 2000、Windows XP、Windows 2003
注入winlogon.exe,先用OpenDesktop打开默认桌面(‘Default’),再SwitchDesktop()切换即可。对,就是这么简单,连密码都省了。
2、 Windows Vista及更高版本:
a、RPC大法。
b、注入winlogon,获取窗口“’AUTHUI.DLL: LogonUI Logon Window’”的句柄,然后ShowWindow(xx,SW_HIDE);超级简单吧。点这里查看原理。
分类:系统编程
发表评论
XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
TrackBack URL | RSS feed for comments on this post.