Eh bien un peu d'inspection de l'assembleur, il donne suite
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)
il y a 2 lignes à noter dans ce domaine. Première note à 0x44ee35 il stocke la valeur actuelle de esp à esi.
Ensuite, après l'appel de la fonction est terminée, il fait un cmp entre esp et esi. Ils devraient tous les deux être les mêmes maintenant. Si ce n'est pas le cas, alors quelqu'un a soit déroulé la pile deux fois ou ne l'a pas déroulé.
La fonction _RTC_CheckEsp ressemble à ceci:
_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
Comme vous pouvez le voir la première chose qu'il vérifier est de savoir si le résultat de la première comparaison était « Different » c.-à-esi = esp!. Si c'est le cas, alors il saute au code d'échec. Si elles sont identiques, la fonction revient simplement.
Pourquoi tant «int 3», n'en a-t-on pas assez? – ollydbg
'int 3' est un octet, et c'est l'interruption du point d'arrêt. Par conséquent, cette valeur d'octet est traditionnellement utilisée comme remplissage entre les fonctions. (x86-spécifique bien sûr). Notez qu'il est inaccessible, zéro serait suffisant en fait. – MSalters
La raison pour laquelle ils remplissent cette condition est que si un saut invalide se produit dans les int 3, alors le code se casse immédiatement et vous pouvez facilement voir un saut invalide s'est produit. – Goz