• XSS.stack #1 – первый литературный журнал от юзеров форума

Антидебаг в браузерах

malayazemlya

HDD-drive
Пользователь
Регистрация
04.06.2013
Сообщения
26
Реакции
1
Совершенно случайно набрел на сразу несколько способов узнать, выполяется ли скрипт под браузерным отладчиком (firebug, chrome developer tools итп) Поделюсь с общественностью.

Метод первый
Работает везде кроме оперы.

Проверить вызывается ли console.log() Выводим на консоль переменную типа function и задаем формат %s Дебаггер пытается превратить значение в строку, чем запускает метод toString. А мы toString перехватываем (вариант: то же самое с форматом %d и методом toValue) Что характерно, нужна именно функция, простой объект не катит.

(дополнение: В хроме у=/some regular expression/ тоже катит)

Код:
function is_dbg () {
  var d = false, y = function() {};
  y.toString = function() { d = true; }
  console && console.log("%s",y);
  return d;
};

alert(is_dbg());

Нюанс. IE однажды подцепив дебаггер, дальше его уже не отцепляет, а просто убирает с глаз долой. Потому код будет возвращать true даже после закрытия окна отладчика.

Метод второй.
Работает везде :yahoo:

Если метод toString приделать к функции, то он почему-то запускается при любом просмотре объекта в окошке дебаггера: watch, local variables итп <_< Хуже того, вызов приходит даже если скрипт стоит на паузе :o или завершился

Но почему все браузеры глючит????? :newconfus:

Код:
function no_watch(m) {
  var y = function() {
    return m;
  }
  var s = ''+ s;
  y.toString = function(x) {
     m = x;
     return s;
  }
  return y;
}

var a = no_watch(123);
//  здесь посмотри в дебаггере на переменную  a 
// :)))


alert(a())

 // присваеваем новое значение
a.toString(567);

// или здесь посмотри

alert(a());

Исключение: Вывод значения через консоль в опере не перехватывается.

Метод третий.
Работает в Chrome/FF

Исгользуем css при выводе на консоль
Код:
console.log(
'%c%s',
'background-image:url(http://mysite.com/sniffer.png)',
'some string');
Запрос к sniffer.png шлется только если отладчик открыт.

Метод четвертый.
Работает везде но не всегда.

Вывалиться самому в отладчик, через оператор debugger или по ошибке, потом проверить таймер. В принципе, известная фишка, привожу для полноты картины.

Код:
function now() {
  return +(new Date());
}

function is_dbg() {
  var t = now();
  debugger;
  return now() < t+10;
}
alert(is_dbg());

debugger сложно спрятать. ошибку спрятать проще

Код:
function is_dbg() {
  var t = now();
  try { polny bred syntax error } catch(e) {}
  return now() < t+10;
}

Увы, результат не гарантирован. Иногда браузеры в дебаггер валиться отказываются, внутри eval() особенно

.......
Еще есть идеи?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
хм. у меня такой стоит:
Код:
function isDbgd() {if(console&&console.log)alert(1);}
для ИЕ годится. В опере, кажется, не работает - там console всегда присутствует.
Возможный вариант - сверка разницы доступных и полных высот браузера. Идеологически это жуткая кривулина, т.к. нужен не отцепленный отладчик, и браузер в фулскрине. Но работает...
Код:
<!DOCTYPE html>
<html>
	<body>
  <script type="text/javascript">
  function isDebuged() {
  	return (window.outerHeight-window.innerHeight) > 200;
  }
  setInterval('if(isDebuged())document.getElementById("status").innerHTML="ON";else document.getElementById("status").innerHTML="off"',100);
  </script>
  <p id="status">unknown</p>
	</body>
</html>
Так же, на stackoverflow предлагали смотреть очередной объект, который есть только в последних хромах (читай - фича только для хрома)
Код:
function isInspectOpen()
{
    console.profile(); 
    console.profileEnd(); 
    if (console.clear) console.clear();
    return console.profiles.length > 0;
}
топик-обсуждение: http://stackoverflow.com/questions/7798748...console-is-open

Касательно второго метода... думается дебагер прогоняет через toString все выражения, чтобы условно-безопасно их выводить в интерфейс. Другой вопрос - почему он использует для этого пространство имен страницы, а не свое.
За метод спасибо, весьма неожиданно)

4й метод я вообще не понял =\ Мы ищем разницу в 10мс времени, которая была потрачена на открытие и загрузку дебагера?


Еще методы... в старых фф по jar://-протоколу можно было грузить иконку фаербага, если он установлен, в картинку с onload-ом.
Но то ли зимой, то ли той осенью jar:// с служебными путями запретили.

Да и, честно говоря, чего-то более удобного чем 1й вариант, я не нашел(


пс. Хочу сказать отдельное спасибо за упоминание каверзного бага с невыгружаемым дебагером в ИЕ. Ой сколько людей зае*алось с этим)
Так же хочу напомнить, что все такие проверки надо оборачивать в setInterval, т.к. в нашем случае проверять 1 раз по загрузке страницы не годится.
 
Метод с console.profile занятный. Проверил - работает. Но непонятно. Браузеры же всегда пытаются скрыть состояние консоли от посторонних скриптов. Что авторы имели ввиду? <_<

Проверка на наличие объекта console, она действительно имеет смысл только для ИЕ. У всех остальных console есть всегда. Я ее в своем методе 1 на самом деле использую, но как-то не упомянул особо.

С таймером (4й метод) идея совсем простая на самом деле. debugger останавливает выполнение скрипта, как брейкпоинт. Чтоб продолжить, надо вручную кликнуть на run. Возникает заминка. По ней и определяем, что нас отлаживают.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
malayazemlya
идеологически нет смысла скрывать состояние отладчика. Главное чтобы он не гадил своими объектами, и не "мешал", я так думаю)

Последний способ, стало быть - только во время профайлинга скрипта =(

Если исходить из реалий сокрытия фрейма на ломе или доноре, кроме всего прочего, достаточно снимать фрейм сразу при любых нажатиях клавиш, или правому клику (а не только f12 или Ctrl+Shift+I).
Мне кажется это нормальным, потому что активность простого юзера с клавиатуры начинается когда он уже сориентировался на сайте. За это время все что могло - прогрузится.

И переведу тему в чуть другое русло) Как я понял, ты экспериментировал с переназначением методов объектов, которые в т.ч. вызываются в дебагере, который имеет доступ ко всему браузеру в целом. Это значит, что если вдруг toString вернет вместо строки свой объект, который будет схаван и отрендерен - мы получим uxss и вероятнее всего - выполнение кода, через переопределение обработчика плагина на странице настроек.
Покопайся с этим - может чего и выгорит)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх