2017-03-14 13 views
7

असल में, मेरे पास एक उपयोगकर्ता मोड प्रोग्राम है जो kernel32.CreateProcessA() को कॉल करता है जो आंतरिक रूप से kernel32.CreateProcessInternalW() को कॉल करता है। इस फ़ंक्शन के भीतर, मुझे दिलचस्पी है कि ntdll.NtCreateSection() में क्या हो रहा है जो वर्चुअल मेमोरी में निष्पादन योग्य को मैप करने का प्रयास करता है। एक बार इस फ़ंक्शन में, प्रोग्राम जल्दी से कर्नेल कॉल को EAX = 0x32 के रूप में सेट करता है और SYSENTER निर्देश निष्पादित करता है।हाइब्रिड उपयोगकर्ता-मोड/कर्नेल-मोड डीबगिंग कैसे करें?

स्पष्ट रूप से मैं उपयोगकर्ता मोड डीबगर में कॉल गेट से परे नहीं देख सकता। मेरे पास कर्नेल-मोड ड्राइवरों को डीबग करने का थोड़ा सा अनुभव है, इसलिए मैंने एक वीएमवेयर विंडो में एक्सपी एसपी 3 की एक प्रति लोड की है और पाइप को WinDbg (जिसे मैं आईडीए के अंदर चल रहा हूं) को समझने के लिए वर्चुअलकेडी का उपयोग करता हूं। कर्नेल डीबगर को जोड़ने के बाद, मैंने वर्चुअल मशीन पर अपने यूजर-मोड EXE प्रोग्राम और पीडीबी की प्रतिलिपि बनाई, लेकिन मैं अपने उपयोगकर्ता-मोड प्रोग्राम में प्रारंभिक ब्रेकपॉइंट को सही तरीके से सेट करने के तरीके पर एक नुकसान का प्रकार हूं। मैं समकक्ष ntdll.ZwCreateSection() पर सभी कॉल को अवरुद्ध नहीं करना चाहता हूं, जिसे मैं कॉल गेट के दूसरी तरफ मानता हूं। आदर्श रूप में, मैं उपयोगकर्ता-मोड कोड में तोड़ना चाहता हूं और उस कॉल गेट के माध्यम से कदम उठाना चाहता हूं कि अब मैं कर्नेल डीबगर का उपयोग कर रहा हूं, लेकिन मुझे नहीं पता कि पहले चरण क्या हैं।

मैं कुछ Googling किया है और मैं करीब एक सेट करके आए हैं

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

कर्नल डीबगर में एक को तोड़ने का कारण बनता है जब मैं अपने प्रक्रिया शुरू में मूल्य "ntsd -d" है, लेकिन मैं यह कर सकते हैं .breakin कमांड के बाद किसी भी ब्रेकपॉइंट्स को सेट करने लगते हैं, मुझे WinDbg प्रॉम्प्ट पर जाने के लिए IDA को जारी करने की आवश्यकता है। मैं इस guide का पालन कर रहा हूं जहां मैं अपनी प्रक्रिया को ढूंढता हूं! प्रक्रिया फिर संदर्भ पर स्विच करें, और प्रतीकों को दोबारा लोड करें, लेकिन मुझे अपनी प्रक्रिया में ब्रेकपॉइंट सेट करने में समस्याएं आ रही हैं या "ntsd -d" द्वारा प्रारंभिक ब्रेकपॉइंट सेट को आगे बढ़ाने में समस्याएं आ रही हैं। । संदेश प्राप्त करने के बाद कि ब्रेकपॉइंट को हल नहीं किया जा सका और स्थगित ब्रेकपॉइंट जोड़ा गया है, तो अगर ब्रेकपॉइंट्स को साफ़ किए बिना मैं प्रक्रिया में "इन" करने के लिए प्रतीत नहीं कर पा रहा हूं, तो इससे कोई अर्थ हो। यहाँ है जहाँ मैं जब मुझे लगता है कि प्रारंभिक ब्रेक मारा पर होने लगते हैं के ढेर है:

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 

