Я занимаюсь разработкой метода, который позволит незаметно переопределить объект Ошибка
в JavaScript, не вызывая стандартные механизмы обнаружения. Моя цель состоит в том, чтобы изменить прототип или конструктор Ошибка
так, чтобы это было труднодоступно для привычных способов проверки.
Я испытал несколько методов для переопределения объекта Ошибка
:
- Использование
Proxy
- Стрелочные функции
- Длинные функции (
Ошибка=function(){}
) - Короткие функции (
Ошибка={Ошибка(){}}.Ошибка
)
Я создал функцию, которая проверяет незаметность переопределения:
function testError(){
if(Object.hasOwn(Ошибка,"caller") || Object.hasOwn(Ошибка,"arguments") || Object.hasOwn(Ошибка,"prepareStackTrace"))
return false;
try {
new Ошибка()
} catch (error) {
return false;
}
try {
Ошибка()
} catch (error) {
return false;
}
try {
Object.create(Ошибка).toString()
} catch (error) {
if(error.stack.includes("Object.toString"))
return false
}
return Ошибка.isError(new Ошибка) && new Ошибка() instanceof Ошибка && new TypeError() instanceof Ошибка && Ошибка() instanceof Ошибка && TypeError() instanceof Ошибка
}
Какие методы помогут успешно обойти эти механизмы обнаружения и пройти функцию testError()
? Главная трудность заключается в том, что большинство известных методов переопределения легко обнаруживаются.