利用windbg探索進程和進程上下文


1.列出所有活動進程

 

使用!process命令可以打印出活動進程的信息。第一個參數是要打印的EPROCESS的地址,如果指定為0則表示打印所有的進程。第二個參數用於說明打印進程信息的詳細級別。指定0則表示打印最簡單的信息。

 

[plain] view plain?

  1. 0: kd> !process 0 0  
  2. **** NT ACTIVE PROCESS DUMP ****  
  3. PROCESS 821b7490  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000  
  4. DirBase: 02b80020  ObjectTable: e1003e30  HandleCount: 350.  
  5. Image: System  
  6. PROCESS 82072da0  SessionId: none  Cid: 0234    Peb: 7ffd4000  ParentCid: 0004  
  7. DirBase: 02b80040  ObjectTable: e14323d0  HandleCount:  19.  
  8. Image: smss.exe  
  9. PROCESS 8204ab28  SessionId: 0  Cid: 0264    Peb: 7ffd6000  ParentCid: 0234  
  10. DirBase: 02b80060  ObjectTable: e156e898  HandleCount: 434.  
  11. Image: csrss.exe  
  12. PROCESS 81e87580  SessionId: 0  Cid: 027c    Peb: 7ffde000  ParentCid: 0234  
  13. DirBase: 02b80080  ObjectTable: e1478c18  HandleCount: 294.  
  14. Image: winlogon.exe  
  15. PROCESS 820b5378  SessionId: 0  Cid: 02a8    Peb: 7ffde000  ParentCid: 027c  
  16. DirBase: 02b800a0  ObjectTable: e16d3480  HandleCount: 273.  
  17. Image: services.exe  
  18. [...]省略部分輸出  

 

輸出結果中我可以看到幾個重要的字段:

·Cid : 進程id

·Peb : 進程環境塊的地址

·ParentCid : 父進程id

·DirBase : 目錄表 (用於轉換虛擬地址和物理地址PDT)

·ObjectTable : 進程的句柄表

如果要針對某個進程查看更詳細的信息,可以按照如下方式指定EPROCESS塊地址,並提高信息的詳細級別

 

[plain] view plain?

  1. 0: kd> !process 81f8e4b8 1  
  2. PROCESS 81f8e4b8  SessionId: 0  Cid: 0134    Peb: 7ffdf000  ParentCid: 02a8  
  3. DirBase: 02b802a0  ObjectTable: e1b49790  HandleCount: 101.  
  4. Image: TPAutoConnSvc.exe  
  5. VadRoot 81f85208 Vads 88 Clone 0 Private 276. Modified 1. Locked 0.  
  6. DeviceMap e1003118  
  7. Token                             e1afe528  
  8. ElapsedTime                       00:00:08.218  
  9. UserTime                          00:00:00.031  
  10. KernelTime                        00:00:00.031  
  11. QuotaPoolUsage[PagedPool]         55852  
  12. QuotaPoolUsage[NonPagedPool]      3520  
  13. Working Set Sizes (now,min,max)  (1012, 50, 345) (4048KB, 200KB, 1380KB)  
  14. PeakWorkingSetSize                1012  
  15. VirtualSize                       33 Mb  
  16. PeakVirtualSize                   34 Mb  
  17. PageFaultCount                    1028  
  18. MemoryPriority                    BACKGROUND  
  19. BasePriority                      8  
  20. CommitCharge                      393  

 

 

2.切換進程上下文

 

因為進程的地址空間都是相互獨立的,所以我們使用dd 0x400000之類的指令是沒有意義的。因為我們不確定當前用戶地址空間就是我們的目標進程地址空間。因此我們首先要切換到我們想查看的進程上下文。之后才能查看它私有的地址空間。如果不按這個規定的話,有可能得出的結果是很多?????

 

