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