2017-03-14 26 views
7

Về cơ bản, tôi có một chương trình chế độ người dùng gọi kernel32.CreateProcessA() mà nội bộ gọi kernel32.CreateProcessInternalW(). Trong hàm này, tôi quan tâm đến những gì đang xảy ra bên trong ntdll.NtCreateSection() để cố gắng ánh xạ thực thi trong bộ nhớ ảo. Khi ở trong chức năng này, chương trình sẽ nhanh chóng thiết lập cuộc gọi hạt nhân là EAX = 0x32 và thực thi lệnh SYSENTER.Làm cách nào để thực hiện gỡ lỗi chế độ người dùng/chế độ hạt nhân?

Rõ ràng là tôi không thể nhìn thấy ngoài cổng gọi trong trình gỡ lỗi chế độ người dùng. Tôi có một chút kinh nghiệm gỡ lỗi trình điều khiển chế độ hạt nhân, vì vậy tôi nạp một bản sao của XP SP3 trong một cửa sổ VMWare và sử dụng VirtualKD để conect ống để WinDbg (mà tôi xảy ra được chạy bên trong IDA). Sau khi kết nối trình gỡ rối hạt nhân, tôi đã sao chép chương trình EXE của người dùng và PDB vào máy ảo, nhưng tôi không biết làm thế nào để thiết lập điểm ngắt ban đầu trong chương trình chế độ người dùng của tôi đúng cách. Tôi không muốn chặn tất cả các cuộc gọi đến ntdll.ZwCreateSection() mà tôi tin là ở phía bên kia của cổng gọi. Lý tưởng nhất, tôi muốn đột nhập vào mã chế độ người dùng và bước qua cổng gọi đó ngay bây giờ khi tôi đang sử dụng trình gỡ lỗi hạt nhân, nhưng tôi không biết các bước đầu tiên là gì.

tôi đã thực hiện một số googling và tôi đã đến gần bằng cách thiết lập một "ntsd -d" giá trị trong

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\myprocess.exe 

Điều này gây ra một vết rách ở debugger kernel khi tôi bắt đầu quá trình của tôi, nhưng tôi có thể dường như không thiết lập bất kỳ breakpoint sau lệnh .breakin tôi cần phải phát hành để IDA để có được dấu nhắc WinDbg. Tôi đã theo dõi điều này guide nơi tôi xác định quy trình của mình bằng quá trình! Sau đó chuyển sang ngữ cảnh và tải lại các ký hiệu nhưng tôi gặp sự cố khi đặt điểm ngắt trong quy trình của mình hoặc tiến lên điểm ngắt ban đầu được đặt bởi "ntsd -d" . Sau khi nhận được thông báo rằng điểm ngắt không thể được giải quyết và điểm ngắt được hoãn lại được thêm vào, tôi dường như không thể chuyển tiếp "vào" cho quy trình mà không xóa các điểm ngắt nếu điều đó có ý nghĩa gì. Đây là chồng mà tôi dường như là tại khi tôi nhấn mà phá vỡ ban đầu:

ChildEBP RetAddr 
b2b55ccc 8060e302 nt!RtlpBreakWithStatusInstruction 
b2b55d44 8053d638 nt!NtSystemDebugControl+0x128 
b2b55d44 7c90e4f4 nt!KiFastCallEntry+0xf8 
0007b270 7c90de3c ntdll!KiFastSystemCallRet 
0007b274 6d5f5ca6 ntdll!ZwSystemDebugControl+0xc 
0007bd48 6d5f6102 dbgeng!DotCommand+0xd0d 
0007de8c 6d5f7077 dbgeng!ProcessCommands+0x318 
0007dec4 6d5bec6c dbgeng!ProcessCommandsAndCatch+0x1a 
0007eedc 6d5bed4d dbgeng!Execute+0x113 
0007ef0c 010052ce dbgeng!DebugClient::Execute+0x63 
0007ff3c 010069fb ntsd!MainLoop+0x1ec 
0007ff44 01006b31 ntsd!main+0x10e 
0007ffc0 7c817067 ntsd!mainCRTStartup+0x125 
0007fff0 00000000 kernel32!BaseProcessStart+0x23 