ईमानदारी से कहूं तो मुझे यकीन है कि मेरी PDB लोड किया जा रहा है नहीं कर रहा हूँ, लेकिन मैं अपने शायद नहीं मेरी तात्कालिक समस्या संदेह है; मेरे मॉड्यूल फलक केवल कर्नेल ड्राइवर मॉड्यूल दिखा रहा है, न कि उपयोगकर्ता मोड मॉड्यूल। जब मैं अतीत में ड्राइवर डीबगिंग कर रहा था, तो मैं इस फलक में अपनी चालक छवि देख सकता था और प्रतीकों को लोड किया गया था या नहीं, इसलिए मुझे यकीन नहीं है कि उपयोगकर्ता-मोड छवि के लिए क्या उम्मीद करनी है। छवि के बिना, मैं वास्तव में किसी भी ब्रेकपॉइंट को हल करने के लिए डीबगर की अपेक्षा नहीं कर सकता।

मुझे एहसास है कि मैं इस बारे में पूरी तरह से गलत हो रहा हूं लेकिन मुझे कोई भाग्य नहीं है कि उपयोगकर्ता-मोड/कर्नेल-मोड हाइब्रिड डीबगिंग कैसे करें। क्या वहां कोई है जो मुझे सही दिशा में इंगित कर सकता है ताकि मैं इस कर्नेल मोड फ़ंक्शन में एक विशिष्ट उपयोगकर्ता-मोड प्रक्रिया से कदम उठा सकूं? या, कम से कम एक उचित कर्नेल-मोड ब्रेकपॉइंट सेट करें ताकि यह केवल मेरी विशेष उपयोगकर्ता-मोड प्रक्रिया के परिणामस्वरूप ट्रिगर हो?

अद्यतन: मैं भरी हुई मेरी मॉड्यूल डिबग ओएस पर एक उपयोगकर्ता के मोड डीबगर में (मैं OllyDbg उपयोग करने के लिए हुआ) (runlist.exe नामित किया जाना होता है)। एक बार जब मैं उपयोगकर्ता-मोड ब्रेकपॉइंट पर रोक दिया गया तो सिसेन्ट से केवल कुछ ही निर्देश दिए गए, मैंने कर्नेल डीबगर का उपयोग करके ओएस को निलंबित कर दिया। मैं फिर प्रक्रिया संदर्भ सेट। WinDbg कमांड विंडो सामग्री इस प्रकार थे:

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 

हालांकि मैं अपनी प्रक्रिया ' ".reload" के साथ लोड करने के लिए प्रतीकों नहीं मिल सका (PDB एक ही निर्देशिका में है - मेरी प्रतीकों निर्देशिका करने के लिए इसे कॉपी करना पड़े), जिस ब्रेकपॉइंट की मैं परवाह करता हूं वह वैसे भी है, इसलिए मैंने इसे 0x7C90D16A पते पर सेट किया है जो डीबगर को ntdll.ZwCreateSection() के भीतर माना जाता है। विचित्र रूप से मेरे लिए, उपयोगकर्ता-मोड कोड में यह पता ntdll को हल करता है।NtCreateSection(), लेकिन किसी भी तरह से ब्रेकपॉइंट केवल 2 निर्देश थे जहां से मेरा उपयोगकर्ता-मोड ब्रेक था। जब मैंने मशीन को फिर से शुरू किया, तो मेरा इरादा उपयोगकर्ता-मोड डीबग-प्रक्रिया को "चलाने" देना था और इससे कर्नेल-मोड ब्रेकपॉइंट 2 निर्देशों को दूर कर दिया जाएगा। कर्नेल ब्रेकपॉइंट कभी हिट नहीं हुआ था और ऐप इस बिंदु से पहले फिर से शुरू हुआ था। हालांकि मैं ntdll पर एक ब्रेकपॉइंट सेट कर सकता हूं! ZwCreateSection() लेकिन फिर ओएस को फिर से शुरू करते समय, ब्रेकपॉइंट बार-बार अन्य प्रक्रियाओं द्वारा मारा जाता है जो मुझे उपयोगकर्ता-मोड डीबगर पर वापस जाने से रोकता है, इसलिए मैं इसे केवल उस स्थान पर "चला सकता हूं" मेरी अपनी प्रक्रिया

