获取未使用的变量列表,这些变量未在函数中声明

时间:2017-01-14 16:56:30

标签: javascript

我正在尝试获取一个尚未在脚本中声明的变量列表。我正在创建一个更好的代码混淆器,但有一点是混淆的脚本由于范围的设置而无法访问外部变量(这是故意的)。所以我试图通过“转移”在脚本之外使用的变量来修复它。假设我有一个功能:

var somevar = " world"; // this represents non obfuscated "outside" code

(function() { // This represents the obfuscated code
var a = "hello";
console.log(a + somevar);
})();

我希望能够做到这一点:

var somevar = " world";
(function(console,somevar) {
var a = "hello";
console.log(a + somevar);
})(console,somevar)

但是为了做到这一点,我必须得到一个使用的变量列表,但是没有在函数中声明。 (consolesomevar是未声明的变量,它们未在函数中声明,但它们已被使用)

BTW:这基本上是一个字符串操作问题

编辑:一些澄清

我想从STRING中获取列表。因此使用window将无效

编辑:更多澄清

由于我正在编写一个混淆脚本,它不会运行脚本进行混淆,我只是将未评估的脚本作为字符串。

编辑:更加澄清

如果我输入这个答案:

"var a = 'foo';console.log(a + b)"

应输出

["b","console"]

2 个答案:

答案 0 :(得分:2)

您可以在代理中使用with语句:



var somevar = " world"; // this represents non obfuscated "outside" code
var externalVars = [];
with(new Proxy(Object.create(null), {
  has: function(_, identifier) {
    externalVars.push(identifier);
  }
})) (function() { // This represents the obfuscated code
  var a = "hello";
  console.log(a + somevar);
})();
console.log("External vars:", externalVars);




如果您拥有的是包含代码的字符串,那么您只需使用eval



var somevar = " world"; // this represents non obfuscated "outside" code
var externalVars = [];
with(new Proxy(Object.create(null), {
  has: function(_, identifier) {
    externalVars.push(identifier);
    return !(identifier in window);
  }
})) (function() { // This represents the obfuscated code
  eval("var a = 'foo';console.log(a + b)");
})();
console.log("External vars:", externalVars);




如果您不想运行代码并且只获取标识符,则可以添加其他代理陷阱,以便只让代码处理代理膜以防止副作用。请注意,这可能很难正确执行,如果存在条件或循环,代码可能会有不同的行为。



var somevar = " world"; // this represents non obfuscated "outside" code
var externalVars = [];
var proxy = new Proxy(function(){}, {
  apply: function() {
    return proxy;
  },
  has: function(_, identifier) {
    externalVars.push(identifier);
    return true;
  },
  get: function(_, identifier) {
    if (identifier === Symbol.toPrimitive) return () => null;
    if (identifier === Symbol.unscopables) return undefined;
    return proxy;
  }
  // Add necessary traps
});
with(proxy) (function() { // This represents the obfuscated code
  var a = "hello";
  console.log(a + somevar);
})();
console.log("External vars:", externalVars);




答案 1 :(得分:0)

void Cube::update(glm::mat4 T) {

    /* btScalar transform[16];

    if (m_motionState)
        m_motionState->getModelMatrix(transform); */

    if (m_rigidBody) {
        btTransform transform = m_rigidBody->getWorldTransform();

        m_modelMatrix = btScalar2glmMat4(transform);
        m_modelMatrix = T * m_modelMatrix;

        // if (VERBOSE) printMat4(m_modelMatrix);
    }
}


glm::mat4 btScalar2mat4(btScalar* matrix) {
    return glm::mat4(
        matrix[0], matrix[1], matrix[2], matrix[3],
        matrix[4], matrix[5], matrix[6], matrix[7],
        matrix[8], matrix[9], matrix[10], matrix[11],
        matrix[12], matrix[13], matrix[14], matrix[15]);
}


glm::mat4 array2mat4(const float* array) {     // OpenGL row major

    glm::mat4 matrix;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            matrix[i][j] = array[i + j];
        }
    }

    return matrix;
}

您的代码可以访问全局 - &gt;使用此或全局

的本地复制变量
"function(global){"+yourcode+"}.call(JSON.parse(JSON.stringify(window||global)),JSON.parse(JSON.stringify(window||global)));"

我尝试获取变种

this.somevar==somevar;//false
//local.        global.
global.somevar;
//local.

您的代码现在应该是一个变量数组