Thành thật mà nói, tôi không chắc chắn PDB của tôi đang được nạp nhưng tôi nghi ngờ có lẽ không vấn đề trước mắt của tôi nó; ngăn mô-đun của tôi chỉ hiển thị các mô-đun trình điều khiển hạt nhân, không hiển thị các mô-đun chế độ người dùng. Khi tôi đã thực hiện gỡ lỗi trình điều khiển trong quá khứ, tôi có thể thấy hình ảnh trình điều khiển của mình trong ngăn này và có biểu tượng đã được tải hay không, vì vậy tôi không chắc chắn về điều gì sẽ xảy ra với hình ảnh chế độ người dùng. Nếu không có hình ảnh, tôi thực sự không thể mong đợi trình gỡ lỗi giải quyết bất kỳ điểm ngắt nào.

Tôi nhận ra rằng mình có thể đang gặp vấn đề này hoàn toàn sai nhưng tôi không có may mắn khi tìm cách thực hiện gỡ lỗi lai chế độ người dùng/chế độ hạt nhân. Có ai ra khỏi đó có thể chỉ cho tôi đi đúng hướng để tôi có thể bước vào chức năng chế độ hạt nhân này từ một quá trình chế độ người dùng cụ thể? Hoặc, ít nhất thiết lập một điểm ngắt chế độ hạt nhân thích hợp để nó chỉ được kích hoạt như là kết quả của quá trình chế độ người dùng cụ thể của tôi?

CẬP NHẬT: Tôi đã tải mô-đun của mình (xảy ra có tên runlist.exe) trong trình gỡ rối chế độ người dùng trên hệ điều hành được gỡ rối (Tôi đã sử dụng OllyDbg). Khi tôi đã tạm dừng ở điểm dừng chế độ người dùng chỉ một vài hướng dẫn từ SYSENTER, tôi đã tạm ngưng hệ điều hành bằng trình gỡ lỗi hạt nhân. Sau đó tôi đặt bối cảnh quy trình. Lệnh WinDbg nội dung cửa sổ như sau:

WINDBG>!process 0 0 runlist.exe 

PROCESS 820645a8 SessionId: 0 Cid: 01b4 Peb: 7ffd7000 ParentCid: 02b0 
    DirBase: 089c02e0 ObjectTable: e1671bb0 HandleCount: 8. 
    Image: runlist.exe 

WINDBG>.process /i /r /p 820645a8 
You need to continue execution (press 'g' <enter>) for the context 
to be switched. When the debugger breaks in again, you will be in 
the new process context. 
WINDBG>g 
This command cannot be passed to the WinDbg plugin directly, please use IDA Debugger menu to achieve the same result. 
Break instruction exception - code 80000003 (first chance) 
WINDBG>.reload /user 
Loading User Symbols 
.... 
Caching 'Modules'... ok 
WINDBG>lmu 
start end  module name 
00400000 00405000 runlist C (no symbols)   
7c340000 7c396000 MSVCR71 (private pdb symbols) g:\symcache\msvcr71.pdb\630C79175C1942C099C9BC4ED019C6092\msvcr71.pdb 
7c800000 7c8f6000 kernel32 (pdb symbols)   e:\windows\symbols\dll\kernel32.pdb 
7c900000 7c9af000 ntdll  (pdb symbols)   e:\windows\symbols\dll\ntdll.pdb 
WINDBG>bp 0x7c90d16a 
WINDBG>bl 
0 e 7c90d16a  0001 (0001) ntdll!ZwCreateSection+0xa 

