1. JavaScript / Говнокод #21212

    −51

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    (function innerScope(){
        function hi() {
            var data = {};
            data.importantData = {foo:1, bar:2};
            return data;
        }
        hi();
    })();

    Есть огромный минифицированный жс-файл. Где-то в дебрях проскакивают нужные мне данные в расшифрованном виде (знаю где именно).
    Как можно навесить хук чтобы отследить когда обращаются к полю с именем 'importantData'?
    Подменить глобальные объекты не вариант, т.к. всё обёрныто в замыкание.

    Может как-то подменой Function.prototype.call или Object.prototype.valueOf?

    Запостил: 3_dar, 18 Сентября 2016

    Комментарии (20) RSS

    • показать все, что скрытоУважай авторское право, имбецил.
      Ответить
    • Обычно никак, есть всякие Reflect API и Proxy, но сами переменные у тебя так же вшиты в замыкание.
      Только полная замена оригинального скрипта на модифицированный.
      Ответить
      • Если это веб, то проблем с заменой быть не должно, пока ты сам у себя этим балуешься , а если нода, то гугли инжекты модулей и пробуй от этого плясать.

        Если тебе это надо одноразово выполнить, то дебуггеры есть.
        Ответить
        • Я прозреваю юзерскрипт. Вообще задача муторная, сам сталкивался. Очень сильно зависит от сайта. Выдернуть переменные, которые кроме как в замыкании, нигде не светятся - нереально, имхо.
          А вот если что-то высунуто наружу... можно попробовать пройти по цепочке.
          Но хаки с Object.prototype того не стоят.
          Ответить
          • Кстати, если скрипт позволяет себя джва раза запустить, то в этом случае его можно попробовать всосать, модифицировать и эвальнуть.
            Ответить
    • показать все, что скрытоgood, like bagor
      Ответить
    • Перепиши поле через defineProperty (set/get) и вставь свой код в сеттер
      Ответить
    • > Может как-то подменой Function.prototype.call или Object.prototype.valueOf?

      А почему не подменой Object.prototype.importantData ?
      var important = [];
      Object.defineProperty(({}).__proto__, 'importantData', {
        writeable:true,
        set: function (newVal) { important.push(newVal); this._private_importantData = newVal; },
        get: function () { return this.__private_importantData; }
      });
      Так, например, каждая запись в importantData будет складывать данные в массив.
      Ответить
      • Аспектно.
        Ответить
      • Красиво.

        Кстати, в консоли хрома протекают абстракции. При выполнении указанного кода important по умолчанию содержит 2 раза по true. При втором и последующих просмотрах - 3 раза по true, при создании объекта true-шек уже семь штук, после первого присваивания указанного поля в important лежит [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, 3, true, true] (если брали тройку).
        Ответить
        • Т. е. отладочная консоль переназначает свойства стандартных объектов, а поскольку мы тоже переназначаем, получается цепочка переназначений, и сеттеры/геттеры вызываются по нескольку раз (мы невзначай хакнули и скрытый объект консоли, который ловит данные)?
          Ответить
          • Ждём хак для Firefox!
            Ответить
          • Но ещё результаты вычислений кэшируются, т.к. при просмотре important лишнее true возникает только один раз.
            Ммм... Автодополнение. Если копипастить important или как 3_14дар жать "ап", то массив не растёт. Если с автодополнением набирать, количество элементов начинает расти.
            Ответить
      • Целесообразно было бы заменить important.push(newVal) на что-то типа important.push({value: newVal, objname: something}), чтобы потом не запутаться в том, откуда взялись значения. Но откуда же взять это самое something, если в JS нет классов?
        Ответить

    Добавить комментарий