2010-10-12 16 views
6

__RTC_CheckEsp एक ऐसा कॉल है जो esp, ढेर, रजिस्टर की शुद्धता को सत्यापित करता है। यह सुनिश्चित करने के लिए कहा जाता है कि esp का मान फ़ंक्शन कॉल में सहेजा गया था।__RTC_CheckEsp कैसे कार्यान्वित किया गया है?

कोई भी जानता है कि यह कैसे कार्यान्वित किया गया है?

उत्तर

1

आप एएसएम पर किसी भी अच्छा कर रहे हैं, हो सकता है इस में मदद करता है:

jne (अगर बराबर नहीं कूद) - अगर शून्य झंडा NZ (NotZero)

_RTC_CheckEsp: 
004C8690 jne   esperror (4C8693h) 
004C8692 ret    
esperror: 
004C8693 push  ebp 
004C8694 mov   ebp,esp 
004C8696 sub   esp,0 
004C8699 push  eax 
004C869A push  edx 
004C869B push  ebx 
004C869C push  esi 
004C869D push  edi 
004C869E mov   eax,dword ptr [ebp+4] 
004C86A1 push  0  
004C86A3 push  eax 
004C86A4 call  _RTC_Failure (4550F8h) 
004C86A9 add   esp,8 
004C86AC pop   edi 
004C86AD pop   esi 
004C86AE pop   ebx 
004C86AF pop   edx 
004C86B0 pop   eax 
004C86B1 mov   esp,ebp 
004C86B3 pop   ebp 
004C86B4 ret    
004C86B5 int   3  
004C86B6 int   3  
004C86B7 int   3  
004C86B8 int   3  
004C86B9 int   3  
004C86BA int   3  
004C86BB int   3  
004C86BC int   3  
004C86BD int   3  
004C86BE int   3  
004C86BF int   3 
+0

इतने सारे 'int 3' क्यों पर्याप्त नहीं हैं? – ollydbg

+2

'int 3' एक बाइट है, और यह ब्रेकपॉइंट बाधा है। इसलिए कि बाइट मान पारंपरिक रूप से कार्यों के बीच पैडिंग के रूप में प्रयोग किया जाता है। (x86- निश्चित रूप से विशिष्ट)। ध्यान दें कि यह पहुंच योग्य नहीं है, शून्य वास्तव में पर्याप्त होगा। – MSalters

+3

उनके साथ पैड का कारण यह है कि यदि एक अमान्य कूद int 3s में होती है तो कोड तुरंत टूट जाएगा और आप आसानी से अमान्य कूद देख सकते हैं। – Goz

5

खैर एक छोटा सा है कूदता असेंबलर के निरीक्षण से इसे

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!। अगर ऐसा होता है तो यह विफलता कोड पर कूद जाता है। अगर वे वही हैं तो फ़ंक्शन बस वापस आ जाता है।

+0

अच्छा, मैं कॉलिंग कोड भूल गया ... –

संबंधित मुद्दे