mirror of
https://github.com/javascript-obfuscator/javascript-obfuscator
synced 2026-08-09 12:42:29 +00:00
Added few tests for object keys transformer
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
];
|
||||
}
|
||||
|
||||
+227
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
(function(){
|
||||
var object = {
|
||||
foo: 'bar',
|
||||
inner: {
|
||||
inner1: {
|
||||
baz: 'bark'
|
||||
}
|
||||
}
|
||||
};
|
||||
})();
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
(function(){
|
||||
try {
|
||||
} catch (e) {
|
||||
var object = {
|
||||
foo: 'bar'
|
||||
};
|
||||
}
|
||||
})();
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
(function(){
|
||||
if (true) {
|
||||
var object = {
|
||||
foo: 'bar'
|
||||
};
|
||||
}
|
||||
})();
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
(function(){
|
||||
switch (true) {
|
||||
case true:
|
||||
var object = {
|
||||
foo: 'bar'
|
||||
};
|
||||
}
|
||||
})();
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
(function(){
|
||||
try {
|
||||
var object = {
|
||||
foo: 'bar'
|
||||
};
|
||||
} catch (e) {}
|
||||
})();
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
(function(){
|
||||
var object = {
|
||||
foo: 'bar',
|
||||
baz: 'bark'
|
||||
};
|
||||
})();
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
(function(){
|
||||
var object;
|
||||
object = {
|
||||
foo: 'bar',
|
||||
baz: 'bark'
|
||||
};
|
||||
})();
|
||||
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user