अद्यतन @conio द्वारा प्रदान की युक्तियों के विलय के लिए निम्न चरणों मेरे लिए काम किया:

1> कर्नेल डिबगर संलग्न और लक्ष्य ओएस बूट के बाद, ओएस को निरस्त करने और लागू कुछ कॉन्फ़िगरेशन को:

!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> चलाने डिबगर लक्ष्य ओएस

3> लक्ष्य को फिर से शुरू करने के लिए, EXE हम

डिबग करने के लिए चाहते हैं चलाने

4> कर्नेल डीबगर को तोड़ना चाहिए; के बाद से मैं पहले से ही पता है कि ntdll.NtCreateSection() की 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> अब और के लिए एक ब्रेकपाइंट सेट: अब usermode संदर्भ में स्विच करने के निम्न कमांड दर्ज उस फ़ंक्शन के कर्नेल मोड पक्ष, लेकिन यह निर्दिष्ट करते हुए कि मैं ब्रेकपॉइंट केवल अपनी प्रक्रिया के संदर्भ में ही होना चाहता हूं। इस तरह, ब्रेकपाइंट ओएस विस्तृत ट्रिगर नहीं है:

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

6> अगर सब चला जाता है योजना के अनुसार, ब्रेकपाइंट NtCreateSection की कर्नेल मोड तरफ डिबगर जाग जाएगा()। मैं सभी प्रतिक्रियाओं और सुझावों की सराहना करता हूं!

उत्तर

6

कर्नेल-मोड डीबगिंग के साथ उपयोगकर्ता-मोड डिबगिंग को गठबंधन करने के दो तरीके हैं और आप भ्रमित और उन्हें मिश्रण कर रहे हैं।

जिस तरह से आपने कोशिश की है वह कर्नेल-मोड कोड डीबग करने के लिए कर्नेल-मोड डीबगर का उपयोग करना है, उपयोगकर्ता-मोड कोड डीबग करने के लिए उपयोगकर्ता-मोड डीबगर (ntsd) का उपयोग करें, और लक्ष्य पर चल रहे उपयोगकर्ता-मोड डीबगर को नियंत्रित करें कर्नेल डीबगर से मशीन। -d ध्वज ntsd पर है। इस विधि को Controlling the User-Mode Debugger from the Kernel Debugger पृष्ठ और एमएसडीएन पर इसके उपपृष्ठों में वर्णित किया गया है।

यह क्या करता है (अधिक या कम) ntsd कर्नेल डीबगर में इनपुट और आउटपुट को रीडायरेक्ट करना है। मॉड्यूल फलक - WinDbg में शेष विंडो के रूप में - कर्नेल डीबगर से संबंधित है। उपयोगकर्ता-मोड डीबगर के साथ आपकी एकमात्र बातचीत कर्नेल डीबगर बनाता है सुरंग के माध्यम से है, और आप इसे केवल कमांड विंडो के माध्यम से एक्सेस कर सकते हैं। यह -d ध्वज के लिए दस्तावेज में दर्ज है:

