我正在尝试获取一个尚未在脚本中声明的变量列表。我正在创建一个更好的代码混淆器,但有一点是混淆的脚本由于范围的设置而无法访问外部变量(这是故意的)。所以我试图通过“转移”在脚本之外使用的变量来修复它。假设我有一个功能:
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)
但是为了做到这一点,我必须得到一个使用的变量列表,但是没有在函数中声明。 (console
和somevar
是未声明的变量,它们未在函数中声明,但它们已被使用)
BTW:这基本上是一个字符串操作问题
编辑:一些澄清
我想从STRING中获取列表。因此使用window
将无效
编辑:更多澄清
由于我正在编写一个混淆脚本,它不会运行脚本进行混淆,我只是将未评估的脚本作为字符串。
编辑:更加澄清
如果我输入这个答案:
"var a = 'foo';console.log(a + b)"
应输出
["b","console"]
答案 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.
您的代码现在应该是一个变量数组