X Tutup
Skip to content

Commit a295f77

Browse files
committed
ArrayPattern and AssignmentPattern function parameters obfuscation + tests
1 parent b95a248 commit a295f77

File tree

9 files changed

+168
-83
lines changed

9 files changed

+168
-83
lines changed

dist/index.js

Lines changed: 28 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/enums/NodeType.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export const NodeType: any = Utils.strEnumify({
44
ArrayExpression: 'ArrayExpression',
55
ArrowFunctionExpression: 'ArrowFunctionExpression',
66
AssignmentExpression: 'AssignmentExpression',
7+
AssignmentPattern: 'AssignmentPattern',
78
BinaryExpression: 'BinaryExpression',
89
BlockStatement: 'BlockStatement',
910
BreakStatement: 'BreakStatement',
@@ -22,6 +23,7 @@ export const NodeType: any = Utils.strEnumify({
2223
MemberExpression: 'MemberExpression',
2324
MethodDefinition: 'MethodDefinition',
2425
ObjectExpression: 'ObjectExpression',
26+
ObjectPattern: 'ObjectPattern',
2527
Program: 'Program',
2628
Property: 'Property',
2729
ReturnStatement: 'ReturnStatement',

src/node-transformers/obfuscating-transformers/FunctionTransformer.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,23 @@ export class FunctionTransformer extends AbstractNodeTransformer {
6161
private storeFunctionParams (functionNode: ESTree.Function, nodeIdentifier: number): void {
6262
functionNode.params
6363
.forEach((paramsNode: ESTree.Node) => {
64-
if (Node.isIdentifierNode(paramsNode)) {
65-
this.identifierReplacer.storeNames(paramsNode.name, nodeIdentifier);
64+
if (Node.isObjectPatternNode(paramsNode)) {
65+
return estraverse.VisitorOption.Skip;
6666
}
67+
68+
estraverse.traverse(paramsNode, {
69+
enter: (node: ESTree.Node): any => {
70+
if (Node.isAssignmentPatternNode(node) && Node.isIdentifierNode(node.left)) {
71+
this.identifierReplacer.storeNames(node.left.name, nodeIdentifier);
72+
73+
return estraverse.VisitorOption.Skip;
74+
}
75+
76+
if (Node.isIdentifierNode(node)) {
77+
this.identifierReplacer.storeNames(node.name, nodeIdentifier);
78+
}
79+
}
80+
});
6781
});
6882
}
6983

src/node/Node.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ export class Node {
1313
return node.type === NodeType.ArrowFunctionExpression;
1414
}
1515

16+
/**
17+
* @param node
18+
* @returns {boolean}
19+
*/
20+
public static isAssignmentPatternNode (node: ESTree.Node): node is ESTree.AssignmentPattern {
21+
return node.type === NodeType.AssignmentPattern;
22+
}
23+
1624
/**
1725
* @param node
1826
* @returns {boolean}
@@ -122,6 +130,14 @@ export class Node {
122130
return node.type === NodeType.MemberExpression;
123131
}
124132

133+
/**
134+
* @param node
135+
* @returns {boolean}
136+
*/
137+
public static isObjectPatternNode (node: ESTree.Node): node is ESTree.ObjectPattern {
138+
return node.type === NodeType.ObjectPattern;
139+
}
140+
125141
/**
126142
* @param node
127143
* @returns {boolean}

test/dev/dev.ts

Lines changed: 4 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -11,83 +11,10 @@ if (!(<any>global)._babelPolyfill) {
1111
let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
1212
`
1313
(function(){
14-
var result = 1,
15-
term1 = 0,
16-
term2 = 1,
17-
i = 1;
18-
while(i < 10)
19-
{
20-
var test = 10;
21-
result = term1 + term2;
22-
console.log(result);
23-
term1 = term2;
24-
term2 = result;
25-
i++;
26-
}
27-
28-
console.log(test);
29-
30-
var test = function (test) {
31-
console.log(test);
32-
33-
if (true) {
34-
var test = 5
35-
}
36-
37-
return test;
38-
}
39-
40-
console.log(test(1));
41-
42-
function test2 (abc) {
43-
function test1 () {
44-
console.log('inside', abc.item);
45-
}
46-
47-
console.log('тест', abc);
48-
49-
var abc = {};
50-
51-
return abc.item = 15, test1();
52-
};
53-
54-
var regexptest = /version\\/(\\d+)/i;
55-
console.log(regexptest);
56-
57-
test2(22);
58-
console.log(105.4);
59-
console.log(true, false);
60-
61-
var sA = 'shorthand1';
62-
var sB = 'shorthand2';
63-
64-
console.log({sA, sB});
65-
66-
try {
67-
} catch (error) {
68-
console.log(error);
69-
}
70-
71-
function foo () {
72-
return function () {
73-
var sum1 = 10 + 20;
74-
var sum2 = 20 + 30;
75-
var sum3 = 30 + 50;
76-
var sub = sum3 - sum2;
77-
78-
return sum1 + sub;
79-
}
80-
}
81-
82-
console.log(foo()());
83-
84-
if (true) {
85-
console.log(\`1\`);
86-
console.log(\`2\`);
87-
console.log(\`3\`);
88-
console.log(\`4\`);
89-
console.log(\`5\`);
90-
}
14+
var foo = 1;
15+
var test = function (foo, abc = foo) {
16+
return foo, abc;
17+
}
9118
})();
9219
`,
9320
{

test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,90 @@ describe('FunctionTransformer', () => {
5252
assert.match(obfuscatedCode, functionBodyMatch);
5353
});
5454
});
55+
56+
describe('assignment pattern as parameter', () => {
57+
describe('literal as right value', () => {
58+
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
59+
readFileAsString(__dirname + '/fixtures/assignment-pattern-as-parameter-1.js'),
60+
{
61+
...NO_CUSTOM_NODES_PRESET
62+
}
63+
);
64+
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
65+
66+
it('should transform function parameter assignment pattern identifier', () => {
67+
const functionParameterMatch: RegExp = /function *\(_0x[a-f0-9]{4,6} *= *0x1\) *\{/;
68+
const functionBodyMatch: RegExp = /return *_0x[a-f0-9]{4,6};/;
69+
70+
assert.match(obfuscatedCode, functionParameterMatch);
71+
assert.match(obfuscatedCode, functionBodyMatch);
72+
});
73+
});
74+
75+
describe('identifier as right value', () => {
76+
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
77+
readFileAsString(__dirname + '/fixtures/assignment-pattern-as-parameter-2.js'),
78+
{
79+
...NO_CUSTOM_NODES_PRESET
80+
}
81+
);
82+
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
83+
84+
const variableDeclarationMatch: RegExp = /var *(_0x[a-f0-9]{4,6}) *= *0x1;/;
85+
const functionParameterMatch: RegExp = /function *\((_0x[a-f0-9]{4,6}), *(_0x[a-f0-9]{4,6}) *= *(_0x[a-f0-9]{4,6})\) *\{/;
86+
const functionBodyMatch: RegExp = /return *(_0x[a-f0-9]{4,6}) *\+ *(_0x[a-f0-9]{4,6});/;
87+
88+
const variableDeclarationIdentifierName: string = obfuscatedCode.match(variableDeclarationMatch)![1];
89+
const functionParameterIdentifierName: string = obfuscatedCode.match(functionParameterMatch)![1];
90+
const functionDefaultParameterIdentifierName1: string = obfuscatedCode.match(functionParameterMatch)![2];
91+
const functionDefaultParameterIdentifierName2: string = obfuscatedCode.match(functionParameterMatch)![3];
92+
93+
const functionBodyIdentifierName1: string = obfuscatedCode.match(functionBodyMatch)![1];
94+
const functionBodyIdentifierName2: string = obfuscatedCode.match(functionBodyMatch)![2];
95+
96+
it('should transform function parameter assignment pattern identifier', () => {
97+
assert.match(obfuscatedCode, variableDeclarationMatch);
98+
assert.match(obfuscatedCode, functionParameterMatch);
99+
assert.match(obfuscatedCode, functionBodyMatch);
100+
});
101+
102+
it('shouldn\'t keep same names variable declaration identifier and function parameters identifiers', () => {
103+
assert.notEqual(variableDeclarationIdentifierName, functionParameterIdentifierName);
104+
assert.notEqual(variableDeclarationIdentifierName, functionDefaultParameterIdentifierName1);
105+
assert.notEqual(variableDeclarationIdentifierName, functionDefaultParameterIdentifierName2);
106+
});
107+
108+
it('should keep same names for identifier in first function parameter and default value identifier of second function parameter', () => {
109+
assert.equal(functionParameterIdentifierName, functionDefaultParameterIdentifierName2);
110+
});
111+
112+
it('should keep same names for identifiers in function params and function body', () => {
113+
assert.equal(functionParameterIdentifierName, functionBodyIdentifierName1);
114+
assert.equal(functionDefaultParameterIdentifierName1, functionBodyIdentifierName2);
115+
});
116+
});
117+
});
118+
119+
describe('array pattern as parameter', () => {
120+
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
121+
readFileAsString(__dirname + '/fixtures/array-pattern-as-parameter.js'),
122+
{
123+
...NO_CUSTOM_NODES_PRESET
124+
}
125+
);
126+
const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
127+
128+
const functionParameterMatch: RegExp = /function *\(\[(_0x[a-f0-9]{4,6}), *(_0x[a-f0-9]{4,6})\]\) *\{/;
129+
const functionBodyMatch: RegExp = /return *(_0x[a-f0-9]{4,6}) *\+ *(_0x[a-f0-9]{4,6});/;
130+
131+
const arrayPatternIdentifierName1: string = obfuscatedCode.match(functionParameterMatch)![1];
132+
const arrayPatternIdentifierName2: string = obfuscatedCode.match(functionParameterMatch)![2];
133+
const functionBodyIdentifierName1: string = obfuscatedCode.match(functionBodyMatch)![1];
134+
const functionBodyIdentifierName2: string = obfuscatedCode.match(functionBodyMatch)![2];
135+
136+
it('should keep same names for identifiers in function parameter array pattern and function body', () => {
137+
assert.equal(arrayPatternIdentifierName1, functionBodyIdentifierName1);
138+
assert.equal(arrayPatternIdentifierName2, functionBodyIdentifierName2);
139+
});
140+
});
55141
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
(function () {
2+
var test = function ([foo, bar]) {
3+
return foo + bar;
4+
}
5+
})();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
(function () {
2+
var test = function (bar = 1) {
3+
return bar;
4+
}
5+
})();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
(function () {
2+
var foo = 1;
3+
var test = function (foo, bar = foo) {
4+
return foo + bar;
5+
}
6+
})();

0 commit comments

Comments
 (0)
X Tutup