Skip to content

Commit

Permalink
Added numbersToExpressions option and NumberToNumericalExpressionTr…
Browse files Browse the repository at this point in the history
…ansformer
  • Loading branch information
sanex3339 committed Jul 12, 2020
1 parent f07452e commit dd8dcac
Show file tree
Hide file tree
Showing 23 changed files with 1,042 additions and 31,771 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
Change Log

v1.6.0
---
* **New option:** `numbersToExpressions` enables numbers conversion to expressions

v1.5.2
---
* Prevented mutation of the name sequences of `mangled` identifier name generators
Expand Down
19 changes: 19 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ Following options are available for the JS Obfuscator:
identifiersPrefix: '',
inputFileName: '',
log: false,
numbersToExpressions: false,
renameGlobals: false,
renameProperties: false,
reservedNames: [],
Expand Down Expand Up @@ -375,6 +376,7 @@ Following options are available for the JS Obfuscator:
--identifiers-dictionary '<list>' (comma separated)
--identifiers-prefix <string>
--log <boolean>
--numbers-to-expressions <boolean>
--rename-globals <boolean>
--rename-properties <boolean>
--reserved-names '<list>' (comma separated)
Expand Down Expand Up @@ -667,6 +669,20 @@ Type: `boolean` Default: `false`

Enables logging of the information to the console.

### `numbersToExpressions`
Type: `boolean` Default: `false`

Enables numbers conversion to expressions

Example:
```ts
// input
const foo = 1234;

// output
const foo=-0xd93+-0x10b4+0x41*0x67+0x84e*0x3+-0xff8;
```

### `renameGlobals`
Type: `boolean` Default: `false`

Expand Down Expand Up @@ -985,6 +1001,7 @@ Performance will 50-100% slower than without obfuscation
disableConsoleOutput: true,
identifierNamesGenerator: 'hexadecimal',
log: false,
numbersToExpressions: true,
renameGlobals: false,
rotateStringArray: true,
selfDefending: true,
Expand Down Expand Up @@ -1016,6 +1033,7 @@ Performance will 30-35% slower than without obfuscation
disableConsoleOutput: true,
identifierNamesGenerator: 'hexadecimal',
log: false,
numbersToExpressions: false,
renameGlobals: false,
rotateStringArray: true,
selfDefending: true,
Expand Down Expand Up @@ -1045,6 +1063,7 @@ Performance will slightly slower than without obfuscation
disableConsoleOutput: true,
identifierNamesGenerator: 'hexadecimal',
log: false,
numbersToExpressions: false,
renameGlobals: false,
rotateStringArray: true,
selfDefending: true,
Expand Down
14 changes: 7 additions & 7 deletions dist/index.browser.js

Large diffs are not rendered by default.

16,234 changes: 1 addition & 16,233 deletions dist/index.cli.js

Large diffs are not rendered by default.

