2010-10-12 71 views
6

__RTC_CheckEsp是一個調用,用於驗證esp,堆棧,寄存器的正確性。它被調用以確保esp的值在函數調用中保存。__RTC_CheckEsp如何實現?

任何人都知道它是如何實現的?

回答

1

如果你在任何ASM好,也許這會有所幫助:

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 2010-10-12 13:14:08

+2

「int 3」是一個字節,它是斷點中斷。因此,該字節值傳統上用作函數之間的填充。 (當然是x86)。請注意,它無法訪問,實際上零就足夠了。 – MSalters 2010-10-12 13:19:42

+3

他們的理由是,如果在int 3s中發生無效跳轉,那麼代碼將立即中斷,您可以輕鬆看到發生了無效跳轉。 – Goz 2010-10-13 07:40:49

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) 

有兩條注意事項。首先在0x44ee35註釋它將esp的當前值存儲到esi。

然後,函數調用完成後,它執行esp和esi之間的cmp。他們現在應該都是一樣的。如果他們不是,那麼有人要麼兩次解開堆疊,要麼沒有解開它。

的_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    

正如你可以看到它檢查的第一件事是較早比較的結果是否是「不等於」即ESI = ESP!如果是這種情況,那麼它跳轉到失敗代碼。如果它們相同,那麼函數只是返回。

+0

不錯,我忘記了調用代碼... – 2010-10-12 12:56:27