Nun ein wenig der Inspektion des Assemblers gibt es weg
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)
Es gibt 2 Zeilen zu beachten. Erste Note bei 0x44ee35 speichert den aktuellen Wert von esp in esi.
Dann, nachdem der Funktionsaufruf abgeschlossen ist, führt er einen Cmp zwischen esp und esi. Sie sollten jetzt beide gleich sein. Wenn sie es nicht sind, hat jemand entweder den Stapel zweimal abgewickelt oder nicht abgewickelt.
Die _RTC_CheckEsp Funktion sieht wie folgt aus:
_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
Wie Sie das erste, was ist es überprüfen zu sehen, ob das Ergebnis der früheren Vergleich waren „nicht gleich“, dh esi = esp!. Wenn das der Fall ist, springt es zum Fehlercode. Wenn sie gleich sind, kehrt die Funktion einfach zurück.
Warum so viele 'int 3', ist nicht genug? – ollydbg
'int 3' ist ein Byte und es ist der Breakpoint-Interrupt. Daher wird dieser Byte-Wert traditionell als Padding zwischen Funktionen verwendet. (x86-spezifisch natürlich). Beachten Sie, dass es unerreichbar ist, Null wäre in der Tat genug. – MSalters
Der Grund, warum sie damit auffüllen ist, dass, wenn ein ungültiger Sprung in die int 3s auftritt, der Code sofort bricht und Sie leicht sehen können, dass ein ungültiger Sprung aufgetreten ist. – Goz