Skip to content

Commit f07452e

Browse files
author
sanex3339
committed
Added number numerical expression analyzer
1 parent 160ff20 commit f07452e

File tree

12 files changed

+31950
-20
lines changed

12 files changed

+31950
-20
lines changed

dist/index.cli.js

Lines changed: 16233 additions & 1 deletion
Large diffs are not rendered by default.

dist/index.js

Lines changed: 15460 additions & 1 deletion
Large diffs are not rendered by default.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
"@types/mkdirp": "1.0.1",
5555
"@types/mocha": "7.0.2",
5656
"@types/multimatch": "4.0.0",
57-
"@types/node": "14.0.20",
57+
"@types/node": "14.0.22",
5858
"@types/rimraf": "3.0.0",
5959
"@types/sinon": "9.0.4",
6060
"@types/string-template": "1.0.2",
@@ -65,7 +65,7 @@
6565
"coveralls": "3.1.0",
6666
"eslint": "7.4.0",
6767
"eslint-plugin-import": "2.22.0",
68-
"eslint-plugin-jsdoc": "29.1.2",
68+
"eslint-plugin-jsdoc": "29.1.3",
6969
"eslint-plugin-no-null": "1.0.2",
7070
"eslint-plugin-prefer-arrow": "1.2.1",
7171
"eslint-plugin-unicorn": "20.1.0",
@@ -83,7 +83,7 @@
8383
"typescript": "3.9.6",
8484
"webpack": "4.43.0",
8585
"webpack-cli": "3.3.12",
86-
"webpack-node-externals": "2.3.0"
86+
"webpack-node-externals": "2.5.0"
8787
},
8888
"repository": {
8989
"type": "git",
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import { injectable, inject } from 'inversify';
2+
3+
import { TNumberNumericalExpressionData } from '../../types/analyzers/number-numerical-expression-analyzer/TNumberNumericalExpressionData';
4+
5+
import { INumberNumericalExpressionAnalyzer } from '../../interfaces/analyzers/number-numerical-expression-analyzer/INumberNumericalExpressionAnalyzer';
6+
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
7+
8+
import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
9+
10+
/**
11+
* Rework of https://gist.github.com/da411d/0e59f79dcf4603cdabf0024a10eeb6fe
12+
*/
13+
@injectable()
14+
export class NumberNumericalExpressionAnalyzer implements INumberNumericalExpressionAnalyzer {
15+
/**
16+
* @type {number}
17+
*/
18+
private static readonly additionalParts: number = 5;
19+
20+
/**
21+
* @type {IRandomGenerator}
22+
*/
23+
private readonly randomGenerator: IRandomGenerator;
24+
25+
/**
26+
* @param {IRandomGenerator} randomGenerator
27+
*/
28+
public constructor (
29+
@inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator
30+
) {
31+
this.randomGenerator = randomGenerator;
32+
}
33+
34+
/**
35+
* @param {number} number
36+
* @returns {TNumberNumericalExpressionData}
37+
*/
38+
public analyze (number: number): TNumberNumericalExpressionData {
39+
if (isNaN(number)) {
40+
throw new Error('Given value is NaN');
41+
}
42+
43+
const additionParts: number[] = this.generateAdditionParts(number);
44+
45+
return additionParts.map((addition: number) => this.mixWithMultiplyParts(addition));
46+
}
47+
48+
/**
49+
* @param {number} number
50+
* @returns {number[]}
51+
*/
52+
private generateAdditionParts (number: number): number[] {
53+
const additionParts = [];
54+
55+
const from: number = Math.min(-10000, -Math.abs(number * 2));
56+
const to: number = Math.max(10000, Math.abs(number * 2));
57+
58+
let temporarySum = 0;
59+
60+
for (let i = 0; i < NumberNumericalExpressionAnalyzer.additionalParts; i++) {
61+
if (i < NumberNumericalExpressionAnalyzer.additionalParts - 1) {
62+
// trailing parts
63+
64+
const addition: number = this.randomGenerator.getRandomInteger(from, to);
65+
66+
additionParts.push(addition);
67+
temporarySum += addition;
68+
} else {
69+
// last part
70+
71+
additionParts.push(number - temporarySum);
72+
}
73+
}
74+
75+
return additionParts;
76+
}
77+
78+
/**
79+
* @param {number} number
80+
* @returns {number | number[]}
81+
*/
82+
private mixWithMultiplyParts (number: number): number | number[] {
83+
const dividers: number[] = this.getDividers(number);
84+
85+
const shouldMixWithMultiplyParts: boolean = this.randomGenerator.getMathRandom() > 0.5;
86+
87+
if (!shouldMixWithMultiplyParts || !dividers.length) {
88+
return number;
89+
}
90+
91+
const divider = dividers[
92+
this.randomGenerator.getRandomInteger(0, dividers.length - 1)
93+
];
94+
95+
return [divider, number / divider];
96+
}
97+
98+
/**
99+
* @param {number} number
100+
* @returns {number[]}
101+
*/
102+
private getDividers (number: number): number[] {
103+
const dividers: number[] = [];
104+
105+
number = Math.abs(number);
106+
107+
for (let i = 2; i < number; i++) {
108+
if (number % i === 0){
109+
dividers.push(i);
110+
}
111+
}
112+
113+
return dividers;
114+
}
115+
}

src/container/ServiceIdentifiers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export enum ServiceIdentifiers {
3737
INodeGuard = 'INodeGuard',
3838
INodeTransformer = 'INodeTransformer',
3939
INodeTransformerNamesGroupsBuilder = 'INodeTransformerNamesGroupsBuilder',
40+
INumberNumericalExpressionAnalyzer = 'INumberNumericalExpressionAnalyzer',
4041
IObfuscationEventEmitter = 'IObfuscationEventEmitter',
4142
IObfuscatedCode = 'IObfuscatedCode',
4243
IOptions = 'IOptions',

src/container/modules/analyzers/AnalyzersModule.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ServiceIdentifiers } from '../../ServiceIdentifiers';
44

55
import { ICalleeDataExtractor } from '../../../interfaces/analyzers/calls-graph-analyzer/ICalleeDataExtractor';
66
import { ICallsGraphAnalyzer } from '../../../interfaces/analyzers/calls-graph-analyzer/ICallsGraphAnalyzer';
7+
import { INumberNumericalExpressionAnalyzer } from '../../../interfaces/analyzers/number-numerical-expression-analyzer/INumberNumericalExpressionAnalyzer';
78
import { IPrevailingKindOfVariablesAnalyzer } from '../../../interfaces/analyzers/calls-graph-analyzer/IPrevailingKindOfVariablesAnalyzer';
89
import { IScopeAnalyzer } from '../../../interfaces/analyzers/scope-analyzer/IScopeAnalyzer';
910
import { IStringArrayStorageAnalyzer } from '../../../interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer';
@@ -12,6 +13,7 @@ import { CalleeDataExtractor } from '../../../enums/analyzers/calls-graph-analyz
1213
import { CallsGraphAnalyzer } from '../../../analyzers/calls-graph-analyzer/CallsGraphAnalyzer';
1314
import { FunctionDeclarationCalleeDataExtractor } from '../../../analyzers/calls-graph-analyzer/callee-data-extractors/FunctionDeclarationCalleeDataExtractor';
1415
import { FunctionExpressionCalleeDataExtractor } from '../../../analyzers/calls-graph-analyzer/callee-data-extractors/FunctionExpressionCalleeDataExtractor';
16+
import { NumberNumericalExpressionAnalyzer } from '../../../analyzers/number-numerical-expression-analyzer/NumberNumericalExpressionAnalyzer';
1517
import { ObjectExpressionCalleeDataExtractor } from '../../../analyzers/calls-graph-analyzer/callee-data-extractors/ObjectExpressionCalleeDataExtractor';
1618
import { PrevailingKindOfVariablesAnalyzer } from '../../../analyzers/prevailing-kind-of-variables-analyzer/PrevailingKindOfVariablesAnalyzer';
1719
import { ScopeAnalyzer } from '../../../analyzers/scope-analyzer/ScopeAnalyzer';
@@ -23,6 +25,11 @@ export const analyzersModule: interfaces.ContainerModule = new ContainerModule((
2325
.to(CallsGraphAnalyzer)
2426
.inSingletonScope();
2527

28+
// number numerical expression analyzer
29+
bind<INumberNumericalExpressionAnalyzer>(ServiceIdentifiers.INumberNumericalExpressionAnalyzer)
30+
.to(NumberNumericalExpressionAnalyzer)
31+
.inSingletonScope();
32+
2633
// prevailing kind of variables analyzer
2734
bind<IPrevailingKindOfVariablesAnalyzer>(ServiceIdentifiers.IPrevailingKindOfVariablesAnalyzer)
2835
.to(PrevailingKindOfVariablesAnalyzer)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { TNumberNumericalExpressionData } from '../../../types/analyzers/number-numerical-expression-analyzer/TNumberNumericalExpressionData';
2+
3+
export interface INumberNumericalExpressionAnalyzer {
4+
/**
5+
* @param {number} number
6+
* @returns {TNumberNumericalExpressionData}
7+
*/
8+
analyze (number: number): TNumberNumericalExpressionData;
9+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export type TNumberNumericalExpressionData = (number | number[])[];

test/dev/dev.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,17 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
88

99
let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
1010
`
11-
function foo (arg1, arg2, arg3) {
12-
console.log(arg1, arg2, arg3);
13-
}
11+
const example1 = 0;
12+
const example2 = 1;
13+
const example3 = 100;
14+
const example4 = 125793;
15+
const example5 = -15232103;
16+
17+
console.log(example1);
18+
console.log(example2);
19+
console.log(example3);
20+
console.log(example4);
21+
console.log(example5);
1422
`,
1523
{
1624
...NO_ADDITIONAL_NODES_PRESET,

test/index.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require('source-map-support').install();
66
* Unit tests
77
*/
88
import './unit-tests/analyzers/calls-graph-analyzer/CallsGraphAnalyzer.spec';
9+
import './unit-tests/analyzers/number-numerical-expression-analyzer/NumberNumericalExpressionAnalyzer.spec';
910
import './unit-tests/analyzers/prevailing-kind-of-variables-analyzer/PrevailingKindOfVariablesAnalyzer.spec';
1011
import './unit-tests/analyzers/scope-analyzer/ScopeAnalyzer.spec';
1112
import './unit-tests/analyzers/string-array-storage-analyzer/StringArrayStorageAnalyzer.spec';

0 commit comments

Comments
 (0)