खैर एक छोटा सा है कूदता असेंबलर के निरीक्षण से इसे
0044EE35 mov esi,esp
0044EE37 push 3039h
0044EE3C mov ecx,dword ptr [ebp-18h]
0044EE3F add ecx,70h
0044EE42 mov eax,dword ptr [ebp-18h]
0044EE45 mov edx,dword ptr [eax+70h]
0044EE48 mov eax,dword ptr [edx+0Ch]
0044EE4B call eax
0044EE4D cmp esi,esp
0044EE4F call @ILT+6745(__RTC_CheckEsp) (42BA5Eh)
इसमें 2 पंक्तियां हैं। 0x44ee35 पर पहला नोट यह esi के वर्तमान मूल्य esp को संग्रहीत करता है।
फ़ंक्शन कॉल पूरा होने के बाद यह एएसपी और एएसआई के बीच एक सीएमपी करता है। वे दोनों एक ही होना चाहिए। यदि वे नहीं हैं तो किसी ने या तो ढेर को दो बार अवांछित किया है या इसे अवांछित नहीं किया है।
_RTC_CheckEsp समारोह इस तरह दिखता है:
_RTC_CheckEsp:
00475A60 jne esperror (475A63h)
00475A62 ret
esperror:
00475A63 push ebp
00475A64 mov ebp,esp
00475A66 sub esp,0
00475A69 push eax
00475A6A push edx
00475A6B push ebx
00475A6C push esi
00475A6D push edi
00475A6E mov eax,dword ptr [ebp+4]
00475A71 push 0
00475A73 push eax
00475A74 call _RTC_Failure (42C34Bh)
00475A79 add esp,8
00475A7C pop edi
00475A7D pop esi
00475A7E pop ebx
00475A7F pop edx
00475A80 pop eax
00475A81 mov esp,ebp
00475A83 pop ebp
00475A84 ret
आप देख सकते हैं पहली बात यह है कि क्या जाँच पहले तुलना का परिणाम "इसके बराबर नहीं" यानी ईएसआई थे = esp!। अगर ऐसा होता है तो यह विफलता कोड पर कूद जाता है। अगर वे वही हैं तो फ़ंक्शन बस वापस आ जाता है।
इतने सारे 'int 3' क्यों पर्याप्त नहीं हैं? – ollydbg
'int 3' एक बाइट है, और यह ब्रेकपॉइंट बाधा है। इसलिए कि बाइट मान पारंपरिक रूप से कार्यों के बीच पैडिंग के रूप में प्रयोग किया जाता है। (x86- निश्चित रूप से विशिष्ट)। ध्यान दें कि यह पहुंच योग्य नहीं है, शून्य वास्तव में पर्याप्त होगा। – MSalters
उनके साथ पैड का कारण यह है कि यदि एक अमान्य कूद int 3s में होती है तो कोड तुरंत टूट जाएगा और आप आसानी से अमान्य कूद देख सकते हैं। – Goz