-d

              कर्नेल डिबगर को यह डिबगर के नियंत्रण पास करता है। यदि आप CSRSS को डीबग कर रहे हैं, तो यह नियंत्रण पुनर्निर्देशन हमेशा सक्रिय है, भले ही -d निर्दिष्ट नहीं है। (इस विकल्प का उपयोग रिमोट डीबगिंग के दौरान नहीं किया जा सकता है - का उपयोग करें- इसके बजाय हटाएं।) विवरण के लिए कर्नेल डीबगर से उपयोगकर्ता-मोड डीबगर को नियंत्रित करना देखें।इस विकल्प का उपयोग -ddefer विकल्प या -noio विकल्प के साथ संयोजन में नहीं किया जा सकता है।

              नोट आप कर्नेल डीबगर के रूप में WinDbg का उपयोग करते हैं, WinDbg की सुपरिचित सुविधाओं के साथ कई इस मामले में उपलब्ध नहीं हैं। उदाहरण के लिए, आप स्थानीय विंडो, डिस्सेप्लर विंडो, या कॉल स्टैक विंडो का उपयोग नहीं कर सकते हैं, और आप स्रोत कोड के माध्यम से कदम नहीं उठा सकते हैं। ऐसा इसलिए है क्योंकि WinDbg केवल लक्षित कंप्यूटर पर चल रहे डीबगर (एनटीएसडी या सीडीबी) के दर्शक के रूप में कार्य कर रहा है।

दूसरा तरीका, जो आपके द्वारा डाले गए लिंक में उपयोग किया जाता है, कर्नेल डीबगर का उपयोग कर्नेल-मोड कोड और उपयोगकर्ता-मोड कोड दोनों को डीबग करने के लिए करना है। कोई उपयोगकर्ता-मोड डीबगर नहीं। नहीं ntsd। आपने कहा कि आपने गाइड का पालन किया है, लेकिन वास्तव में आपने नहीं किया। यदि आपके पास था, तो कोई ntsd नहीं होगा।

मेरा सुझाव है कि आप इस विधि का उपयोग शुरू करने के लिए करें, और जब आप पाते हैं कि आपको केवल उपयोगकर्ता-मोड डीबगर का उपयोग करने की आवश्यकता है (क्योंकि आप उपयोगकर्ता-मोड एक्सटेंशन का उपयोग करना चाहते हैं, उदाहरण के लिए)।

कर्नेल डीबगर उपयोगकर्ता-मोड मॉड्यूल के साथ अच्छी तरह से काम करने के लिए आपको Enable loading of kernel debugger symbols ग्लोबलफ्लैग सक्षम करना होगा। ऐसा करने के लिए !gflag +ksl का उपयोग करें।

एक बार ऐसा करने के बाद, sxe ld:runlist का उपयोग करके अपनी प्रक्रिया को लोड करने पर ब्रेक करें, ब्रेकपॉइंट सेट करें (संभवतः /p विकल्प के साथ) और जो कुछ भी आप चाहते हैं उसे डीबग करें।

बस ntsd गड़बड़ की बजाय बस ऐसा करें।

+0

स्पष्टीकरण के लिए धन्यवाद! Esp। "एसएक्सई एलडी: " मॉड्यूल लोड पर टिप करने के लिए टिप मुझे लक्ष्य पर उपयोगकर्ता-मोड डीबगर को बाईपास करने के साथ-साथ "ntsd -d" रजिस्ट्री सेटिंग को बाईपास करने की इजाजत देता है। अब केवल एक चीज है जिसे मैं अभी तक नहीं समझ सकता। अब मैं कर्नेल डीबगर में उपयोगकर्ता-मोड कोड के माध्यम से कदम उठा सकता हूं लेकिन मैं या तो SYSENTER के माध्यम से कदम उठाना चाहता हूं या दूसरी तरफ कर्नेल मोड में ब्रेकपॉइंट सेट करना चाहता हूं या तो इंटरप्ट हैंडलर या इंटरप्ट हैंडलर कॉल NtCreateSection के जादू का काम करने के लिए। मुझे इस तकनीक के लिए ठोस उदाहरण नहीं मिल रहे हैं। – byteptr

+1

आप वास्तव में "sysenter' में" कदम नहीं उठा सकते हैं। करने के लिए सबसे आसान बात संबंधित 'एनटी' फ़ंक्शन पर ब्रेकपॉइंट सेट या सक्षम करना होगा। आमतौर पर उनके पास एक ही नाम होता है। जब आप 'ntdll! NtCreateSection' में जाते हैं, तो' bu nt! NtCreateSection' करें और जाएं। आप 'bu' के साथ'/p' या '/ t' विकल्पों को आजमा सकते हैं और उपयोग कर सकते हैं, लेकिन चेतावनी दीजिये कि वे हमेशा अच्छी तरह से काम नहीं करते हैं। – conio

