String array now stored as a function

This commit is contained in:
sanex
2021-07-31 15:04:11 +03:00
parent 7920538a51
commit 9da81caf3d
13 changed files with 78 additions and 50 deletions
@@ -25,7 +25,6 @@ export class StringArrayCallsWrapperBase64CodeHelper extends StringArrayCallsWra
atobPolyfill,
atobFunctionName,
selfDefendingCode,
stringArrayName: this.stringArrayName,
stringArrayCallsWrapperName: this.stringArrayCallsWrapperName,
stringArrayCacheName: this.stringArrayCacheName
}
@@ -30,13 +30,13 @@ export class StringArrayCallsWrapperCodeHelper extends AbstractCustomCodeHelper
* @type {string}
*/
@initializable()
protected stringArrayName!: string;
protected stringArrayCallsWrapperName!: string;
/**
* @type {string}
*/
@initializable()
protected stringArrayCallsWrapperName!: string;
protected stringArrayFunctionName!: string;
/**
* @type {string}
@@ -78,16 +78,16 @@ export class StringArrayCallsWrapperCodeHelper extends AbstractCustomCodeHelper
}
/**
* @param {string} stringArrayName
* @param {string} stringArrayFunctionName
* @param {string} stringArrayCallsWrapperName
* @param {number} indexShiftAmount
*/
public initialize (
stringArrayName: string,
stringArrayFunctionName: string,
stringArrayCallsWrapperName: string,
indexShiftAmount: number
): void {
this.stringArrayName = stringArrayName;
this.stringArrayFunctionName = stringArrayFunctionName;
this.stringArrayCallsWrapperName = stringArrayCallsWrapperName;
this.indexShiftAmount = indexShiftAmount;
@@ -108,14 +108,14 @@ export class StringArrayCallsWrapperCodeHelper extends AbstractCustomCodeHelper
protected override getCodeHelperTemplate (): string {
const decodeCodeHelperTemplate: string = this.getDecodeStringArrayTemplate();
const preservedNames: string[] = [`^${this.stringArrayName}$`];
const preservedNames: string[] = [`^${this.stringArrayFunctionName}$`];
return this.customCodeHelperObfuscator.obfuscateTemplate(
this.customCodeHelperFormatter.formatTemplate(StringArrayCallsWrapperTemplate(), {
decodeCodeHelperTemplate,
stringArrayCallsWrapperName: this.stringArrayCallsWrapperName,
stringArrayName: this.stringArrayName,
stringArrayCacheName: this.stringArrayCacheName,
stringArrayFunctionName: this.stringArrayFunctionName,
indexShiftAmount: this.indexShiftAmount
}),
{
@@ -145,8 +145,7 @@ export class StringArrayCallsWrapperCodeHelper extends AbstractCustomCodeHelper
this.escapeSequenceEncoder
),
{
stringArrayCallsWrapperName: this.stringArrayCallsWrapperName,
stringArrayName: this.stringArrayName
stringArrayCallsWrapperName: this.stringArrayCallsWrapperName
}
);
}
@@ -32,7 +32,6 @@ export class StringArrayCallsWrapperRc4CodeHelper extends StringArrayCallsWrappe
rc4FunctionName,
rc4Polyfill,
selfDefendingCode,
stringArrayName: this.stringArrayName,
stringArrayCallsWrapperName: this.stringArrayCallsWrapperName,
stringArrayCacheName: this.stringArrayCacheName
}
@@ -31,7 +31,7 @@ export class StringArrayCodeHelper extends AbstractCustomCodeHelper {
* @type {string}
*/
@initializable()
private stringArrayName!: string;
private stringArrayFunctionName!: string;
/**
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
@@ -59,14 +59,14 @@ export class StringArrayCodeHelper extends AbstractCustomCodeHelper {
/**
* @param {IStringArrayStorage} stringArrayStorage
* @param {string} stringArrayName
* @param {string} stringArrayFunctionName
*/
public initialize (
stringArrayStorage: IStringArrayStorage,
stringArrayName: string
stringArrayFunctionName: string
): void {
this.stringArrayStorage = stringArrayStorage;
this.stringArrayName = stringArrayName;
this.stringArrayFunctionName = stringArrayFunctionName;
}
/**
@@ -81,8 +81,11 @@ export class StringArrayCodeHelper extends AbstractCustomCodeHelper {
* @returns {string}
*/
protected override getCodeHelperTemplate (): string {
const stringArrayName: string = this.identifierNamesGenerator.generateNext();
return this.customCodeHelperFormatter.formatTemplate(StringArrayTemplate(), {
stringArrayName: this.stringArrayName,
stringArrayFunctionName: this.stringArrayFunctionName,
stringArrayName: stringArrayName,
stringArrayStorageItems: this.getEncodedStringArrayStorageItems()
});
}
@@ -35,7 +35,7 @@ export class StringArrayRotateFunctionCodeHelper extends AbstractCustomCodeHelpe
* @type {string}
*/
@initializable()
private stringArrayName!: string;
private stringArrayFunctionName!: string;
/**
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
@@ -62,16 +62,16 @@ export class StringArrayRotateFunctionCodeHelper extends AbstractCustomCodeHelpe
}
/**
* @param {string} stringArrayName
* @param {string} stringArrayFunctionName
* @param {number} comparisonValue
* @param {Expression} comparisonExpressionNode
*/
public initialize (
stringArrayName: string,
stringArrayFunctionName: string,
comparisonValue: number,
comparisonExpressionNode: Expression
): void {
this.stringArrayName = stringArrayName;
this.stringArrayFunctionName = stringArrayFunctionName;
this.comparisonValue = comparisonValue;
this.comparisonExpressionNode = comparisonExpressionNode;
}
@@ -95,7 +95,7 @@ export class StringArrayRotateFunctionCodeHelper extends AbstractCustomCodeHelpe
{
comparisonExpressionCode,
comparisonValue: this.comparisonValue,
stringArrayName: this.stringArrayName
stringArrayFunctionName: this.stringArrayFunctionName
}
);
}
@@ -5,6 +5,7 @@ import { TCustomCodeHelperFactory } from '../../../types/container/custom-code-h
import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory';
import { TInitialData } from '../../../types/TInitialData';
import { TNodeWithStatements } from '../../../types/node/TNodeWithStatements';
import { TStatement } from '../../../types/node/TStatement';
import { TStringArrayEncoding } from '../../../types/options/TStringArrayEncoding';
import { ICallsGraphData } from '../../../interfaces/analyzers/calls-graph-analyzer/ICallsGraphData';
@@ -22,7 +23,6 @@ import { AbstractCustomCodeHelperGroup } from '../../AbstractCustomCodeHelperGro
import { NodeAppender } from '../../../node/NodeAppender';
import { StringArrayCallsWrapperCodeHelper } from '../StringArrayCallsWrapperCodeHelper';
import { StringArrayCodeHelper } from '../StringArrayCodeHelper';
import { TStatement } from '../../../types/node/TStatement';
@injectable()
export class StringArrayCodeHelperGroup extends AbstractCustomCodeHelperGroup {
@@ -82,31 +82,31 @@ export class StringArrayCodeHelperGroup extends AbstractCustomCodeHelperGroup {
}
// stringArray helper nodes append
const scopeStatements: TStatement[] = NodeAppender.getScopeStatements(nodeWithStatements);
this.appendCustomNodeIfExist(
CustomCodeHelper.StringArray,
(customCodeHelper: ICustomCodeHelper<TInitialData<StringArrayCodeHelper>>) => {
NodeAppender.prepend(nodeWithStatements, customCodeHelper.getNode());
NodeAppender.insertAtIndex(
nodeWithStatements,
customCodeHelper.getNode(),
this.getScopeStatementRandomIndex(scopeStatements)
);
}
);
// stringArrayCallsWrapper helper nodes append
const stringArrayEncodingsLength: number = this.options.stringArrayEncoding.length;
// Stating from index 1 and forward. 0 index is reserved for string array itself.
let randomIndex: number = 1;
for (let i = 0; i < stringArrayEncodingsLength; i++, randomIndex++) {
const stringArrayEncoding: TStringArrayEncoding = this.options.stringArrayEncoding[i];
for (const stringArrayEncoding of this.options.stringArrayEncoding) {
const stringArrayCallsWrapperCodeHelperName: CustomCodeHelper = this.getStringArrayCallsWrapperCodeHelperName(stringArrayEncoding);
const scopeStatements: TStatement[] = NodeAppender.getScopeStatements(nodeWithStatements);
randomIndex = this.randomGenerator.getRandomInteger(
randomIndex,
scopeStatements.length - 1
);
this.appendCustomNodeIfExist(
stringArrayCallsWrapperCodeHelperName,
(customCodeHelper: ICustomCodeHelper<TInitialData<StringArrayCallsWrapperCodeHelper>>) => {
NodeAppender.insertAtIndex(nodeWithStatements, customCodeHelper.getNode(), randomIndex);
NodeAppender.insertAtIndex(
nodeWithStatements,
customCodeHelper.getNode(),
this.getScopeStatementRandomIndex(scopeStatements)
);
}
);
}
@@ -122,9 +122,9 @@ export class StringArrayCodeHelperGroup extends AbstractCustomCodeHelperGroup {
// stringArray helper initialize
const stringArrayCodeHelper: ICustomCodeHelper<TInitialData<StringArrayCodeHelper>> =
this.customCodeHelperFactory(CustomCodeHelper.StringArray);
const stringArrayName: string = this.stringArrayStorage.getStorageName();
const stringArrayFunctionName: string = this.stringArrayStorage.getStorageName();
stringArrayCodeHelper.initialize(this.stringArrayStorage, stringArrayName);
stringArrayCodeHelper.initialize(this.stringArrayStorage, stringArrayFunctionName);
this.customCodeHelpers.set(CustomCodeHelper.StringArray, stringArrayCodeHelper);
// stringArrayCallsWrapper helper initialize
@@ -134,7 +134,7 @@ export class StringArrayCodeHelperGroup extends AbstractCustomCodeHelperGroup {
this.customCodeHelperFactory(stringArrayCallsWrapperCodeHelperName);
const stringArrayCallsWrapperName: string = this.stringArrayStorage.getStorageCallsWrapperName(stringArrayEncoding);
stringArrayCallsWrapperCodeHelper.initialize(
stringArrayName,
stringArrayFunctionName,
stringArrayCallsWrapperName,
this.stringArrayStorage.getIndexShiftAmount()
);
@@ -152,4 +152,15 @@ export class StringArrayCodeHelperGroup extends AbstractCustomCodeHelperGroup {
.stringArrayCallsWrapperCodeHelperMap.get(stringArrayEncoding)
?? CustomCodeHelper.StringArrayCallsWrapper;
}
/**
* @param {TStatement[]} scopeStatements
* @returns {number}
*/
private getScopeStatementRandomIndex (scopeStatements: TStatement[]): number {
return this.randomGenerator.getRandomInteger(
0,
Math.max(0, scopeStatements.length - 1)
);
}
}
@@ -22,7 +22,7 @@ export function StringArrayBase64DecodeTemplate (
{stringArrayCallsWrapperName}.${initializedIdentifier} = true;
}
const firstValue = {stringArrayName}[0];
const firstValue = stringArray[0];
const cacheKey = index + firstValue;
const cachedValue = {stringArrayCacheName}[cacheKey];
@@ -7,10 +7,12 @@
export function StringArrayCallsWrapperTemplate (): string {
return `
function {stringArrayCallsWrapperName} ({stringArrayCacheName}, key) {
const stringArray = {stringArrayFunctionName}();
{stringArrayCallsWrapperName} = function (index, key) {
index = index - {indexShiftAmount};
let value = {stringArrayName}[index];
let value = stringArray[index];
{decodeCodeHelperTemplate}
@@ -24,7 +24,7 @@ export function StringArrayRC4DecodeTemplate (
{stringArrayCallsWrapperName}.${initializedIdentifier} = true;
}
const firstValue = {stringArrayName}[0];
const firstValue = stringArray[0];
const cacheKey = index + firstValue;
const cachedValue = {stringArrayCacheName}[cacheKey];
@@ -3,7 +3,9 @@
*/
export function StringArrayRotateFunctionTemplate (): string {
return `
(function (array, comparisonValue) {
(function (stringArrayFunction, comparisonValue) {
const stringArray = stringArrayFunction();
while (true) {
try {
const expression = {comparisonExpressionCode};
@@ -11,12 +13,12 @@ export function StringArrayRotateFunctionTemplate (): string {
if (expression === comparisonValue) {
break;
} else {
array['push'](array['shift']());
stringArray['push'](stringArray['shift']());
}
} catch (e) {
array['push'](array['shift']());
stringArray['push'](stringArray['shift']());
}
}
})({stringArrayName}, {comparisonValue});
})({stringArrayFunctionName}, {comparisonValue});
`;
}
@@ -3,6 +3,14 @@
*/
export function StringArrayTemplate (): string {
return `
const {stringArrayName} = [{stringArrayStorageItems}];
function {stringArrayFunctionName} () {
const {stringArrayName} = [{stringArrayStorageItems}];
{stringArrayFunctionName} = function () {
return {stringArrayName};
};
return {stringArrayFunctionName}();
}
`;
}
@@ -52,7 +52,7 @@ export class StringArrayStorage extends MapStorage <`${string}-${TStringArrayEnc
/**
* @type {number}
*/
private static readonly stringArrayNameLength: number = 4;
private static readonly stringArrayFunctionNameLength: number = 4;
/**
* @type {IArrayUtils}
@@ -181,7 +181,7 @@ export class StringArrayStorage extends MapStorage <`${string}-${TStringArrayEnc
public override getStorageId (): string {
if (!this.stringArrayStorageName) {
this.stringArrayStorageName = this.identifierNamesGenerator
.generateForGlobalScope(StringArrayStorage.stringArrayNameLength);
.generateForGlobalScope(StringArrayStorage.stringArrayFunctionNameLength);
}
return this.stringArrayStorageName;
@@ -200,7 +200,7 @@ export class StringArrayStorage extends MapStorage <`${string}-${TStringArrayEnc
}
const newStorageCallsWrapperName: string = this.identifierNamesGenerator
.generateForGlobalScope(StringArrayStorage.stringArrayNameLength);
.generateForGlobalScope(StringArrayStorage.stringArrayFunctionNameLength);
this.stringArrayStorageCallsWrapperNamesMap.set(
stringArrayEncoding,
+6 -1
View File
@@ -30,9 +30,14 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
`,
{
...NO_ADDITIONAL_NODES_PRESET,
compact: false,
simplify: false,
stringArray: true,
stringArrayThreshold: 1,
selfDefending: true
stringArrayEncoding: ['rc4', 'base64'],
stringArrayWrappersCount: 5,
rotateStringArray: true,
identifierNamesGenerator: 'mangled'
}
).getObfuscatedCode();