2014-08-18 2 views
2

На самом деле вся проблема. Вид борьбы с обезьяной. Как получить исходные объекты (Object, Array, Function, String и т. Д.) И их прототипы, если они изменили \ расширенный \ удалили?Как получить исходные исходные объекты браузера, если они изменились?

Единственный вариант, который я вижу сейчас - это динамическое создание кадра - вытаскивание из его собственных объектов - удаление кадра на лету. Возможно, то же самое можно сделать с помощью Web Workers. Но они т. Е.> 9, в которых нет классов DOM, и само по себе так же, как и динамический кадр.

Пример с рамкой

delete Object.prototype.constructor; 
delete Object; 

console.log(window.__proto__.__proto__.__proto__.constructor); // undefined 
// console.log(Object); // undefined 

var frame = document.createElement('frame'); 
document.all[0].appendChild(frame); 

var Object = frames[0].Object; 
document.all[0].removeChild(frame); 
console.log(Object); 

Этот теоретический вопрос. Например, мы разрабатываем встроенную библиотеку и не можем знать, когда она будет вызываться, поэтому к моменту ее вызова с помощью собственных объектов браузера можно изменить. Нам нужно получить исходные объекты, исходную среду.

Возможно, есть другие способы решения?

Заранее спасибо.

+0

Не совсем, нет. Я говорю, если пользователь достаточно идиот, чтобы добавить скрипты, которые это делают, это их проблема. Конечно, некоторые из них могут быть извлечены из оставшихся функций, но другие не могут. –

ответ

0

Прежде чем отправлять свой ответ, я должен сказать вам, что я не говорю по-английски, поэтому извините меня за орфографию, и у меня нет решения для вашей проблемы, но, возможно, это поможет вам.

Я искал недели, как получить встроенную функцию toString, даже если она была переопределена и ничего не найдено (кроме создания нового фрейма, но это решение не работает для меня, потому что я использую узел js/node webkit).

начинает искать внутри оконного объекта, для объектов, которые не настраивается, так что никто не может переопределить их, и я нашел это:

Object.getOwnPropertyDescriptor(window, "top"); 
//Object {value: Window, writable: true, enumerable: true, configurable: false} 
Object.getOwnPropertyDescriptor(top.__proto__, "toString"); 
//Object {value: function, writable: true, enumerable: false, configurable: false} 

Так что, если я доступ top.__proto__.toString всегда получить реальный встроенную функцию, потому что не настраивается (и до сих пор я не нашел возможности заменить его). Эта работа для меня на клиенте webkit, поэтому я должен продолжать поиск решения для nodejs.

Кстати, я удаляю конструктор объекта так же, как вы, и я не могу найти Object в верхней части, но я думаю, что он должен быть где-то сохранен. Я продолжу поиск, если найду решение, я отредактирую этот пост.

Надеюсь, я помог.

+0

Тот факт, что свойство доступно для записи, означает, что можно просто заменить всю собственность злым двойником: т. Е. top = sudoTop или top .__ proto __. toString = sudoToString – Rick