J'essaie d'obtenir une liste de variables qui sont utilisées mais non déclarées dans un script. Je crée un meilleur obfuscateur de code, mais une chose est que le script obscurci ne peut pas accéder aux variables extérieures en raison de la configuration de la portée (c'est intentionnel). J'essaye donc de le réparer, en "transférant" les variables qui sont utilisées en dehors du script. Disons que j'ai une fonction:

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

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

Je veux pouvoir faire ça:

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

Mais pour ce faire, je dois obtenir une liste de variables qui sont utilisées, mais non déclarées dans la fonction. (console et somevar sont les variables non déclarées, elles ne sont pas déclarées dans la fonction, mais elles sont utilisées)

BTW: Il s'agit essentiellement d'un problème de manipulation de chaînes

EDIT: quelques éclaircissements

J'essaie d'obtenir la liste d'un STRING. Donc, utiliser window ne fonctionnera pas

EDIT: Plus de clarification

Puisque je fais un script d'obscurcissement, il n'exécute pas le script à masquer, j'ai juste le script non évalué sous forme de chaîne.

EDIT: Encore plus de clarification

Si je saisis ceci dans la réponse à ceci:

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

Il devrait sortir

["b","console"]
0
Andrew 14 janv. 2017 à 19:56

2 réponses

Meilleure réponse

Vous pouvez utiliser une instruction with avec un proxy:

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);

Si ce que vous avez est une chaîne avec le code, vous pouvez simplement utiliser 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);

Si vous ne souhaitez pas exécuter le code et obtenir uniquement les identifiants, vous pouvez ajouter des interruptions de proxy supplémentaires afin de ne laisser le code traiter qu'avec une membrane proxy qui empêche les effets secondaires. Notez que cela peut être difficile à faire correctement et que le code peut se comporter différemment s'il existe des conditions ou des boucles.

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);
2
Oriol 14 janv. 2017 à 21:24
"function(global){"+yourcode+"}.call(JSON.parse(JSON.stringify(window||global)),JSON.parse(JSON.stringify(window||global)));"

Votre code peut accéder aux variables globales -> copiées locales en utilisant ceci ou global

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

Mon essai pour obtenir les vars

var jsvars=["var","let","const","function","(",")","{","}","=","==","===",";"];
jsvars.forEach(e=>yourcode=yourcode.replace(e,""));
yourcode=new Set(yourcode.split(" "));

Votre code devrait maintenant être un tableau de vars

0
Jonas Wilms 14 janv. 2017 à 17:35