Скрытное переписывание функций в Javascript

Discussion in 'PHP' started by scanislav, 20 Sep 2012.

  1. scanislav

    scanislav Elder - Старейшина

    Joined:
    25 Jun 2010
    Messages:
    87
    Likes Received:
    22
    Reputations:
    31
    При отладке или деобфускации джаваскриптовских программ зачастую возникает необходимость перенаправить какие-то функции на свой код. Простейший пример:
    Code:
    var oldEval = window.eval;
    eval = function(x) { alert(x); return oldEval(x); }
    С помощью такого нехитрого приема ломается 90% кода, криптованного непрофессионалами.
    К сожалению, такой хук легко обнаруживается простым вызовом функции toString()

    Было:
    Code:
    >eval.toString()
    function eval() { [native code] }
    Стало:
    Code:
    >eval.toString()
    function(x) { alert(x); return oldEval(x); }
    Палимся! Что делать? Почему бы не переписать саму функцию toString()?

    Code:
    var oldEval = window.eval;
    eval = function(x) { alert(x); return oldEval(x); }
    eval.toString = function() { return "function eval() { [native code] }"; }
    Уже лучше, но умный противник может проверить и toString. Переписывать toString.toString? А потом и toString.toString.toString? Решаем проблему раз и навсегда при помощи небольшого трюка с рекурсией:

    Code:
    var fake = (function() {
      function closure(str) {
        return function() {
          return str;
        };
      }
    
      function clone(f) {
        return function() {
          return f.apply(this, arguments);
        };
      }
    
      // Переписываем базовый toString
      var base = closure({}.toString+'');
      base.toString = base;
    
      // Создаем функцию с поддельным toString
      return function(newFunc, oldFunc) {
        var f = clone(newFunc);
        f.toString = closure(oldFunc+'');
        f.toString.toString = base;
        return f;
      };
    })();
    Пример использования:
    Code:
    var newAlert = function(x) {
      console.log(x);
    }
    window.alert = fake(newAlert,window.alert);
    alert("test");
    На консоль выводится "test"

    Code:
    >alert.toString()
    function alert() { [native code] }
    
    >alert.toString.toString()
    function toString() { [native code] }
    
    Как ни в чем ни бывало!
     
    1 person likes this.
Loading...
Similar Threads - Скрытное переписывание функций
  1. GAiN
    Replies:
    4
    Views:
    6,972