15,461 changes: 1 addition & 15,460 deletions dist/index.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "javascript-obfuscator",
"version": "1.5.2",
"version": "1.6.0",
"description": "JavaScript obfuscator",
"keywords": [
"obfuscator",
Expand Down
1 change: 1 addition & 0 deletions src/JavaScriptObfuscator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
NodeTransformer.MemberExpressionTransformer,
NodeTransformer.MetadataTransformer,
NodeTransformer.MethodDefinitionTransformer,
NodeTransformer.NumberToNumericalExpressionTransformer,
NodeTransformer.ObfuscatingGuardsTransformer,
NodeTransformer.ObjectExpressionKeysTransformer,
NodeTransformer.ObjectExpressionTransformer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,17 @@ import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';

import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';

import { NumberUtils } from '../../utils/NumberUtils';

/**
* Rework of https://gist.github.com/da411d/0e59f79dcf4603cdabf0024a10eeb6fe
* Based on https://gist.github.com/da411d/0e59f79dcf4603cdabf0024a10eeb6fe
*/
@injectable()
export class NumberNumericalExpressionAnalyzer implements INumberNumericalExpressionAnalyzer {
/**
* @type {number}
*/
private static readonly additionalParts: number = 5;
private static readonly additionalParts: number = 3;

/**
* @type {IRandomGenerator}
Expand All @@ -40,6 +42,10 @@ export class NumberNumericalExpressionAnalyzer implements INumberNumericalExpres
throw new Error('Given value is NaN');
}

if (NumberUtils.isUnsafeNumber(number)) {
return [number];
}

const additionParts: number[] = this.generateAdditionParts(number);

return additionParts.map((addition: number) => this.mixWithMultiplyParts(addition));
Expand All @@ -52,23 +58,38 @@ export class NumberNumericalExpressionAnalyzer implements INumberNumericalExpres
private generateAdditionParts (number: number): number[] {
const additionParts = [];

const from: number = Math.min(-10000, -Math.abs(number * 2));
const to: number = Math.max(10000, Math.abs(number * 2));
const upperNumberLimit: number = Math.min(Math.abs(number * 2), Number.MAX_SAFE_INTEGER);

const from: number = Math.min(-10000, -upperNumberLimit);
const to: number = Math.max(10000, upperNumberLimit);

let temporarySum = 0;

for (let i = 0; i < NumberNumericalExpressionAnalyzer.additionalParts; i++) {
if (i < NumberNumericalExpressionAnalyzer.additionalParts - 1) {
// trailing parts

const addition: number = this.randomGenerator.getRandomInteger(from, to);
let addition: number = this.randomGenerator.getRandomInteger(from, to);
const isUnsafeCombination: boolean = NumberUtils.isUnsafeNumber(temporarySum + addition);

// we have to flip sign if total expression sum overflows over safe integer limits
if (isUnsafeCombination) {
addition = -addition;
}

additionParts.push(addition);
temporarySum += addition;
} else {
// last part
const combination: number = number - temporarySum;
const isUnsafeCombination: boolean = NumberUtils.isUnsafeNumber(combination);

additionParts.push(number - temporarySum);
// last part
if (isUnsafeCombination) {
additionParts.push(0 - temporarySum);
additionParts.push(number);
} else {
additionParts.push(combination);
}
}
}

Expand All @@ -80,36 +101,20 @@ export class NumberNumericalExpressionAnalyzer implements INumberNumericalExpres
* @returns {number | number[]}
*/
private mixWithMultiplyParts (number: number): number | number[] {
const dividers: number[] = this.getDividers(number);

const shouldMixWithMultiplyParts: boolean = this.randomGenerator.getMathRandom() > 0.5;

if (!shouldMixWithMultiplyParts || !dividers.length) {
if (!shouldMixWithMultiplyParts) {
return number;
}

const divider = dividers[
this.randomGenerator.getRandomInteger(0, dividers.length - 1)
];

return [divider, number / divider];
}
const factors: number[] = NumberUtils.getFactors(number);

/**
* @param {number} number
* @returns {number[]}
*/
private getDividers (number: number): number[] {
const dividers: number[] = [];

number = Math.abs(number);

for (let i = 2; i < number; i++) {
if (number % i === 0){
dividers.push(i);
}
if (!factors.length) {
return number;
}

return dividers;
const factor: number = factors[this.randomGenerator.getRandomInteger(0, factors.length - 1)];

return [factor, number / factor];
}
}
4 changes: 4 additions & 0 deletions src/cli/JavaScriptObfuscatorCLI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,10 @@ export class JavaScriptObfuscatorCLI implements IInitializable {
'--log <boolean>', 'Enables logging of the information to the console',
BooleanSanitizer
)
.option(
'--numbers-to-expressions <boolean>', 'Enables numbers conversion to expressions',
BooleanSanitizer
)
.option(
'--reserved-names <list> (comma separated, without whitespaces)',
'Disables obfuscation and generation of identifiers, which being matched by passed RegExp patterns (comma separated)',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ import { IObjectExpressionExtractor } from '../../../interfaces/node-transformer
import { NodeTransformer } from '../../../enums/node-transformers/NodeTransformer';
import { ObjectExpressionExtractor } from '../../../enums/node-transformers/converting-transformers/properties-extractors/ObjectExpressionExtractor';

import { BasePropertiesExtractor } from '../../../node-transformers/converting-transformers/object-expression-extractors/BasePropertiesExtractor';
import { ObjectExpressionToVariableDeclarationExtractor } from '../../../node-transformers/converting-transformers/object-expression-extractors/ObjectExpressionToVariableDeclarationExtractor';
import { MemberExpressionTransformer } from '../../../node-transformers/converting-transformers/MemberExpressionTransformer';
import { MethodDefinitionTransformer } from '../../../node-transformers/converting-transformers/MethodDefinitionTransformer';
import { NumberToNumericalExpressionTransformer } from '../../../node-transformers/converting-transformers/NumberToNumericalExpressionTransformer';
import { ObjectExpressionKeysTransformer } from '../../../node-transformers/converting-transformers/ObjectExpressionKeysTransformer';
import { ObjectExpressionTransformer } from '../../../node-transformers/converting-transformers/ObjectExpressionTransformer';
import { SplitStringTransformer } from '../../../node-transformers/converting-transformers/SplitStringTransformer';
import { TemplateLiteralTransformer } from '../../../node-transformers/converting-transformers/TemplateLiteralTransformer';
import { BasePropertiesExtractor } from '../../../node-transformers/converting-transformers/object-expression-extractors/BasePropertiesExtractor';

export const convertingTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => {
// converting transformers
Expand All @@ -27,6 +28,11 @@ export const convertingTransformersModule: interfaces.ContainerModule = new Cont
.to(MethodDefinitionTransformer)
.whenTargetNamed(NodeTransformer.MethodDefinitionTransformer);


bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
.to(NumberToNumericalExpressionTransformer)
.whenTargetNamed(NodeTransformer.NumberToNumericalExpressionTransformer);

bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
.to(ObjectExpressionKeysTransformer)
.whenTargetNamed(NodeTransformer.ObjectExpressionKeysTransformer);
Expand Down
1 change: 1 addition & 0 deletions src/enums/node-transformers/NodeTransformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export enum NodeTransformer {
MemberExpressionTransformer = 'MemberExpressionTransformer',
MetadataTransformer = 'MetadataTransformer',
MethodDefinitionTransformer = 'MethodDefinitionTransformer',
NumberToNumericalExpressionTransformer = 'NumberToNumericalExpressionTransformer',
ObfuscatingGuardsTransformer = 'ObfuscatingGuardsTransformer',
ObjectExpressionKeysTransformer = 'ObjectExpressionKeysTransformer',
ObjectExpressionTransformer = 'ObjectExpressionTransformer',
Expand Down
1 change: 1 addition & 0 deletions src/interfaces/options/IOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export interface IOptions {
readonly identifiersPrefix: string;
readonly inputFileName: string;
readonly log: boolean;
readonly numbersToExpressions: boolean;
readonly renameGlobals: boolean;
readonly renameProperties: boolean;
readonly reservedNames: string[];
Expand Down
Loading

0 comments on commit dd8dcac

Please sign in to comment.