[plain] view plain?

  1. 0: kd> .process 81f8e4b8  
  2. Implicit process is now 81f8e4b8  
  3. WARNING: .cache forcedecodeuser is not enabled  
  4. 0: kd> dd 0x400000  
  5. 00400000  00905a4d 00000003 00000004 0000ffff  
  6. 00400010  000000b8 00000000 00000040 00000000  
  7. 00400020  00000000 00000000 00000000 00000000  
  8. 00400030  00000000 00000000 00000000 00000100  
  9. 00400040  0eba1f0e cd09b400 4c01b821 685421cd  
  10. 00400050  70207369 72676f72 63206d61 6f6e6e61  
  11. 00400060  65622074 6e757220 206e6920 20534f44  
  12. 00400070  65646f6d 0a0d0d2e 00000024 00000000  
  13. 0: kd> .process  
  14. Implicit process is now 8055d0c0  
  15. 0: kd> dd 0x400000  
  16. 00400000  ???????? ???????? ???????? ????????  
  17. 00400010  ???????? ???????? ???????? ????????  
  18. 00400020  ???????? ???????? ???????? ????????  
  19. 00400030  ???????? ???????? ???????? ????????  
  20. 00400040  ???????? ???????? ???????? ????????  
  21. 00400050  ???????? ???????? ???????? ????????  
  22. 00400060  ???????? ???????? ???????? ????????  
  23. 00400070  ???????? ???????? ???????? ????????  

 

 

3.列出進程已經加載的dll

 

切換到目標進程上下文之后,我們可以使用!peb或者!dlls命令列出進程已經加載的dll。進程加載的dll列表保存在peb中,所以這兩條命令都能很好的工作。只是顯示格式不同罷了。比如我要查看我本機的TPAutoConnSvc.exe

 

[plain] view plain?

  1. 0: kd> !peb  
  2. PEB at 7ffdf000  
  3. InheritedAddressSpace:    No  
  4. ReadImageFileExecOptions: No  
  5. BeingDebugged:            No  
  6. ImageBaseAddress:         00400000  
  7. Ldr                       00251e90  
  8. Ldr.Initialized:          Yes  
  9. Ldr.InInitializationOrderModuleList: 00251f28 . 002533c8  
  10. Ldr.InLoadOrderModuleList:           00251ec0 . 00253550  
  11. Ldr.InMemoryOrderModuleList:         00251ec8 . 00253558  
  12. Base TimeStamp                     Module  
  13. 400000 4a76ebe1 Aug 03 21:53:37 2009 C:\Program Files\VMware\VMware Tools\TPAutoConnSvc.exe  
  14. 7c920000 4802bdc5 Apr 14 10:13:25 2008 C:\WINDOWS\system32\ntdll.dll  
  15. 7c800000 4802bdc6 Apr 14 10:13:26 2008 C:\WINDOWS\system32\kernel32.dll  
  16. 41000000 4a76ebcf Aug 03 21:53:19 2009 C:\WINDOWS\system32\TPSvc.dll  
  17. 695d0000 4802bd9d Apr 14 10:12:45 2008 C:\WINDOWS\System32\Wbem\framedyn.dll  
  18. 77be0000 4802be3f Apr 14 10:15:27 2008 C:\WINDOWS\system32\msvcrt.dll  
  19. 77da0000 4802bd89 Apr 14 10:12:25 2008 C:\WINDOWS\system32\ADVAPI32.dll  
  20. 77e50000 4802bdae Apr 14 10:13:02 2008 C:\WINDOWS\system32\RPCRT4.dll  
  21. 77fc0000 4802bdc1 Apr 14 10:13:21 2008 C:\WINDOWS\system32\Secur32.dll  
  22. 77d10000 4802bdbd Apr 14 10:13:17 2008 C:\WINDOWS\system32\USER32.dll  
  23. 77ef0000 4802bd81 Apr 14 10:12:17 2008 C:\WINDOWS\system32\GDI32.dll  
  24. 770f0000 4802bdbd Apr 14 10:13:17 2008 C:\WINDOWS\system32\OLEAUT32.dll  
  25. 76990000 4802bdbc Apr 14 10:13:16 2008 C:\WINDOWS\system32\ole32.dll  
  26. 77bd0000 4802bdbf Apr 14 10:13:19 2008 C:\WINDOWS\system32\VERSION.dll  
  27. 759d0000 4802bdbe Apr 14 10:13:18 2008 C:\WINDOWS\system32\USERENV.dll  
  28. 76320000 4802bda2 Apr 14 10:12:50 2008 C:\WINDOWS\system32\comdlg32.dll  

 

4.查看進程的內存映射情況

 

