Comments 14
По существу написать нечего, но такие истории всегда захватывающие и читаются на одном дыхании, из минусов только навязчивое послевкусие, что я не true-программист.
А если в объявлении функции явно указать extern __attribute__((__sysv_abi__)) void my_linux_style_assembly_function();
компилятор под виндой сам не сохранит недостающие регистры?
Поэтому пожалуйста, восстанавливайте регистры, завершив с ними работу
Поэтому пожалуйста не используйте компиляторы которые делают оптимизации на не обоснованных утверждениях. Каким надо быть наивным что бы вызывать внешние библиотеки и ожидать что там нет ошибок и регистры будут сохранены. Особенно с компиляторами которые любят накинуть на вентилятор в случае UB. При вызове сторонних библиотек надо самим всё сохранять и отлавливать отклонения инвариантов (хотя бы для выявления подобных граблей в будущем, а не полагаться на авось, призывая всех к порядку).
Если ко мне придёт гость и нагадит в гостиной, я перестану пускать его, а не стану надевать памперсы на каждого входящего.
Иными словами, если библиотека не выполняет требования ABI, надо решать проблему с библиотекой, а не оборачивать всё в дополнительные защиты.
От кривых изменений памяти как защититься, кстати? Всю доступную память на диск сбросить, после вызова функции раскатать обратно?
Судя по статье, в регистры гадила не какая-то прилинкованная либа, а вообще другой процесс (шифрования диска). Как такое вообще возможно-то? В операционной системе, которая при переключении задач должна сохранить вообще весь контекст, включая любые регистры.
Эта либа устанавливала хуки на системные вызовы, которые работают с диском.
And I was able to confirm (in some of the dumps, we don't collect the right heap information in all dumps) that Trend Micro code (one region is a DLL that seems to be called ApiHookStub.x64.dll, another is not a direct DLL copy) which has been allocated on our process heap without going through the loader, presumably via something like ::VirtualProtectEx and ::WriteProcessMemory. This is a pattern I see used broadly in Edge crashes we root cause to third-party software.
https://bugs.chromium.org/p/chromium/issues/detail?id=1218384#c81
хуки на системные вызовы, которые работают с диском
Но т.к. с диском работает примерно весь софт, она должна была валить любой софт, который использует диск и регистр XMM7. И, как видим, в данном случае XMM7 используется компилятором просто как ещё один регистр общего назначения для хранения константы.
Вообще конечно жесть. МакАффи как были руко*опами 20 лет назад, так и остались.
Поиск бага регистра, приводящего к вылету Chrome