2012-05-07 10 views
5

मान लीजिए मैं समारोह समारोह हर की लाइन 3 छोड़ना चाहते कि ऐसा हर यह 40 लौटने की जानी चाहिएहर बार जब यह हिट करता है तो विंडबग में निष्पादन से लाइन को कैसे छोड़ें?

int func() { 
    int a = 10, b =20; 
    a = 25; 
    b = 30; 
    return a+b 
} 

कहा जाता है (यानी निष्पादित नहीं करता है 3 लाइन एक = 25) वहाँ windbg में किसी भी इसी तरह आदेश है जीएमबी में जेएमपी की तरह?

उत्तर

3

यदि आप असेंबली से परिचित हैं, तो आप असेंबली को बदलने के लिए कमांड का उपयोग कर सकते हैं (यानी सभी एनओपी में ऑपोड्स को चालू करें, "ए = 25;")। यह वही है जो मैं आम तौर पर करता हूं जब मैं एनओपी को बाहर करना चाहता हूं या अन्यथा निर्देश स्ट्रीम बदलना चाहता हूं।

कभी कभी लोग इस तथ्य पर भरोसा करते हैं कि एनओपी शिक्षा के लिए बाइट कोड 0x90 है और आदेश का उपयोग ई स्मृति संपादित करने के लिए होगा (जैसे, "ew @eip 0x9090")। यह कमांड का उपयोग करने के समान परिणाम है।

अंत में, आप इस आपरेशन कभी-कभी कम पड़ रहा है और सिर्फ मैन्युअल अनुदेश आप उपयोग कर सकते हैं छोड़, "सेट वर्तमान निर्देश" जीयूआई संचालन चाहते हैं:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff542851(v=vs.85).aspx

2

यहाँ एक ट्यूटोरियल है कि यह बताता है कि यह कैसे करें, आप ऑफसेट सेट कर सकते हैं ताकि यह लाइन को छोड़ सके: http://cfc.kizzx2.com/index.php/tutorial-using-windbg-to-bypass-specific-functions-windbg-kung-fu-series/ और इस मान पर रजिस्टर eip सेट करें।

इसके अलावा, आप ब्रेकपाइंट सेट कर सकते हैं और ब्रेकप्वाइंट में आदेश डाल भी ऐसा ही करने के लिए: http://japrogbits.blogspot.co.uk/2010/01/using-breakpoints-to-skip-function-in.html और एक अन्य ब्लॉग: http://www.shcherbyna.com/?p=1234 है और यह भी आप एक ही प्राप्त करने के लिए .call उपयोग कर सकते हैं: http://blogs.msdn.com/b/oldnewthing/archive/2007/04/27/2292037.aspx

5
फिर

एक बहुत देर हो चुकी है इस सवाल का जवाब लेकिन
लाइन 401,034 नीचे दिए गए उदाहरण में एक लाइन

निष्पादित हो रहा है छोड़ एक सशर्त ब्रेकप्वाइंट सेट करते हैं तो विधानसभा के साथ खिलवाड़ बेहतर नहीं है आप निष्पादित करने के लिए
इतना करना है कि लाइन पर एक सशर्त ब्रेकप्वाइंट सेट नहीं करना चाहते यह

bp 401034 "r eip = @$eip + size of current instruction";gc"
7 इस मामले gc = go में से conditionl तोड़ने

jmptest:\>dir /b 
jmptest.c 

jmptest:\>type jmptest.c 
#include <stdio.h> 
int func() 
{ 
    int a = 10 , b = 20; 
    a = 25; 
    b = 30; 
    return a+b; 
} 
int main (void) 
{ 
    int i , ret; 
    for (i= 0; i< 10; i++) 
    { 
     ret = func(); 
     printf("we want 40 we get %d\n",ret); 
    } 
    return 0; 
} 
jmptest:\>cl /nologo /Zi jmptest.c 
jmptest.c 

jmptest:\>dir /b *.exe 
jmptest.exe 

jmptest:\>cdb -c "uf func;q" jmptest.exe | grep 401 
00401020 55    push ebp 
00401021 8bec   mov  ebp,esp 
00401023 83ec08   sub  esp,8 
00401026 c745fc0a000000 mov  dword ptr [ebp-4],0Ah 
0040102d c745f814000000 mov  dword ptr [ebp-8],14h 
00401034 c745fc19000000 mov  dword ptr [ebp-4],19h 
0040103b c745f81e000000 mov  dword ptr [ebp-8],1Eh 
00401042 8b45fc   mov  eax,dword ptr [ebp-4] 
00401045 0345f8   add  eax,dword ptr [ebp-8] 
00401048 8be5   mov  esp,ebp 
0040104a 5d    pop  ebp 
0040104b c3    ret 

jmptest:\>cdb -c "bp 401034 \"r eip = 0x40103b;gc\";g;q " jmptest.exe | grep wan 
t 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 

jmptest:\> 
छोड़
संबंधित मुद्दे