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

  首先介绍Windows 7系统基本原理

  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 返回认证结果。框图如下

 

  Windows 7调试过程

  必须要吐槽下,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 调用接口如下:

 


  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-10-23 02:21:57

Win 7系统口令登录过程调试方法的相关文章

Windows7 口令登录过程调试

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

Win 8系统中创建虚拟磁盘的方法

1. 在屏幕左下角单击右键,选择神秘菜单中的"磁盘管理": 2.在弹出的磁盘管理窗口中,选择操作菜单下的"创建VHD": 3.在弹出的窗口中为虚拟磁盘指定存放的位置.大小.格式以及类型. 格式:VHD为早期的虚拟磁盘格式,最大可支持2T存储;VHDX为Windows 8中新出现的虚拟磁盘格式,最大可支持至64T,但是在之前版本系统中并不支持. 类型:固定大小则在创建磁盘时直接为创建的磁盘分配指定的大小;动态扩展则会根据使用的情况逐渐对虚拟磁盘文件大小进行扩容,直到达

修改Win 8系统的登录界面DPI设置的方法

开头寄语:随着显示器技术的发展,屏幕的分辨率在不断地提升,1920x1080分辨率的显示器也开始成为一般设备啦! 不过Windows 系统的默认DPI还停留在 96DPI,这在高分辨率的显示器下面查看文字效果很不好;相信不少朋友已经手动调节DPI了,不过像我一样,你可能对登录界面的DPI设置感到疑问:为什么还是默认的 96DPI呢?在 Windows Vista 中,DPI设置像分辨率设置一样,属于一个全局设置,进行设置之后所有用户包括登录界面处的DPI都会设置为你需要的值.而从 Win 7 开

win 2003系统不能正常启动解决方法

1.当系统启动显示操作系统列表时, 按f8 出现高级启动选项; a. safe mode: 只加载基本的服务和驱动. 用于解决安装了额外的硬件驱动或软件后,导致系统不能正常启动的情况.选择safe mode,若能进入操作系统,卸载额外的驱动或软件. b.last known good: 启动上一次的成功配置. 用于解决对系统的驱动,及服务进行了错误的配置后导致系统不能引导的情况.选择last known good 可以恢复到上一次正常登录时的配置. c.vga mode: 使用标准vga模式启动

Win 8系统邮件功能新体验方法

第一步. 我们调出超级任务栏,找到"设置"选项,找到"账户"一项,如图 找到"账户" 第二步. 点击进入后,如图   windows8教程 点击"添加账户" 添加账户 您可以随意选择添加自己的任何邮箱.设置完毕后,您设置的邮箱将会出现在邮箱应用界面的首页. 以后,我们再也不用登陆网站去查看自己的邮件了.在Windows 8中,只要您使用自己的微软账户登录系统,就可以享受邮件随时查收的方便.而且,邮件应用己经集成了推送功能,只要

Win 8系统标准触摸键盘开启方法

例如我在使用 Windows 8 平板后,触摸键盘打字时就遇到了不少困扰,比较典型的例子是缺少上下方向键,如图所示:Windows 8 默认提供的触摸键盘,右下角只有左右方向键,没有ESC.Insert.上下方向键(旁边的上箭头是Shift)等,在符号输入部分仍然没有. 手指点击很难和标准按键的方便性相比,例如在Word和Excel中,使用上下方向键可以在同一列中精确定位,触摸却很难保证精确.另外,很多 桌面软件需要按ESC.Home.Pause等才能继续或实现某些功能,省略掉这些键会带来软件上

Win 8系统更新KB2770917失败的方法

现在有多位国外用户在网上发布文章反映,当他们为Win8安装更新时,除了KB2770917补丁之外,所有其余的补丁都能够正常安装,而当他们多次尝试安装KB2770917补丁时,配置程序每次都会在15%时提示失败并执行系统的回滚操作. 对此,微软方面目前还未作出明确的答复,但有网友在随后的文章回复中表示可尝试下面所列举的方法来进行安装: 1.输入并运行"MSCONFIG.EXE"命令打开系统配置对话框; 2.点选位于对话框顶部的"服务"选项卡,并勾选"隐藏所有

win 8系统无法关机的解决方法

1. 点击windows8系统的关机重启没有反应 通过修改注册表 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager: BootExecute 2.发现里面有关于自动检测那个移动硬盘卷的命令,将其删除, 3.只保留autocheck autochk *,注意这个"*"不能丢哦. 顺利关机,如不能关机,强制关机后重启,wininit.exe占用恢复到0%, 此时可以顺利关机. 结语:通过以上3个步骤,就可以解决w

win 8系统怎么外接投影仪的方法

方法一: 1.桌面点击右键选择"屏幕分辨率"; 2.在多显示器选项中选择所需的显示方式,点击"确定"即可. 方法二: 1.将鼠标放置在屏幕的有右下角,在出来的菜单中选择"设备"; 2.选择"第二屏幕"; 3.这时将可以看到外接显示的方式,点击所需要的即可.         注:更多请关注电脑教程 栏目,三联电脑办公群:189034526欢迎你的加入