Windows7 口令登录过程调试

基本原理

Windows7 以后 Winlogon 进程是动态的,有用户登录就会创建一个 Winlogon 进程,因此系统中完全 可能存在多个登录进程,注销后 Winlogon 进程也会随之结束。

Windbg 断点 NtCreateUserProcess 观察 Windows7 启动流程:


我整理的基本进程树如下:

smss.exe autochk.exe

smss.exe 00000000 0000003c //session 0

Csrss.exe

Wininit.exe

Services.exe

开机自启动服务进程

Lsass.exe

Lsm.exe

smss.exe 00000001 0000003c //session 1

Csrss.exe

Winlogon.exe

LogonUI.exe

LogonUI.exe 负责用户认证界面,Windows7 以后不再使用 msgina.dll,而是使用多个进程配合,完成用户 认证过程,大致过程为 1、Winlogon 启动 LogonUI 等待用户输入凭证 2、Winlogon 通过 ALPC 通知 Lsass用户登录 3、Lsass 依次查询认证模块【本地认证 MSV1_0.dll】4、Lsass 返回认证结果。框图如下


调试过程

必须要吐槽下,windows7 下 windbg 内核调试应用程序经常断不下了,害我浪费了很多功夫~~现总结 了一个稳当可靠的办法:

1、!process 0 0 查看目标进程的基本情况,主要是 Cid。

2、bp nt!KiFastCallEntry "j poi(@$teb+20) = 0x1a0'';'gc'" 把 1a0 替换成实际的 Cid 即可。

3、等断点命中后,bp winlogon!XXXXX

4、.reload /user 下,bl 看一下,确保函数解析成地址。

首先看 Winlogon 和 LogonUI 之间的交互,LogonUI.exe 就是一个壳,类似 svchost,真正的功能是通 过 authui.dll模块完成的,从《Windows Internals5》介绍,winlogon 是通过 ALPC 的东西同 Lsass 通信的,但是 LogonUI 没怎么讲,我估计八成也是一样的,应该就是 RPC 调用。

RPC 调用分服务端和客户端,客户端最终 RPCRT4!NdrClientCall2 执行调用,而服务端最终会执行

RPCRT4!Invoke执行具体的函数。

我们断点 winlogon!NdrClientCall2观察下【这里不 bp RPCRT4!NdrClientCall2主要是避免其他进程干 扰,因为 RPC 在系统中调用很频繁】,随便输入个密码,命中:


这里我们发现 winlogon 的确使用了 RPC 调用来执行进程交互,注意这个函数名是 WluiDisplayStatus,其 实很明确的告诉我们 winlogonUIDisplayStatus,那么该 RPC 最终在哪里被执行呢?很显然是在 authui.dll 下断点 RPCRT4!Invoke 命中,而后单步跑一下,如图:


直接从 IDA 里面翻了下 authui.dll注册 RPC 服务



直接把所有的 RPC 接口函数 DUMP 出来,如下:


其中 WluirRequestCredentials很惹人关注,对应的 winlogon!WluirRequestCredentials函数如下:


Winlogon 同 logonUI 的 authui.dll 中通过一一对应的 RPC 函数完成接口调用,下面是一次错误密码测 试过程时,依次命中的调用情况:

序号函数名描述

1

winlogon!WluiRequestCredentials请求用户输入凭证,注:该函数是阻塞函数,会一直等待直到用户确认登录才返回。

2

winlogon!WluiDisplayStatus显示状态?未细究。

3

winlogon!WluiReportResult通报结果。

4

winlogon!WluiDisplayRequestCredentialsError显示登录错误提示。

我们发现基本上 LogonUI 进程没干啥活,所以的动作都是 winlogon 的 WluiXXXXXX 接口消息驱动的,

IDA 里面会发现大量的 DirectUI 界面代码。

Winlogon 使用状态机来维护整个登录过程中的各种情况处理,通过 Winlogon!StateMachineSetSignal

来完成状态切换,整个状态定义 DUMP 如下【未截全】:


例如:断点 Winlogon!StateMachineSetSignal点击登录界面残障人士按钮,命中如下:


注意其中的参数二对应的是状态,查下状态 9 对应的正是 g_xWinsrv_AccessNotify_Signal,winlogon

和 LogonUI 的交互基本上流程基本比较清晰了,下面我们重点研究下 winlogon 同 lsass 进程完成密码认证

的一些细节。

Winlogon 同样使用 RPC 调用完成同 lsass 的交互,不同的是 windows 把这几个 RPC 调用封装成了 DLL

形式,分别是 SspiCli 客户端和 SspiSrv 服务端,最终还是调用了 RPCRT4 函数,证据如下:


直接从 IDA 中 DUMP 出 SSPISRV 的 RPC 调用接口如下:


根据《windows internals 5》一文,Winlogon 调用 SspiCli!LsaLogonUser完成登录,该函数最终通过

RPC 调用 Lsass::SspiSrv!SspirLogonUser


其中 AuthenticationInformation 参数里面包含了登录所需的信息,具体结构如下:


Windbg 显示这里密码被加密了,哈哈,下内存写断点,命中堆栈如下:


Winlogon!WLGeneric_Request_Logon_Credz_Execute 对应的代码如下:


该函数首先通过 RequestCredentials 函数请求登录凭证,如果是本地登录模式,该函数最终会调用 WluiRequestCredentials函数执行 LogonUI 进程的 RPC 服务函数 authui!WluiRequestCredentials,请求用户输入登录凭证。

最终 authui!CRequestCredentialsCallbackData::GetCredential获取用户登录凭证,数据结构为

