Skip to content

uxebu/confusion

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

confusion

Sometimes, we need that little bit of “security through obscurity” and want to obfuscate our source code.

confusion makes it harder to decipher your code by replacing string literals and property accesses with lookups into a string map.

Example

This code snippet:

a.property(called.with('a string literal'));
an.other("call", "is", "here");

will be converted to

(function(_x24139) {
  a[_x24139[0]](called[_x24139[1]](_x24139[2]));
  an[_x24139[3]](_x24139[4], _x24139[5], _x24139[6]);
}).call(
  this,
  ["property", "with", "a string literal", "other", "call", "is", "here"]
);

Pipe it through closure compiler and you’ll get:

(function(b){a[b[0]](called[b[1]](b[2]));an[b[3]](b[4],b[5],b[6])}).call(
  this,"property;with;a string literal;other;call;is;here".split(";"));

If your code declares any top level variables, it won’t be wrapped in a IIFE. The string map will simply be prepended, in order to maintain program semantics:

'use strict';
var name = 'A name here';

becomes:

'use strict';
var _x44736 = ["A name here"];
var name = _x44736[0];

Usage: command line

confusion reads from stdin and writes to stdout. Just pipe your source or build through it:

confusion < build.js > obfuscated.js

# or pipe the output of your build tool through it:
browserify . | confusion > obfuscated.js

Usage: programmatic interface

The confusion module exposes two functions: transformAst(programNode, createVariableName) and createVariableName(names).

transformAst takes a program AST node ({type: 'Program', body: [/* nodes...*/]}) and a callback function to produce the variable name of the string map. The callback takes an array of existing variable names and should return an unused name.

createVariableName is a default implementation of the callback needed by transformAst.

var parse = require('esprima').parse;
var toString = require('escodegen').generate;
var confusion = require('confusion');

var ast = parse(sourceCode);
var obfuscated = confusion.transformAst(ast, confusion.createVariableName);
console.log(toString(obfuscated));