+0

@conio ntsd -d एक गड़बड़ नहीं है मैंने यह दिखाने के लिए अपनी पोस्ट संपादित की है कि यह कैसे करें – blabb

1

उपयोग ntsd -d और एक केडी कनेक्शन के साथ लक्ष्य से executabke डिबगिंग शुरू आप किसी usermode डिबगर के रूप में केडी उपयोग कर सकते हैं के रूप में गिरी डिबगर डॉक्स कई बार पढ़ा यह यह कई परीक्षणों से अधिक लेकिन फुर्स्ट समय कर आसान नहीं है आपको इसके बारे में पढ़ने का लटका मिलना चाहिए।तोड़ आदि

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

ntsd का उपयोग कर के लिए एक डेमो जोड़ने के लिए संपादित -d

सेटअप

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  

ntsd के तहत वी एम में एक आवेदन शुरू करने और केडी करने के लिए इसे पुनः निर्देशित

वी एम में एक कमांड प्रॉम्प्ट स्थापना निर्देशिका WinDbg पर नेविगेट खोला और 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] 

SystemBreakPoint पर windbg टूटता जारी किए गए और डीबग शीघ्र इनपुट है: \>
एल एम से पता चलता प्रतीक जेड से लोड किया गया था : \

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 

AddressOfEntryPoint तक निष्पादित

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

calc!WinMainCRTStartup: 
01012475 6a70   push 70h 

एक बार

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 

अब calc प्रक्रिया के बारे में वीएम क्लिक मदद में usermode में चल रहा है पर कर्नेल मोड में उपयोगकर्ता मोड में एक ब्रेकपाइंट और अपने समकक्ष करना (यह एक ट्रिगर किया जाएगा लोडलिब और उसे अनुभाग की आवश्यकता है ताकि हम कर्नेल डीबगर में हमारे उपयोगकर्ता मोड बीपी को तोड़ देंगे)

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 

अब हम ख़ुशी से चारों ओर ट्रेस कर सकते हैं टी पी या जी या किसी अन्य निष्पादन नहीं आदेशों

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 

जब गिरी .reload में बीपी में और देखो स्टैक ट्रेस

2 स्टैक ट्रेस का उपयोग करें ट्रेस पहले जैसा ही है लेकिन के लिए सही प्रतीकों के साथ Shell32.dll (vm में इंटरनेट का उपयोग नहीं है, इसलिए यह पहली बार में विफल रहता है, इसलिए मैंने उस विशिष्ट डीएल को वीएम से गिरा दिया और विंडबग -z shell32.dll का उपयोग करके मेजबान से अपने sumbols लाया और ।फिर से लोड (के बाद से मेजबान में downstore नेटवर्क वीएम में mappped है दूसरे का पता लगाने ठीक से pdb लोड करता है और

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 

चेतावनी

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 

डंप 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 

हम जानते हैं कि सातवें तर्कहै

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} 

कर्नेल मोड से उपयोगकर्ता मोड में चला वापसी और निरीक्षण नई धारा संभाल

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 

उपयोगकर्ता मोड में हैंडल की वापसी मान की जाँच

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> 

यदि बैठे नहीं हैं तो हम वापस लौट सकते हैं केडी की प्रक्रिया संदर्भ सेट और कर्नेल मोड में लौटे संभाल जाँच

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 

अब अगर आप निष्पादन जारी रखने के लिए आप windbg में लोड पुस्तकालय dbgprint और वीएम :)

kd> g 
0:000> g 
g 
ModLoad: 10000000 1002f000 C:\WINDOWS\system32\xpsp1res.dll 
में संवाद के बारे में देख सकते हैं
संबंधित मुद्दे