Mặc dù tôi không thể có được quá trình của tôi biểu tượng để tải với ".reload" (PDB là trong cùng thư mục - có thể cần phải sao chép nó vào những biểu tượng thư mục của tôi), breakpoint tôi quan tâm là trong ntdll anyway vì vậy tôi đặt nó vào địa chỉ 0x7C90D16A mà trình gỡ lỗi được công nhận là nằm trong ntdll.ZwCreateSection(). Oddly với tôi, trong chế độ người dùng mã địa chỉ này giải quyết để ntdll.NtCreateSection(), nhưng một trong hai cách mà breakpoint chỉ là 2 hướng dẫn từ nơi tôi đã có chế độ user-break của tôi. Khi tôi nối lại máy, ý định của tôi là "chạy" chế độ xử lý gỡ lỗi chế độ người dùng và điều này sẽ kích hoạt các lệnh breakpoint của chế độ lõi 2. Điểm ngắt hạt nhân không bao giờ bị nhấn và ứng dụng được tiếp tục lại qua điểm này. Tuy nhiên, sau đó khi tiếp tục hệ điều hành, điểm ngắt được lặp đi lặp lại bởi các quá trình khác ngăn cản tôi lấy lại trình gỡ lỗi chế độ người dùng để tôi có thể "chạy" nó đến vị trí đó chỉ trong vòng quá trình của riêng tôi.

CẬP NHẬT Kết hợp những lời khuyên được cung cấp bởi @conio, các bước sau đây làm việc cho tôi:

1> sau khi gắn debugger hạt nhân và khởi động hệ điều hành mục tiêu, đình chỉ hệ điều hành và áp dụng một số tùy chọn cấu hình:

!gflag +ksl   //allow sxe to report user-mode module load events under kernel debugger 
sxe ld myproc.exe //cause kernel debugger break upon process load 
.sympath+ <path> //path to HOST machine's user-mode app's symbols 

2> chạy debugger để tiếp tục hệ điều hành mục tiêu

3> trên mục tiêu, chạy EXE, chúng tôi muốn gỡ lỗi

4> trình gỡ lỗi hạt nhân sẽ bị hỏng; bây giờ nhập các lệnh sau để chuyển sang bối cảnh usermode:

!process 0 0 myproc.exe     //get address of EProcess structure (first number on 1st line after "PROCESS") 
.process /i /r /p <eprocess*>   //set kernel debugger to process context 
g          //continue execution to allow the context switch; debugger will break after switch complete 
.reload /user       //reload user symbols 
lmu          //ensure you have symbols although not really necessary in my particular case 

5> Bây giờ kể từ khi tôi đã biết những gì xảy ra ở phía usermode của ntdll.NtCreateSection(), tôi chỉ cần đi trước và thiết lập một breakpoint cho phía chế độ hạt nhân của hàm đó, nhưng xác định rằng tôi muốn breakpoint chỉ xảy ra trong ngữ cảnh của quá trình của tôi. Bằng cách này, các breakpoint không được kích hoạt hệ điều hành rộng:

bu /p <eprocess*> nt!NtCreateSection  //set breakpoint in kernel side of function 
g           //run to break 

6> nếu mọi việc suôn sẻ như kế hoạch, breakpoint sẽ thức dậy trình gỡ lỗi ở phía kernel mode của NtCreateSection(). Tôi đánh giá cao tất cả các câu trả lời và lời khuyên!

Trả lời

6

Có hai cách để kết hợp gỡ lỗi chế độ người dùng với gỡ lỗi chế độ lõi và bạn đang bối rối và trộn chúng lên.

Cách bạn cố gắng sử dụng trình gỡ lỗi chế độ hạt nhân để gỡ lỗi mã chế độ hạt nhân, sử dụng trình gỡ rối chế độ người dùng (ntsd) để gỡ lỗi mã chế độ người dùng và kiểm soát trình gỡ rối chế độ người dùng đang chạy trên đích máy từ trình gỡ lỗi hạt nhân. Đó là những gì cờ -d đến ntsd. Phương pháp này được mô tả trong trang Controlling the User-Mode Debugger from the Kernel Debugger và các trang phụ của nó trên MSDN.

Điều này thực hiện (nhiều hơn hoặc ít hơn) là chuyển hướng ntsd đầu vào và đầu ra cho trình gỡ lỗi hạt nhân. Ngăn mô-đun - như phần còn lại của các cửa sổ trong WinDbg - thuộc về trình gỡ lỗi hạt nhân. Tương tác duy nhất của bạn với trình gỡ rối chế độ người dùng là thông qua đường hầm mà trình gỡ rối hạt nhân tạo ra và bạn có thể truy cập nó chỉ thông qua cửa sổ lệnh. Đây là tài liệu trong tài liệu cho -d cờ:

-d

              Passes kiểm soát của debugger này để trình gỡ lỗi hạt nhân. Nếu bạn đang gỡ lỗi CSRSS, chuyển hướng điều khiển này luôn hoạt động, ngay cả khi -d không được chỉ định. (Tùy chọn này không thể được sử dụng trong khi gỡ lỗi từ xa - sử dụng -ddefer thay thế.) Xem Kiểm soát Trình gỡ lỗi Chế độ Người dùng từ Trình gỡ lỗi Hạt nhân để biết chi tiết.Không thể sử dụng tùy chọn này cùng với tùy chọn -ddefer hoặc tùy chọn -noio.

              Note Nếu bạn sử dụng WinDbg như trình gỡ lỗi hạt nhân, nhiều tính năng quen thuộc của WinDbg không có sẵn trong kịch bản này. Ví dụ, bạn không thể sử dụng cửa sổ người dân địa phương, cửa sổ tháo gỡ, hoặc cửa sổ ngăn xếp cuộc gọi, và bạn không thể bước qua mã nguồn. Điều này là do WinDbg chỉ hoạt động như một trình xem cho trình gỡ lỗi (NTSD hoặc CDB) đang chạy trên máy tính đích.

Cách thứ hai, là cách được sử dụng trong liên kết bạn đặt, là sử dụng trình gỡ lỗi hạt nhân để gỡ lỗi cả mã chế độ lõi và mã chế độ người dùng. Không có trình gỡ lỗi chế độ người dùng. Không ntsd. Bạn nói bạn đã làm theo hướng dẫn, nhưng trên thực tế bạn đã không. Nếu bạn đã có, sẽ không có bất kỳ ntsd.

Tôi đề nghị bạn sử dụng phương pháp này để bắt đầu, và sau khi bạn sử dụng trình gỡ lỗi chế độ người dùng chỉ khi bạn tìm ra bạn cần (vì bạn muốn sử dụng tiện ích mở rộng chế độ người dùng).

Để trình gỡ lỗi hạt nhân hoạt động tốt với mô-đun chế độ người dùng, bạn phải bật Enable loading of kernel debugger symbols GlobalFlag. Sử dụng !gflag +ksl để làm điều đó.

Khi bạn làm điều đó, hãy ngắt quá trình tải bằng cách sử dụng sxe ld:runlist, đặt điểm ngắt (có thể với tùy chọn /p) và gỡ lỗi bất kỳ thứ gì bạn muốn.

Chỉ cần làm điều đó thay vì tất cả các sự cố ntsd.

+0

Cảm ơn bạn đã làm rõ! Esp. mẹo "sxe ld: " để ngắt tải mô-đun cho phép tôi bỏ qua trình gỡ lỗi chế độ người dùng trên đích cũng như cài đặt đăng ký "ntsd -d" đó. Bây giờ chỉ có một điều tôi chưa thể hiểu được. Bây giờ tôi có thể đi qua mã chế độ người dùng trong trình gỡ rối hạt nhân nhưng tôi muốn hoặc là qua bước SYSENTER hoặc đặt một điểm ngắt ở phía bên kia trong chế độ lõi ở trình xử lý ngắt hoặc hàm mà các trình xử lý ngắt để làm việc kỳ diệu của NtCreateSection. Tôi dường như không thể tìm ra các ví dụ cụ thể cho kỹ thuật này. – byteptr

+1

Bạn không thể thực sự "bước vào" một 'sysenter'. Điều dễ nhất để làm là đặt hoặc bật điểm ngắt trên hàm 'nt' tương ứng. Thông thường họ có cùng tên. Khi bạn vào 'ntdll! NtCreateSection', làm' bu nt! NtCreateSection' và đi. Bạn có thể thử và sử dụng các tùy chọn '/ p' hoặc'/t' bằng 'bu', nhưng được cảnh báo rằng chúng không hoạt động tốt. – conio

+0

@conio ntsd -d không phải là một mớ hỗn độn tôi đã chỉnh sửa bài đăng của tôi để hiển thị cách thực hiện nó – blabb

1

Sử dụng ntsd -d và bắt đầu gỡ lỗi tệp thực thi từ đích bằng kết nối kd, bạn có thể sử dụng kd làm trình gỡ lỗi usermode cũng như trình gỡ lỗi hạt nhân đọc tài liệu nhiều lần. bạn nên đọc nó.breakin vv