_CRED_PROV_CREDENTIAL* 可惜没有数据结构定义。


输入“qqqqqqqq”调试显示 DUMP 如下:


下内存断点:Ba w1 0027e5c8+3e,命中堆栈如下:


这里 windbg 函数显示的函数 CRequestCredentialsCallbackData::GetShutdownChoice+0x63是错误的,实际 是 sub_7483CBE7 函数:


查看一下内存数据,如下:


源地址是 0027e510,长度是 000000b0 :


Ba w1 0027e510+3e,命中 查看源地址 238df78: 继续跟踪内存 Ba w1 238df78+3e


查看内存如下:


函数 KerbInteractiveUnlockLogonPack是一个可以 google 到的函数,很好。


02 024df8fc 024df924 024df928 authui!KerbInteractiveUnlockLogonPack+0x90


断点 ba w1 023888b8 命中堆栈


CredProtect 函数 MSDN 如下:


查看堆栈第二个参数,果然是明文密码:


对应的解密函数 CredUnprotect


这些内容实际在 lsass 进程里面解密,断点 ADVAPI32!CredUnprotectW命中堆栈如下:


最终的密码认证还是通过群众喜闻乐见的 msv1_0!LsaApLogonUserEx2来完成,如下:

时间: 2024-08-31 19:38:10

Windows7 口令登录过程调试的相关文章

Win 7系统口令登录过程调试方法

首先介绍Windows 7系统基本原理 Windows7 以后 Winlogon 进程是动态的,有用户登录就会创建一个 Winlogon 进程,因此系统中完全 可能存在多个登录进程,注销后 Winlogon 进程也会随之结束. Windbg 断点 NtCreateUserProcess 观察 Windows7 启动流程: 我整理的基本进程树如下: smss.exe autochk.exe smss.exe 00000000 0000003c //session 0 Csrss.exe Winin

Microsoft SQL Server 7.0储存过程调试指南

server|过程 Microsoft SQL Server 7.0储存过程调试指南  摘要:描述了如何使用Microsoft Visual InterDev的SQL调试器来清除Microsoft SQL Server储存过程中的错误. 使用Visual InterDev清除储存过程和触发器中的错误如果您正在使用Microsoft Visual Studio企业版,Visual InterDev包含有一个SQL调试器.您可以使用它象处理其他脚本或程序一样,清除SQL Server储存过程和触发器

数据库连接失败:已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)

问题描述 <%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-t

QQ 登录过程演示工具

花了一点精力,做了如下 QQ2010 版本的登录过程演示工具,主要是用于演示如何截取用户登录时的输入.此工具的原理比较基本,主要是利用全局钩子截获用户的输入.主要是演示作用,因此我又做了一个很直观的界面,可以看到截获输入的过程.其用户界面如下所示:     此图中左侧是我做的工具(由于我对腾讯灌输的价值观一向鄙视,所以QQ的LOGO被我替换成了"狗日的腾讯"图标),右侧是真正的QQ2010 SP1(1760)的登录对话框.当用户在QQ的登录对话框进行登录时,其输入将会从我的工具上直观的

已成功与服务器建立连接但是在登录过程中发生错误的解决

  已成功与服务器建立连接,但是在登录过程中发生错误的解决方案 数据库一打开就提示 已成功与服务器建立连接,但是在登录过程中发生错误的解决方案 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程.) 解决办法: 1.应该是服务器上没有开启管道支持,看到网上有人有同样问题,远程桌面进SQL Server服务器上试一下: 打开'程序'-'所有程序'-'Microsoft SQL Server 2005 '-'配置工具'-'SQL Server 配置管理器',在弹

windows7系统登录远程服务器的两种方法

  windows7系统登录远程服务器的两种方法          解决方法一: 1.Windows系统有自带的登录系统,点击"运行"(或者windows+R)输入"mstsc",即可打开远程桌面连接界面,输入自己的计算机名称; 2.然后输入用户名和密码即可登录,windows的登录方式so easy; 解决方法二: 1.Linux系统相对来说会比较麻烦,它是使用ssh服务来提供远程连接的.因此需要借助诸如putty.xshell.secureCRT等工具进行连接才

VS2010连接数据库:已成功与服务器建立连接,但是在登录过程中发生异常

问题描述 VS2010连接数据库:已成功与服务器建立连接,但是在登录过程中发生异常 数据库确定没问题,服务器数据库其他人也可以连接正常使用,但是,我的VS2010连接的时候出现了这样的提示... 解决方案 看错误是超时 了,难道网络速度太慢了? 解决方案二: ssl握手错误,超时了 解决方案三: 先用你自己电脑连接对方sqlserver看有没有问题吧

SSH 使用密钥登录并禁止口令登录实践

前言 无论是个人的VPS还是企业允许公网访问的服务器,如果开放22端口的SSH密码登录验证方式,被众多黑客暴力猜解捅破菊花也可能是经常发生的惨剧.企业可以通过防火墙来做限制,普通用户也可能借助修改22端口和强化弱口令等方式防护,但目前相对安全和简单的方案则是让SSH使用密钥登录并禁止口令登录. 这是最相对安全的登录管理方式 生成PublicKey 建议设置并牢记passphrase密码短语,以Linux生成为例 Linux:ssh-keygen -t rsa [私钥 (id_rsa) 与公钥 (

已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)

之前做好的asp.net部署后,发现 访问数据库时: 异常:已捕获: "已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确.)" (System.Data.SqlClient.SqlException)捕获到一个 System.Data.SqlClient.SqlException: "已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Pro