From 34a60f386685008aaec55b46d5b030541dc553fe Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Thu, 4 Jan 2018 19:40:36 +0300 Subject: [PATCH] Added few tests for object keys transformer --- CHANGELOG.md | 1 + src/node/NodeAppender.ts | 10 +- .../ObjectExpressionKeysTransformer.spec.ts | 227 ++++++++++++++++++ .../fixtures/nested-objects.js | 10 + .../fixtures/placement-inside-catch-clause.js | 8 + .../fixtures/placement-inside-if-statement.js | 7 + .../fixtures/placement-inside-switch-case.js | 8 + .../placement-inside-try-statement.js | 7 + .../fixtures/simple.js | 6 + ...able-declaration-without-initialization.js | 7 + test/index.spec.ts | 1 + 11 files changed, 287 insertions(+), 5 deletions(-) create mode 100644 test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts create mode 100644 test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/nested-objects.js create mode 100644 test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-catch-clause.js create mode 100644 test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-if-statement.js create mode 100644 test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-switch-case.js create mode 100644 test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-try-statement.js create mode 100644 test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/simple.js create mode 100644 test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/variable-declaration-without-initialization.js diff --git a/CHANGELOG.md b/CHANGELOG.md index c9a9c3d2..e4b46b5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === v0.14.0 --- +* **New option:** `transformObjectKeys` enables object keys transformation and obfuscation. * **Breaking change:** Now CLI obfuscating directory recursively. Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/157 * Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/156 * Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/159 diff --git a/src/node/NodeAppender.ts b/src/node/NodeAppender.ts index 6a681230..65c05f00 100644 --- a/src/node/NodeAppender.ts +++ b/src/node/NodeAppender.ts @@ -24,21 +24,21 @@ import { IStackTraceData } from '../interfaces/analyzers/stack-trace-analyzer/IS */ export class NodeAppender { /** - * @param {TNodeWithBlockScope} scopeNode + * @param {TNodeWithBlockScope} blockScopeNode * @param {TStatement[]} nodeBodyStatements */ public static appendNode ( - scopeNode: TNodeWithBlockScope, + blockScopeNode: TNodeWithBlockScope, nodeBodyStatements: TStatement[] ): void { if (!NodeAppender.validateBodyStatements(nodeBodyStatements)) { nodeBodyStatements = []; } - nodeBodyStatements = NodeAppender.parentizeBodyStatementsBeforeAppend(scopeNode, nodeBodyStatements); + nodeBodyStatements = NodeAppender.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); - scopeNode.body = [ - ...scopeNode.body, + blockScopeNode.body = [ + ...blockScopeNode.body, ...nodeBodyStatements ]; } diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts new file mode 100644 index 00000000..d241a4aa --- /dev/null +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec.ts @@ -0,0 +1,227 @@ +import { assert } from 'chai'; + +import { IObfuscationResult } from '../../../../../src/interfaces/IObfuscationResult'; + +import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/NoCustomNodes'; + +import { readFileAsString } from '../../../../helpers/readFileAsString'; + +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; + +describe('ObjectExpressionKeysTransformer', () => { + const variableMatch: string = '_0x([a-f0-9]){4,6}'; + + describe('transformation of object keys', () => { + describe('variant #1: simple', () => { + const match: string = `` + + `var *${variableMatch} *= *{};` + + `${variableMatch}\\['foo'] *= *'bar';` + + `${variableMatch}\\['baz'] *= *'bark';` + + ``; + const regExp: RegExp = new RegExp(match); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/simple.js'); + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + transformObjectKeys: true + } + ); + + obfuscatedCode = obfuscationResult.getObfuscatedCode(); + }); + + it('should correctly transform object keys', () => { + assert.match(obfuscatedCode, regExp); + }); + }); + + describe('variant #2: nested objects', () => { + const match: string = `` + + `var *${variableMatch} *= *{};` + + `${variableMatch}\\['foo'] *= *'bar';` + + `${variableMatch}\\['inner'] *= *{};` + + `${variableMatch}\\['inner']\\['inner1'] *= *{};` + + `${variableMatch}\\['inner']\\['inner1']\\['baz'] *= *'bark';` + + ``; + const regExp: RegExp = new RegExp(match); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/nested-objects.js'); + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + transformObjectKeys: true + } + ); + + obfuscatedCode = obfuscationResult.getObfuscatedCode(); + }); + + it('should correctly transform object keys', () => { + assert.match(obfuscatedCode, regExp); + }); + }); + }); + + describe('correct placement of expression statements', () => { + describe('variant #1: if statement', () => { + const match: string = `` + + `if *\\(!!\\[]\\) *{` + + `var *${variableMatch} *= *{};` + + `${variableMatch}\\['foo'] *= *'bar';` + + `}` + + ``; + const regExp: RegExp = new RegExp(match); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/placement-inside-if-statement.js'); + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + transformObjectKeys: true + } + ); + + obfuscatedCode = obfuscationResult.getObfuscatedCode(); + }); + + it('should correctly transform object keys', () => { + assert.match(obfuscatedCode, regExp); + }); + }); + + describe('variant #2: try statement', () => { + const match: string = `` + + `try *{` + + `var *${variableMatch} *= *{};` + + `${variableMatch}\\['foo'] *= *'bar';` + + `} *catch *\\(${variableMatch}\\) *{` + + `}` + + ``; + const regExp: RegExp = new RegExp(match); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/placement-inside-try-statement.js'); + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + transformObjectKeys: true + } + ); + + obfuscatedCode = obfuscationResult.getObfuscatedCode(); + }); + + it('should correctly transform object keys', () => { + assert.match(obfuscatedCode, regExp); + }); + }); + + describe('variant #3: catch clause statement', () => { + const match: string = `` + + `try *{` + + `} *catch *\\(${variableMatch}\\) *{` + + `var *${variableMatch} *= *{};` + + `${variableMatch}\\['foo'] *= *'bar';` + + `}` + + ``; + const regExp: RegExp = new RegExp(match); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/placement-inside-catch-clause.js'); + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + transformObjectKeys: true + } + ); + + obfuscatedCode = obfuscationResult.getObfuscatedCode(); + }); + + it('should correctly transform object keys', () => { + assert.match(obfuscatedCode, regExp); + }); + }); + }); + + describe('Ignore transformation', () => { + describe('variant #1: switch catch statement', () => { + const match: string = `` + + `switch *\\(!!\\[]\\) *{` + + `case *!!\\[]:` + + `var *${variableMatch} *= *{` + + `'foo': *'bar'` + + `};` + + `}` + + ``; + const regExp: RegExp = new RegExp(match); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/placement-inside-switch-case.js'); + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + transformObjectKeys: true + } + ); + + obfuscatedCode = obfuscationResult.getObfuscatedCode(); + }); + + it('shouldn\'t transform object keys', () => { + assert.match(obfuscatedCode, regExp); + }); + }); + + describe('variant #2: variable declaration without initialization', () => { + const match: string = `` + + `var *${variableMatch};` + + `${variableMatch} *= *{` + + `'foo': *'bar',` + + `'baz': *'bark'` + + `}` + + ``; + const regExp: RegExp = new RegExp(match); + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/variable-declaration-without-initialization.js'); + const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + transformObjectKeys: true + } + ); + + obfuscatedCode = obfuscationResult.getObfuscatedCode(); + }); + + it('shouldn\'t transform object keys', () => { + assert.match(obfuscatedCode, regExp); + }); + }); + }); +}); diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/nested-objects.js b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/nested-objects.js new file mode 100644 index 00000000..fbff3baa --- /dev/null +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/nested-objects.js @@ -0,0 +1,10 @@ +(function(){ + var object = { + foo: 'bar', + inner: { + inner1: { + baz: 'bark' + } + } + }; +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-catch-clause.js b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-catch-clause.js new file mode 100644 index 00000000..095ae1f2 --- /dev/null +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-catch-clause.js @@ -0,0 +1,8 @@ +(function(){ + try { + } catch (e) { + var object = { + foo: 'bar' + }; + } +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-if-statement.js b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-if-statement.js new file mode 100644 index 00000000..7ca7c9bf --- /dev/null +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-if-statement.js @@ -0,0 +1,7 @@ +(function(){ + if (true) { + var object = { + foo: 'bar' + }; + } +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-switch-case.js b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-switch-case.js new file mode 100644 index 00000000..1a8345c8 --- /dev/null +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-switch-case.js @@ -0,0 +1,8 @@ +(function(){ + switch (true) { + case true: + var object = { + foo: 'bar' + }; + } +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-try-statement.js b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-try-statement.js new file mode 100644 index 00000000..deb30782 --- /dev/null +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/placement-inside-try-statement.js @@ -0,0 +1,7 @@ +(function(){ + try { + var object = { + foo: 'bar' + }; + } catch (e) {} +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/simple.js b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/simple.js new file mode 100644 index 00000000..1e939b42 --- /dev/null +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/simple.js @@ -0,0 +1,6 @@ +(function(){ + var object = { + foo: 'bar', + baz: 'bark' + }; +})(); \ No newline at end of file diff --git a/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/variable-declaration-without-initialization.js b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/variable-declaration-without-initialization.js new file mode 100644 index 00000000..515c6f5b --- /dev/null +++ b/test/functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/fixtures/variable-declaration-without-initialization.js @@ -0,0 +1,7 @@ +(function(){ + var object; + object = { + foo: 'bar', + baz: 'bark' + }; +})(); \ No newline at end of file diff --git a/test/index.spec.ts b/test/index.spec.ts index e21fcc74..8039d064 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -52,6 +52,7 @@ import './functional-tests/node-transformers/control-flow-transformers/control-f import './functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec'; import './functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec'; import './functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.spec'; +import './functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec'; import './functional-tests/node-transformers/converting-transformers/template-literal-transformer/TemplateLiteralTransformer.spec'; import './functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec'; import './functional-tests/node-transformers/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec';