Показать сообщение отдельно
Старый 09.11.2016, 11:33   #1
dark
Читодел
Аватар для dark
OFFLINE
Регистрация: 09.04.2007
Сообщений: 965
Благодарностей:
36,577 всего
Мнения: + 37736
Репутация: 116394
Отправить сообщение для dark с помощью ICQ Отправить сообщение для dark с помощью Skype™

Зацените согласование вызова в IDA 6.8


Есть код:
Код:
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.

Cheats Development | Создание читов на заказ

Я не оказываю услуги гаранта!
База данных кидал: blacklist.rf-cheats.ru
Обязательно проверяйте человека через чёрный список прежде чем совершать с ним сделку.
 
Ответить с цитированием