(no subject)
Jul. 15th, 2011 09:42 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Словил вчера забавный эффект.
Я использую библиотеку mach_override, которая, как выяснилось, является самым надежным способом подменить системную функцию в Mac OS: она просто парсит начало функции, откусывает от нее нужное число инструкций и заменяет их на переход в пользовательскую функцию.
Эта штука хорошо работала нативно, но отказывалась подменять нужную мне функцию под gdb -- не могла распарсить байт 0xCC. При этом ни objdump, ни сам gdb такого байта в этой функции не видели, поэтому что-либо отладить представлялось невозможным.
Разгадка же оказалась простой: 0xCC -- это прерывание int3, которое gdb воткнул в функцию, чтобы по моей же просьбе поставить там breakpoint. И не признавался, справедливо полагая, что неча пользователю об этом знать.
Я использую библиотеку mach_override, которая, как выяснилось, является самым надежным способом подменить системную функцию в Mac OS: она просто парсит начало функции, откусывает от нее нужное число инструкций и заменяет их на переход в пользовательскую функцию.
Эта штука хорошо работала нативно, но отказывалась подменять нужную мне функцию под gdb -- не могла распарсить байт 0xCC. При этом ни objdump, ни сам gdb такого байта в этой функции не видели, поэтому что-либо отладить представлялось невозможным.
Разгадка же оказалась простой: 0xCC -- это прерывание int3, которое gdb воткнул в функцию, чтобы по моей же просьбе поставить там breakpoint. И не признавался, справедливо полагая, что неча пользователю об этом знать.
no subject
Date: 2011-07-15 10:21 am (UTC)no subject
Date: 2011-07-15 01:29 pm (UTC)Игорь хорошую ссылку подогнал.
no subject
Date: 2011-07-15 01:31 pm (UTC)no subject
Date: 2011-07-15 07:59 pm (UTC)no subject
Date: 2011-07-15 08:37 pm (UTC)no subject
Date: 2011-07-16 07:37 pm (UTC)no subject
Date: 2011-07-18 04:27 am (UTC)Правда, не знаю, какие у вас там прологи у системных функций -- если такие же однообразные, как в (каждой конкретной версии) ntdll.dll, оверрайдилку скорее всего можно научить не обижаться на gdb.
no subject
Date: 2011-07-18 03:37 pm (UTC)Там для перехвата заменяются первые восемь байт функции, так что в общем случае помимо операций со стеком может попадаться всякий мусор, вплоть до инструкций jmp. При этом прологи различаются довольно сильно. Можно, конечно, замапить нужную библиотеку где-нибудь сбоку и сверяться с оригиналом, но это дороже, да и не к спеху.