ArrayPattern and AssignmentPattern function parameters obfuscation + tests

This commit is contained in:
sanex3339
2017-01-13 19:15:08 +03:00
parent b95a248c00
commit a295f77101
9 changed files with 168 additions and 83 deletions
+4 -77
View File
@@ -11,83 +11,10 @@ if (!(<any>global)._babelPolyfill) {
let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
`
(function(){
var result = 1,
term1 = 0,
term2 = 1,
i = 1;
while(i < 10)
{
var test = 10;
result = term1 + term2;
console.log(result);
term1 = term2;
term2 = result;
i++;
}
console.log(test);
var test = function (test) {
console.log(test);
if (true) {
var test = 5
}
return test;
}
console.log(test(1));
function test2 (abc) {
function test1 () {
console.log('inside', abc.item);
}
console.log('тест', abc);
var abc = {};
return abc.item = 15, test1();
};
var regexptest = /version\\/(\\d+)/i;
console.log(regexptest);
test2(22);
console.log(105.4);
console.log(true, false);
var sA = 'shorthand1';
var sB = 'shorthand2';
console.log({sA, sB});
try {
} catch (error) {
console.log(error);
}
function foo () {
return function () {
var sum1 = 10 + 20;
var sum2 = 20 + 30;
var sum3 = 30 + 50;
var sub = sum3 - sum2;
return sum1 + sub;
}
}
console.log(foo()());
if (true) {
console.log(\`1\`);
console.log(\`2\`);
console.log(\`3\`);
console.log(\`4\`);
console.log(\`5\`);
}
var foo = 1;
var test = function (foo, abc = foo) {
return foo, abc;
}
})();
`,
{
@@ -52,4 +52,90 @@ describe('FunctionTransformer', () => {
assert.match(obfuscatedCode, functionBodyMatch);
});
});
describe('assignment pattern as parameter', () => {
describe('literal as right value', () => {
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
readFileAsString(__dirname + '/fixtures/assignment-pattern-as-parameter-1.js'),
{
...NO_CUSTOM_NODES_PRESET
}
);
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
it('should transform function parameter assignment pattern identifier', () => {
const functionParameterMatch: RegExp = /function *\(_0x[a-f0-9]{4,6} *= *0x1\) *\{/;
const functionBodyMatch: RegExp = /return *_0x[a-f0-9]{4,6};/;
assert.match(obfuscatedCode, functionParameterMatch);
assert.match(obfuscatedCode, functionBodyMatch);
});
});
describe('identifier as right value', () => {
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
readFileAsString(__dirname + '/fixtures/assignment-pattern-as-parameter-2.js'),
{
...NO_CUSTOM_NODES_PRESET
}
);
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
const variableDeclarationMatch: RegExp = /var *(_0x[a-f0-9]{4,6}) *= *0x1;/;
const functionParameterMatch: RegExp = /function *\((_0x[a-f0-9]{4,6}), *(_0x[a-f0-9]{4,6}) *= *(_0x[a-f0-9]{4,6})\) *\{/;
const functionBodyMatch: RegExp = /return *(_0x[a-f0-9]{4,6}) *\+ *(_0x[a-f0-9]{4,6});/;
const variableDeclarationIdentifierName: string = obfuscatedCode.match(variableDeclarationMatch)![1];
const functionParameterIdentifierName: string = obfuscatedCode.match(functionParameterMatch)![1];
const functionDefaultParameterIdentifierName1: string = obfuscatedCode.match(functionParameterMatch)![2];
const functionDefaultParameterIdentifierName2: string = obfuscatedCode.match(functionParameterMatch)![3];
const functionBodyIdentifierName1: string = obfuscatedCode.match(functionBodyMatch)![1];
const functionBodyIdentifierName2: string = obfuscatedCode.match(functionBodyMatch)![2];
it('should transform function parameter assignment pattern identifier', () => {
assert.match(obfuscatedCode, variableDeclarationMatch);
assert.match(obfuscatedCode, functionParameterMatch);
assert.match(obfuscatedCode, functionBodyMatch);
});
it('shouldn\'t keep same names variable declaration identifier and function parameters identifiers', () => {
assert.notEqual(variableDeclarationIdentifierName, functionParameterIdentifierName);
assert.notEqual(variableDeclarationIdentifierName, functionDefaultParameterIdentifierName1);
assert.notEqual(variableDeclarationIdentifierName, functionDefaultParameterIdentifierName2);
});
it('should keep same names for identifier in first function parameter and default value identifier of second function parameter', () => {
assert.equal(functionParameterIdentifierName, functionDefaultParameterIdentifierName2);
});
it('should keep same names for identifiers in function params and function body', () => {
assert.equal(functionParameterIdentifierName, functionBodyIdentifierName1);
assert.equal(functionDefaultParameterIdentifierName1, functionBodyIdentifierName2);
});
});
});
describe('array pattern as parameter', () => {
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
readFileAsString(__dirname + '/fixtures/array-pattern-as-parameter.js'),
{
...NO_CUSTOM_NODES_PRESET
}
);
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
const functionParameterMatch: RegExp = /function *\(\[(_0x[a-f0-9]{4,6}), *(_0x[a-f0-9]{4,6})\]\) *\{/;
const functionBodyMatch: RegExp = /return *(_0x[a-f0-9]{4,6}) *\+ *(_0x[a-f0-9]{4,6});/;
const arrayPatternIdentifierName1: string = obfuscatedCode.match(functionParameterMatch)![1];
const arrayPatternIdentifierName2: string = obfuscatedCode.match(functionParameterMatch)![2];
const functionBodyIdentifierName1: string = obfuscatedCode.match(functionBodyMatch)![1];
const functionBodyIdentifierName2: string = obfuscatedCode.match(functionBodyMatch)![2];
it('should keep same names for identifiers in function parameter array pattern and function body', () => {
assert.equal(arrayPatternIdentifierName1, functionBodyIdentifierName1);
assert.equal(arrayPatternIdentifierName2, functionBodyIdentifierName2);
});
});
});
@@ -0,0 +1,5 @@
(function () {
var test = function ([foo, bar]) {
return foo + bar;
}
})();
@@ -0,0 +1,5 @@
(function () {
var test = function (bar = 1) {
return bar;
}
})();
@@ -0,0 +1,6 @@
(function () {
var foo = 1;
var test = function (foo, bar = foo) {
return foo + bar;
}
})();