windows上调试win32子系统的方法

 最近做的一个东西需要调试win32子系统(例如Lsass.exe进程),但是发现要对win32子系统进行调试好像比较麻烦。
首先想到的是它是运行在user mode, 因此一般来讲应该用user mode的调试工具来调试。可是,如果用debuuger直接
跟它相连,调试器退出时计算机就会自动重启,使得调试无法进行下去。其次,如果我们想在机器启动的时候调试
lsass也不可能,因为user mode debugger那个时候还不能工作。

经过一番google及认真研究,发现有三种方法可以用来调试lsass,并且各有优缺点。下面是收集到的资料。


1. ntsd piped through KD
    a. 修改注册表
        HKLM\Software\Microsoft\Windows NT\CurrenVersion\Image File Execution Options\lsass.exe 
            debugger = REG_SZ c:\debuggers\ntsd.exe -d -g -G
    b. 用另一台机器通过kernal debugger和测试机相连
    c.重起测试机

    这样的话,在启动阶段,当系统调起lsass的时候,测试机的ntsd就开始工作,并且将输入,输出传送到kernal debugger上。这个属于
在kernal debugger里进行user mode的调试。

优点:可以在启动的时候调试lsass。
缺点:symbols and source files 必须要copy在测试机上。(不太方便)

2.Debugging LSA via dbgsrv.exe
    a.Find the PID for LSA via tlist.exe
    b. C:\Program Files\Debugging Tools for Windows>dbgsrv.exe -t tcp:port=1234,password=spat
    c.Run this command to attach to LSA on the remote machine.
        I:\debugger>windbg.exe -premote tcp:server=192.168.1.102,port=1234,password=spat -p 596 -- where 596 = PID of LSASS

优点:symbols and source files 可以在调试机上
缺点:不能在启动的时候进行调试

3.Debugging LSA from Kernel
    a. Get the process address for LSASS
        0: kd> !process 0 0 lsass.exe
            PROCESS 815196c0 SessionId: 0 Cid: 010c Peb: 7ffdf000 ParentCid: 00e4
            DirBase: 042d2000 ObjectTable: 81519aa8 TableSize: 859.
            Image: LSASS.EXE

    b. Switch to the process context:
        Either .process /p /r 815196c0
        Or .process –i 815196c0 ;g;.reload /user

优点:symbols and source files 可以在调试机上,可以进行log out/ log on 过程的调试
缺点:不能在启动的时候进行调试

因此,如果想在启动的时候调试,就必然要选方法1。

如果想在log on的时候调试,选择方法3。其他情况,可以选择方法2,或者方法3。 

进过分析及一些实践侯决定采用dbgsrv.exe的方式对lsass.exe进行调试,下面是我的一些调试总结:

1、在虚拟机和本机上都装个windbg, 在本机安装windows symbols文件。在虚拟机安装windbg的目的主要
在于使DbgSrv (dbgsrv.exe)能够在远程调试机器上运行起来。(DbgSrv (dbgsrv.exe). 用于远程调试的进程服务器。)

然后在虚拟机上运行:dbgsrv.exe -t tcp:port=1234,password=lisl 

在调试机(本机)运行:
    windbg.exe -premote tcp:server=172.21.119.135,port=1234,password=lisl03 -p 596 
    其中lisl03是调试密码,172.21.119.135是虚拟机的ip,1234是远程调试端口,596是虚拟机的lsass.exe进
程的pid。 

    由于使用Debugging LSA via dbgsrv.exe的方式的优点在于:symbols and source files 可以在调试机上,
但是缺点在于不能在启动的时候进行调试。因此为了在启动的时候进行调试,有网友利用windows的任务计划
让dbgsrv开机就运行起来。

    这里作为试验,使用命令runas重现口令验证过程。
    
2、在桌面建立快捷方式:
    "C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" -premote tcp:server=172.21.119
.135,port=1234,password=lisl03 -p 716
    
    双击打开后连接远程服务器,然后执行:.logopen建立日志文件,安装symbols符号,执行:
    !peb

    
3、在内核中执行对lsass的调试时,需要注意以下几点:
    a、连接时需要选择reconnected
    b、执行进程的切换操作:!process 0 0; .process /r /p EPROCESS(lsass)或者执行 .process /i EPROCESS(lsass)
        g、.reload 

4、
可以使用计划任务的方法在登陆之前就运行dbgsrv,这样连接上dbgsrv就可以调试了。否则因为登陆之后运行dbgsrv后,
注销的时候dbgsrv就被关了。


后记:进过实践后发现windbug是一个很不错的调试器,特别是在内核调试方面,在经历了softice不时导致的一些错误之后
觉得今后的调试应该转向windbg。而且windbg微软还在不停的维护中,其他常用的调试器在这方面好像没有了优势。另外,
windbg还有很多的强大的命令,如wt,使用qd可以在退出调试器时不结束被调试进程等。

   

你可能感兴趣的:(windows,服务器,进程,调试,子系统)