虛擬地址描述符(Virtual Adderss Descriptor)包含一個進程中用戶空間已分配地址信息。Vad能夠幫助我們快速的定位隱藏或者注入的代碼。但是首先我們需要找到Vadroot。不過這個在EPROCESS中已經明確指出了。直接把Vadroot的地址作為參數,使用!vad命令即可得出進程用戶空間已分配的內存信息。

 

[plain] view plain?

  1. 0: kd> !vad 81f85208  
  2. VAD     level      start      end    commit  
  3. 82060128 ( 4)         10       10         1 Private      READWRITE           
  4. 81ae0760 ( 5)         20       20         1 Private      READWRITE           
  5. 81ae95b0 ( 3)         30      12f         4 Private      READWRITE           
  6. 81ed7a20 ( 5)        130      132         0 Mapped       READONLY           Pagefile-backed section  
  7. 81ffebc8 ( 4)        140      141         0 Mapped       READONLY           Pagefile-backed section  
  8. 81f89578 ( 6)        150      24f        24 Private      READWRITE           
  9. 82012798 ( 5)        250      25f         6 Private      READWRITE           
  10. 82003408 ( 7)        260      26f         0 Mapped       READWRITE          Pagefile-backed section  
  11. 82002e98 ( 6)        270      285         0 Mapped       READONLY           \WINDOWS\system32\unicode.nls  
  12. 81ae9370 ( 8)        290      2d0         0 Mapped       READONLY           \WINDOWS\system32\locale.nls  
  13. 81c050d8 ( 7)        2e0      320         0 Mapped       READONLY           \WINDOWS\system32\sortkey.nls  
  14. 81ed79b8 ( 9)        330      335         0 Mapped       READONLY           \WINDOWS\system32\sorttbls.nls  
  15. 81ed7b58 ( 8)        340      380         0 Mapped       READONLY           Pagefile-backed section  
  16. 81c03260 ( 9)        390      39f         5 Private      READWRITE           
  17. 81c05758 (10)        3a0      3a2         0 Mapped       READONLY           \WINDOWS\system32\ctype.nls  
  18. 81e7f460 (11)        3b0      3bf         8 Private      READWRITE           
  19. 81e1d168 (12)        3c0      3c0         1 Private      READWRITE           
  20. 81bd5bd0 (13)        3d0      3d0         1 Private      READWRITE           
  21. 81f8e868 (15)        3e0      3e1         0 Mapped       READONLY           Pagefile-backed section  
  22. 81e1b0e8 (14)        3f0      3f1         0 Mapped       READONLY           Pagefile-backed section  
  23. 81e43cd0 ( 2)        400      440        13 Mapped  Exe  EXECUTE_WRITECOPY  \Program Files\VMware\VMware Tools\TPAutoConnSvc.exe  
  24. [...]  
  25. 81bdc0c8 ( 5)        9e0      9fb        23 Mapped  Exe  EXECUTE_WRITECOPY  \WINDOWS\system32\TPVMW32.dll  
  26. 81e18b28 ( 4)        a00      a0f         4 Private      READWRITE           
  27. 81f85208 ( 0)        a10      a10         0 Mapped       READWRITE          Pagefile-backed section  
  28. 81e840b8 ( 5)        a20      a23         0 Mapped       READWRITE          Pagefile-backed section  
  29. 81e17178 ( 4)        a30      b2f        10 Private      READWRITE           
  30. 81e19128 ( 6)        b30      c2f         3 Private      READWRITE           
  31. 81bd02b0 ( 5)        c30      d2f         5 Private      READWRITE           
  32. 82003a28 ( 7)        d30      e2f         2 Private      READWRITE           
  33. 81e17988 ( 6)        e30      e6f         3 Private      READWRITE           
  34. 81e1a548 ( 7)        e70      e7f        12 Private      READWRITE           
  35. 81adfc70 ( 8)        e80      e8d         0 Mapped       READWRITE          Pagefile-backed section  
  36. 81a968e0 ( 9)        e90      e90         1 Private      READWRITE           
  37. <span style="color:#330033;">81ed5e50 ( 3)      10000    10023        10 Mapped  Exe  EXECUTE_WRITECOPY  \WINDOWS\system32\tprdpw32.dll</span>  
  38. 81e7d200 ( 2)      41000    41078        25 Mapped  Exe  EXECUTE_WRITECOPY  \WINDOWS\system32\TPSvc.dll  
  39. 81f86980 ( 5)      5adc0    5adf6         2 Mapped  Exe  EXECUTE_WRITECOPY  \WINDOWS\system32\uxtheme.dll  
  40. [...]  
  41. <span style="color:#ff6666;">81ed5220 ( 2)      7c920    7c9b2         5 Mapped  Exe  EXECUTE_WRITECOPY  \WINDOWS\system32\ntdll.dll</span>  
  42. [...]     