How to break on the entry point of a program when debug in kernel mode with windbg?

chỉnh sửa để thêm một bản demo cho việc sử dụng ntsd -d

thiết lập

1) a vm running winxp sp3 and windbg version 6.12 installed in it  
2) _NT_SYMBOL_PATH in vm is set to z:\ 
3) z:\ is a mapped network drive that points to e:\symbols in host 
4) host running win 7 sp2  
5) host windbg 10.0010586  

khởi động ứng dụng trong vm dưới ntsd và chuyển hướng nó vào kd

mở một dấu nhắc lệnh trong vm chuyển đến windbg thư mục cài đặt và ban hành ntsd -s -d calc-s is to disable lazy symbol loading

0:000> version 
version 
Windows XP Version 2600 (Service Pack 3) UP Free x86 compatible 
Product: WinNt, suite: SingleUserTS 
kernel32.dll version: 5.1.2600.5512 (xpsp.080413-2111) 
Machine Name: 
Debug session time: Thu Mar 16 16:44:29.222 2017 
System Uptime: 0 days 0:10:12.941 
Process Uptime: 0 days 0:01:40.980 
    Kernel time: 0 days 0:00:01.632 
    User time: 0 days 0:00:00.040 
Live user mode: <Local> 

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86 
Copyright (c) Microsoft Corporation. All rights reserved. 

command line: 'ntsd -s -d calc' Debugger Process 0xA8 
dbgeng: image 6.12.0002.633, built Tue Feb 02 01:38:31 2010 
[path C:\Documents and Settings\admin\Desktop\Debugging Tools for Windows (x86)\dbgeng.dll] 

phá vỡ windbg trên SystemBreakPoint và nhanh chóng gỡ lỗi là Input: \>
lm cho thấy biểu tượng đã được nạp từ z : \

CommandLine: calc 
Symbol search path is: z:\ 
Executable search path is: 
ModLoad: 01000000 0101f000 calc.exe 
xxxxx 
ntdll!DbgBreakPoint: 
7c90120e cc    int  3 
0:000> lm 
lm 
start end  module name 
01000000 0101f000 calc  (pdb symbols)   z:\calc.pdb\3B7D84101\calc.pdb 
77c10000 77c68000 msvcrt  (export symbols)  C:\WINDOWS\system32\msvcrt.dll 

thi đến AddressOfEntryPoint

0:000> g @$exentry 
g @$exentry 

calc!WinMainCRTStartup: 
01012475 6a70   push 70h 

Thiết lập một breakpoint trong chế độ người dùng và đối tác của mình trong chế độ kernel cùng một lúc

0:000> bp ntdll!ZwCreateSection <--- user mode bp notice prompt 0:000 
bp ntdll!ZwCreateSection 


0:000> .breakin <<---- transferring to kd mode 
.breakin 
Break instruction exception - code 80000003 (first chance) 
nt!RtlpBreakWithStatusInstruction: 
804e3592 cc    int  3 


kd> !process 0 0 calc.exe <<----- looking for our process of interest 
Failed to get VAD root 
PROCESS ffae2020 SessionId: 0 Cid: 0410 Peb: 7ffde000 ParentCid: 00a8 
    DirBase: 04d87000 ObjectTable: e1bd5238 HandleCount: 26. 
    Image: calc.exe 

kd> bp /p ffae2020 nt!NtCreateSection << setting a kernel mode bp  
on counterpart that matches with our process of interest notice prompt kd> 


kd> g <<<---- return to user mode after setting a breakpoint 
0:000> g <<<<<--------- executing in user mode 
g 

quá trình tại calc đang chạy trong usermode trong vm nhấp chuột giúp đỡ về (điều này sẽ kích hoạt một Loadlib và cần một phần để chúng tôi sẽ phá vỡ chế độ người dùng của chúng tôi bp trong trình gỡ lỗi hạt nhân)

Breakpoint 0 hit 
eax=00000000 ebx=00000000 ecx=00000001 edx=ffffffff esi=0007f368 edi=00000000 
eip=7c90d160 esp=0007f22c ebp=0007f2a8 iopl=0   nv up ei pl zr na pe nc 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000246 
ntdll!NtCreateSection: 
7c90d160 b832000000  mov  eax,32h 

