zoukankan      html  css  js  c++  java
  • [转]windbg下在kd模式也可以调试用户模式程序

    之前的调试winlogon程序,要在系统注册表做些设置。后来看到网上调试lsass程序

    只要按如下方法:

    !process 0 0 lsass.exe

    .process /p /r 815196c0

    我发觉按上面的方法做,连设置注册表都不需要了,非常方便。

    接着我们就可以按调用户模式的程序一样下断点调试了。

    举个例子,我们在登录的过程中需要输入用户名、密码,按如下过程就可以看到输入的内容了。

    我在user32!GetDlgItemTextW下了个断点,这个API我是在OD下看它的调用参考得来的

    (你可以复制一份,不运行它,只用来看反汇编,OD反出来的汇编码还是蛮好的)。

    kd>!process 0 0 winlogon.exe 找进程
    PROCESS 821661c8  SessionId: 0  Cid: 018c    Peb: 7ffd9000  ParentCid: 0138
        DirBase: 0ceb5000  ObjectTable: e14b1220  HandleCount: 392.
        Image: WINLOGON.EXE

    kd> .process /p /r 821661c8 置为当前进程,这样就可以操作它的虚拟空间了
    Implicit process is now 821661c8
    .cache forcedecodeuser done
    Loading User Symbols
    .......................................................
    kd> bp user32!GetDlgItemTextW 下断点
    kd> bl
     0 e 77d24305     0001 (0001) USER32!GetDlgItemTextW

    kd> g 继续运行,点击用户名并输入密码
    Breakpoint 0 hit
    USER32!GetDlgItemTextW:
    001b:77d24305 8bff            mov     edi,edi
    kd> kn 查看一下堆栈
     # ChildEBP RetAddr 
    00 0006e778 758d7f60 USER32!GetDlgItemTextW
    01 0006e7c8 758d7e1d MSGINA!AttemptLogon+0x4f
    *** WARNING: Unable to verify checksum for winlogon.exe
    02 0006e974 0103acc7 MSGINA!LogonDlgProc+0xc61
    03 0006e998 77d18734 winlogon!RootDlgProc+0x6e
    04 0006e9c4 77d23ce4 USER32!InternalCallWinProc+0x28
    05 0006ea30 77d23b30 USER32!UserCallDlgProcCheckWow+0x146
    06 0006ea78 77d23d5c USER32!DefDlgProcWorker+0xa8
    07 0006ea94 77d18734 USER32!DefDlgProcW+0x22
    08 0006eac0 77d18816 USER32!InternalCallWinProc+0x28
    09 0006eb28 77d2927b USER32!UserCallWinProcCheckWow+0x150
    0a 0006eb64 77d292e3 USER32!SendMessageWorker+0x4a5
    0b 0006eb84 758f29c8 USER32!SendMessageW+0x7f
    0c 0006ebb0 758f2e0d MSGINA!CLogonDialog::Handle_LOGON_LOGON_USER+0x9f
    0d 0006f004 758e39bf MSGINA!CLogonDialog::Handle_WM_LOGONSERVICEREQUEST+0x89
    0e 0006f018 758d6c3a MSGINA!_Shell_LogonDialog_DlgProc+0x58
    0f 0006f1d0 0103acc7 MSGINA!LogonDlgProc+0x93b
    10 0006f1f4 77d18734 winlogon!RootDlgProc+0x6e
    11 0006f220 77d23ce4 USER32!InternalCallWinProc+0x28
    12 0006f28c 77d23b30 USER32!UserCallDlgProcCheckWow+0x146
    13 0006f2d4 77d23d5c USER32!DefDlgProcWorker+0xa8
    kd> dd esp 查看返回地址($ra)及参数
    0006e77c  758d7f60 0003002a 000005df 00b20800
    0006e78c  00000200 0003002a 00000000 0008cd10
    0006e79c  00000001 0006e7ac 77d1971c 00000000
    0006e7ac  0006e7c4 758d7c4e 0002004a 00000000
    0006e7bc  0003002a 00b20000 00b20400 0006e974
    0006e7cc  758d7e1d 0003002a 0007e368 0007e3f8
    0006e7dc  00000111 00000000 0006edf4 771a3dda
    0006e7ec  dcbaabcd 00000000 0006e838 771a3dda
    kd> g 758d7f60 把这个API运行完才能得到内容
    MSGINA!AttemptLogon+0x4f:
    001b:758d7f60 57              push    edi
    kd> du 00b20800
    00b20800  "111222" 这个就是我输入的密码
    kd> g
    Breakpoint 0 hit
    USER32!GetDlgItemTextW:
    001b:77d24305 8bff            mov     edi,edi
    kd> dd esp  查看返回地址($ra)及参数
    0006e77c  758d7fd1 0003002a 000005de 00b20000
    0006e78c  00000200 0003002a 00000000 0008cd10
    0006e79c  00000001 0006e7ac 77d1971c 00000000
    0006e7ac  0006e7c4 758d7c4e 0002004a 0002004a
    0006e7bc  00000000 00b20000 00b20400 0006e974
    0006e7cc  758d7e1d 0003002a 0007e368 0007e3f8
    0006e7dc  00000111 00000000 0006edf4 771a3dda
    0006e7ec  dcbaabcd 00000000 0006e838 771a3dda
    kd> g 758d7fd1  把这个API运行完才能得到内容
    MSGINA!AttemptLogon+0xb8:
    001b:758d7fd1 53              push    ebx
    kd> du 00b20000

    00b20000  "Administrator" 显示用户名

  • 相关阅读:
    一位阿里架构师给每个程序员的小建议
    一位阿里架构师给每个程序员的小建议
    Redis五种数据类型详解
    Redis五种数据类型详解
    Redis五种数据类型详解
    JavaScript易错知识点整理
    JavaScript易错知识点整理
    JavaScript易错知识点整理
    船上比拼酒量_暴力破解
    phantomjs
  • 原文地址:https://www.cnblogs.com/adylee/p/2959249.html
Copyright © 2011-2022 走看看