Есть код:
Код:
68D15 - 8B 18 - mov ebx,[eax]
68D17 - 51 - push ecx
68D18 - 50 - push eax
68D19 - 8D 45 0C - lea eax,[ebp+0C]
68D1C - 50 - push eax
68D1D - 8B CE - mov ecx,esi
68D1F - E8 E3F6FFFF - call 68408
68D24 - 53 - push ebx
68D25 - FF 75 08 - push [ebp+08]
68D28 - 8B CF - mov ecx,edi
68D2A - E8 C8EFFFFF - call sub_4E23ACF
Меня интересует вызов последней функции. С виду мы имеем вроде как вызов простого метода, указатель на класс которого лежит в EDI. То есть по идее прототип выглядит так:
Код:
DWORD class::method(int a1, int a2);
Всё верно? Не взирая на возвращаемое значение, оно в данном контексте не важно. А вот hex-rays парсит совсем по-другому:
Код:
char __userpurge sub_4E23ACF@<al>(int a1@<ebp>, int a2, int a3)
Ну __userpurge ладно, там за ESP можно последить, возвращаемое значение я тоже опущу. Но откуда у нас первый аргумент в EBP? Может кто-нибудь объяснить? Когда явным образом он должен быть в ECX.