bây giờ chúng ta vui vẻ có thể theo dõi xung quanh sử dụng t theo dõi không p hoặc g hoặc bất kỳ thực hiện khác lệnh

0:000> t 
t 
eax=00000032 ebx=00000000 ecx=00000001 edx=ffffffff esi=0007f368 edi=00000000 
eip=7c90d165 esp=0007f22c ebp=0007f2a8 iopl=0   nv up ei pl zr na pe nc 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000246 
ntdll!ZwCreateSection+0x5: 
7c90d165 ba0003fe7f  mov  edx,offset SharedUserData!SystemCallStub (7ffe0300) 
0:000> 

eax=00000032 ebx=00000000 ecx=00000001 edx=7ffe0300 esi=0007f368 edi=00000000 
eip=7c90d16a esp=0007f22c ebp=0007f2a8 iopl=0   nv up ei pl zr na pe nc 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000246 
ntdll!ZwCreateSection+0xa: 
7c90d16a ff12 call dword ptr [edx] ds:0023:7ffe0300={ntdll!KiFastSystemCall (7c90e4f0)} 
0:000> 

eax=00000032 ebx=00000000 ecx=00000001 edx=7ffe0300 esi=0007f368 edi=00000000 
eip=7c90e4f0 esp=0007f228 ebp=0007f2a8 iopl=0   nv up ei pl zr na pe nc 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000246 
ntdll!KiFastSystemCall: 
7c90e4f0 8bd4   mov  edx,esp 
0:000> 

eax=00000032 ebx=00000000 ecx=00000001 edx=0007f228 esi=0007f368 edi=00000000 
eip=7c90e4f2 esp=0007f228 ebp=0007f2a8 iopl=0   nv up ei pl zr na pe nc 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000246 
ntdll!KiFastSystemCall+0x2: 
7c90e4f2 0f34   sysenter 
0:000> 

Breakpoint 1 hit 
nt!NtCreateSection: 
805652b3 6a2c   push 2Ch 

khi trong bp tại .reload hạt nhân và xem stack trace