如果要計算出每個vad節點的虛擬地址,只需要將開始地址和結束地址乘以0x1000即可。我們來看看0x81ed5220處的vad,他的位於0x7c9200000x7c9b2000這個區間段。並且映射了可執行文件tprdpw32.dll。用lm查看一下這個地址。

 

[plain] view plain?

  1. 0: kd> lm vt a 0x7c920000  
  2. start    end        module name  
  3. 7c920000 7c9b3000   ntdll      
  4. Loaded symbol image file: ntdll.dll  
  5. Image path: ntdll.dll  
  6. Image name: ntdll.dll  
  7. Timestamp:        Mon Apr 14 10:13:25 2008 (4802BDC5)  
  8. CheckSum:         00097CB7  
  9. ImageSize:        00093000  
  10. Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4  

 

5.查看進程句柄表

 

使用!handle命令可以列出當前進程所有已經打開的句柄信息。!handle命令的第一個參數是句柄值(如果是0則列出所有句柄),第二個參數是所需信息的詳細程度(!process一樣)。如下命令列出了當前進程上下文中所有的句柄信息

 

[plain] view plain?

  1. 0: kd> !handle 0 0  
  2. PROCESS 81f8e4b8  SessionId: 0  Cid: 0134    Peb: 7ffdf000  ParentCid: 02a8  
  3. DirBase: 02b802a0  ObjectTable: e1b49790  HandleCount: 101.  
  4. Image: TPAutoConnSvc.exe  
  5. Handle table at e1b0c000 with 101 entries in use  
  6. 0004: Object: e1009540  GrantedAccess: 000f0003 Entry: e1b0c008  
  7. Object: e1009540  Type: (821b3730) KeyedEvent  
  8. ObjectHeader: e1009528 (old version)  
  9. HandleCount: 28  PointerCount: 29  
  10. Directory Object: e1009f58  Name: CritSecOutOfMemoryEvent  
  11. 0008: Object: e14d00d8  GrantedAccess: 00000003 Entry: e1b0c010  
  12. Object: e14d00d8  Type: (821b7040) Directory  
  13. ObjectHeader: e14d00c0 (old version)  
  14. HandleCount: 28  PointerCount: 64  
  15. Directory Object: e1003350  Name: KnownDlls  
  16. 000c: Object: 81f88b38  GrantedAccess: 00100020 (Inherit) Entry: e1b0c018  
  17. Object: 81f88b38  Type: (821e9900) File  
  18. ObjectHeader: 81f88b20 (old version)  
  19. HandleCount: 1  PointerCount: 1  
  20. Directory Object: 00000000  Name: \WINDOWS\system32 {HarddiskVolume1}  
  21. [...]  

 

其中type指出了句柄關聯的對象的類型,object字段表明了對象的地址。handlecountpointercount分別記錄了句柄引用次數和指針引用次數(ObrefrenceObjectByHandleByName)

 

 

RING3下斷

首先切換到用戶環境,.process命令的功能是在內核態調試時,切換進程CONTEXT。執行如下命令:

1:使用!process 0 0 獲取用戶空間的所有的進程的信息
kd> !process 0 0 explorer.exe
PROCESS 81fff020 SessionId: 0 Cid: 0600 Peb: 7ffde000 ParentCid: 05f0
    DirBase: 048401c0 ObjectTable: e19d5188 HandleCount: 371.
    Image: explorer.exe

2:使用.process /p + 你需要斷的應用程序的EProcess地址切換到應用程序的地址空間

kd> .process /p 81fff020

3:重新加載user PDB文件

kd> .reload /f /user

4:使用非侵入式的切換進程空間

kd> .process /i /p 81fff020

5:下應用層斷點。

 

 jpg 改成 doc 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM