Beh un po ' dell'ispezione dell'assemblatore dà via
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)
ci sono 2 linee da notare in questo. Prima nota a 0x44ee35 memorizza il valore corrente di esp in esi.
Quindi, una volta completata la chiamata della funzione, esegue un cmp tra esp ed esi. Dovrebbero essere entrambi uguali ora. Se non lo sono, qualcuno ha svolto lo svolgimento due volte o non lo ha svolto.
La funzione _RTC_CheckEsp assomiglia a questo:
_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
Come si può vedere la prima cosa che verificare è se il risultato del confronto in precedenza erano "diverso", cioè esi = esp!. Se questo è il caso, salta al codice di errore. Se SONO uguali, la funzione restituisce semplicemente.
Perché così tanti 'int 3', non è uno abbastanza? – ollydbg
'int 3' è un byte, ed è l'interruzione del punto di interruzione. Quindi quel valore di byte è tradizionalmente usato come padding tra le funzioni. (Specifico x86 ovviamente). Si noti che è irraggiungibile, lo zero sarebbe in effetti sufficiente. – MSalters
Il motivo per cui vengono utilizzati è che se si verifica un salto non valido nell'int 3s, il codice si interromperà immediatamente e si potrà facilmente vedere un salto non valido. – Goz