ngăn xếp thứ 2 dấu vết là giống như đầu tiên nhưng với các biểu tượng sửa chữa cho Shell32.dll (vm không có truy cập internet vì vậy nó không thành công lần đầu tiên vì vậy tôi kéo giảm dll cụ thể từ vm và lấy sumbols của nó từ máy chủ bằng cách sử dụng windbg -z shell32.dll và .tải lại (kể từ khi downstore trong máy chủ được mạng mappped trong vm các dấu vết thứ hai đúng tải pdb và đưa ra một vết đống đúng mà không cần cảnh báo

kd> kb 
# ChildEBP RetAddr Args to Child    
00 f8bb1d40 804de7ec 0007f368 0000000f 00000000 nt!NtCreateSection 
01 f8bb1d40 7c90e4f4 0007f368 0000000f 00000000 nt!KiFastCallEntry+0xf8 
02 0007f224 7c90d16c 7c91c993 0007f368 0000000f ntdll!KiFastSystemCallRet 
03 0007f228 7c91c993 0007f368 0000000f 00000000 ntdll!NtCreateSection+0xc 
04 0007f2a8 7c91c64a 0007f340 00000790 0007f300 ntdll!LdrpCreateDllSection+0x92 
05 0007f388 7c91624a 000add00 0007f414 0007f93c ntdll!LdrpMapDll+0x28f 
06 0007f648 7c9164b3 00000000 000add00 0007f93c ntdll!LdrpLoadDll+0x1e9 
07 0007f8f0 7c801bbd 000add00 0007f93c 0007f91c ntdll!LdrLoadDll+0x230 
08 0007f958 7c801d72 7ffddc00 00000000 00000000 kernel32!LoadLibraryExW+0x18e 
09 0007f96c 7ca625a3 7ca625ac 00000000 00000000 kernel32!LoadLibraryExA+0x1f 
WARNING: Stack unwind information not available. Following frames may be wrong. 
0a 0007f990 010057b8 000700ac 000a7c84 00000000 SHELL32!SHCreateQueryCancelAutoPlayMoniker+0x2062d 
0b 0007fbc4 010041ac 0000012e 00000111 01006118 calc!MenuFunctions+0x15d 
0c 0007fcb4 01004329 0000012e 00000111 01006118 calc!RealProcessCommands+0x1b61 
0d 0007fcdc 01006521 0000012e 0007fd6c 01006118 calc!ProcessCommands+0x2d 
0e 0007fd04 7e418734 000700ac 00000111 0000012e calc!CalcWndProc+0x409 
0f 0007fd30 7e418816 01006118 000700ac 00000111 USER32!InternalCallWinProc+0x28 
10 0007fd98 7e4189cd 00000000 01006118 000700ac USER32!UserCallWinProcCheckWow+0x150 
11 0007fdf8 7e418a10 0007fee8 00000000 0007ff1c USER32!DispatchMessageWorker+0x306 
12 0007fe08 010021a7 0007fee8 7c80b731 000a1ee4 USER32!DispatchMessageW+0xf 
13 0007ff1c 010125e9 000a7738 00000055 000a7738 calc!WinMain+0x256 
14 0007ffc0 7c817067 00000000 00000000 7ffde000 calc!WinMainCRTStartup+0x174 
15 0007fff0 00000000 01012475 00000000 78746341 kernel32!BaseProcessStart+0x23 

stacktrace mà không cần cảnh báo

Breakpoint 0 hit 
nt!NtCreateSection: 
805652b3 6a2c   push 2Ch 
kd> kb 
# ChildEBP RetAddr Args to Child    
00 f8aa0d40 804de7ec 0007f368 0000000f 00000000 nt!NtCreateSection 
01 f8aa0d40 7c90e4f4 0007f368 0000000f 00000000 nt!KiFastCallEntry+0xf8 
02 0007f224 7c90d16c 7c91c993 0007f368 0000000f ntdll!KiFastSystemCallRet 
03 0007f228 7c91c993 0007f368 0000000f 00000000 ntdll!NtCreateSection+0xc 
04 0007f2a8 7c91c64a 0007f340 00000790 0007f300 ntdll!LdrpCreateDllSection+0x92 
05 0007f388 7c91624a 000add00 0007f414 0007f93c ntdll!LdrpMapDll+0x28f 
06 0007f648 7c9164b3 00000000 000add00 0007f93c ntdll!LdrpLoadDll+0x1e9 
07 0007f8f0 7c801bbd 000add00 0007f93c 0007f91c ntdll!LdrLoadDll+0x230 
08 0007f958 7c801d72 7ffdfc00 00000000 00000000 kernel32!LoadLibraryExW+0x18e 
09 0007f96c 7ca625a3 7ca625ac 00000000 00000000 kernel32!LoadLibraryExA+0x1f 
0a 0007f97c 7ca62e8e 003800dd 000a7c84 00000000 SHELL32!GetXPSP1ResModuleHandle+0x16 
0b 0007f990 010057b8 000900ac 000a7c84 00000000 SHELL32!ShellAboutW+0x1f 
0c 0007fbc4 010041ac 0000012e 00000111 01006118 calc!MenuFunctions+0x15d 
0d 0007fcb4 01004329 0000012e 00000111 01006118 calc!RealProcessCommands+0x1b61 
0e 0007fcdc 01006521 0000012e 0007fd6c 01006118 calc!ProcessCommands+0x2d 
0f 0007fd04 7e418734 000900ac 00000111 0000012e calc!CalcWndProc+0x409 
10 0007fd30 7e418816 01006118 000900ac 00000111 USER32!InternalCallWinProc+0x28 
11 0007fd98 7e4189cd 00000000 01006118 000900ac USER32!UserCallWinProcCheckWow+0x150 
12 0007fdf8 7e418a10 0007fee8 00000000 0007ff1c USER32!DispatchMessageWorker+0x306 
13 0007fe08 010021a7 0007fee8 7c80b731 000a1ee4 USER32!DispatchMessageW+0xf 
14 0007ff1c 010125e9 000a7738 00000055 000a7738 calc!WinMain+0x256 
15 0007ffc0 7c817067 00000000 00000000 7ffda000 calc!WinMainCRTStartup+0x174 
16 0007fff0 00000000 01012475 00000000 78746341 kernel32!BaseProcessStart+0x23 

đổ những lập luận để NtCreateSection

kd> dds @esp l8 
f8bb1d44 804de7ec nt!KiFastCallEntry+0xf8 
f8bb1d48 0007f368 
f8bb1d4c 0000000f 
f8bb1d50 00000000 
f8bb1d54 00000000 
f8bb1d58 00000010 
f8bb1d5c 01000000 calc!_imp__RegOpenKeyExA <PERF> (calc+0x0) 
f8bb1d60 00000790 

chúng ta đã biết lập luận thứ bảy là HANDLE according to prototype of DDI

NTSTATUS ZwCreateSection(
     _Out_ PHANDLE   SectionHandle, 
     _In_  ACCESS_MASK  DesiredAccess, 
     _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 
     _In_opt_ PLARGE_INTEGER  MaximumSize, 
     _In_  ULONG    SectionPageProtection, 
     _In_  ULONG    AllocationAttributes, 
     _In_opt_ HANDLE    FileHandle 
    ); 

kd> !handle 790 

Failed to get VAD root 
PROCESS ffae2020 SessionId: 0 Cid: 0410 Peb: 7ffde000 ParentCid: 00a8 
    DirBase: 04d87000 ObjectTable: e1bd5238 HandleCount: 29. 
    Image: calc.exe 

Handle table at e1bd5238 with 29 entries in use 

0790: Object: 8124b028 GrantedAccess: 00100020 Entry: e1032f20 
Object: 8124b028 Type: (8127b900) File 
    ObjectHeader: 8124b010 (old version) 
     HandleCount: 1 PointerCount: 1 
     Directory Object: 00000000 Name: \WINDOWS\system32\xpsp1res.dll {HarddiskVolume1} 

trở lại chế độ người dùng từ chế độ hạt nhân và kiểm tra việc Mục mới Xử lý

kd> g 
eax=00000000 ebx=00000000 ecx=00000001 edx=ffffffff esi=0007f368 edi=00000000 
eip=7c90d16c esp=0007f22c ebp=0007f2a8 iopl=0   nv up ei pl zr na pe nc 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000246 
ntdll!ZwCreateSection+0xc: 
7c90d16c c21c00   ret  1Ch 

kiểm tra giá trị trở lại của HANDLE trong chế độ người dùng

0:000> dd 7f368 l1 
dd 7f368 l1 
0007f368 0000078c 
0:000> !handle 78c 
!handle 78c 
Handle 78c 
    Type   Section 
0:000> !handle 78c f 
!handle 78c f 
Handle 78c 
    Type   Section 
    Attributes 0 
    GrantedAccess 0xf: 
     None 
     Query,MapWrite,MapRead,MapExecute 
    HandleCount 2 
    PointerCount 3 
    Name   <none> 
    Object Specific Information 
    Section base address 0 
    Section attributes 0x1800000 
    Section max size 0x2f000 
0:000> 

Nếu không được satisifed chúng tôi có thể trở lại kd thiết lập bối cảnh quá trình và kiểm tra xử lý trả lại trong kernel mode

kd> !handle 78c f 

Failed to get VAD root 
PROCESS ffae2020 SessionId: 0 Cid: 0410 Peb: 7ffde000 ParentCid: 00a8 
    DirBase: 04d87000 ObjectTable: e1bd5238 HandleCount: 30. 
    Image: calc.exe 

Handle table at e1bd5238 with 30 entries in use 

078c: Object: e1088f30 GrantedAccess: 0000000f Entry: e1032f18 
Object: e1088f30 Type: (8128b900) Section 
    ObjectHeader: e1088f18 (old version) 
     HandleCount: 1 PointerCount: 1 

bây giờ nếu bạn tiếp tục thực hiện bạn sẽ nhìn thấy dbgprint thư viện tải trong windbg và khoảng thoại trong vm :)

kd> g 
0:000> g 
g 
ModLoad: 10000000 1002f000 C:\WINDOWS\system32\xpsp1res.dll 
Các vấn đề liên quan