소스 검색

Merge pull request #954 from javascript-obfuscator/rename-properties-preserve-name

`renameProperties` option now won't generate duplicated property names in some cases
Timofey Kachalov 3 년 전
부모
커밋
8acfac18d7

+ 1 - 0
CHANGELOG.md

@@ -5,6 +5,7 @@ v2.16.0
 * `stringArrayWrappersType: 'function'` now generates different indexes between each wrapper inside the same lexical scope
 * `stringArrayWrappersType: 'function'` now generates different parameters order between each wrapper inside the same lexical scope
 * `stringArrayWrappersType: 'function'` now appends `FunctionDeclaration` functions instead of `FunctionExpression` functions. This allows to append these wrappers at random positions inside each scope
+* `renameProperties` option now won't generate duplicated property names in some cases
 
 v2.15.6
 ---

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/index.browser.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/index.cli.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/index.js


+ 2 - 0
src/node-transformers/rename-properties-transformers/replacer/RenamePropertiesReplacer.ts

@@ -106,6 +106,8 @@ export class RenamePropertiesReplacer implements IRenamePropertiesReplacer {
      */
     private replacePropertyName (propertyName: string): string {
         if (this.isReservedName(propertyName)) {
+            this.identifierNamesGenerator.preserveName(propertyName);
+
             return propertyName;
         }
 

+ 8 - 32
test/dev/dev.ts

@@ -7,43 +7,19 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
 
     let obfuscationResult = JavaScriptObfuscator.obfuscate(
         `
-             function foo () {
-                console.log('foo', 1);             
-                console.log('foo', 2);             
-                console.log('foo', 3);
-                
-                function bar() {
-                    console.log('bar', 1);
-                    console.log('bar', 2);
-                    console.log('bar', 3);
-                    
-                    function baz() {
-                        console.log('baz', 1);
-                        console.log('baz', 2);
-                        console.log('baz', 3);
-                    }
-                    
-                    baz();
-                }             
-                
-                bar();
-             }
-             
-             foo();
+             var object = {
+                b: 'field',
+                bar: 'value'
+             };
         `,
         {
             ...NO_ADDITIONAL_NODES_PRESET,
-            seed: 1,
             compact: false,
             simplify: false,
-            stringArray: true,
-            stringArrayThreshold: 1,
-            stringArrayIndexShift: true,
-            stringArrayWrappersChainedCalls: true,
-            stringArrayWrappersCount: 3,
-            stringArrayWrappersType: 'function',
-            stringArrayWrappersParametersMaxCount: 5,
-            identifierNamesGenerator: 'mangled'
+            renameProperties: true,
+            renamePropertiesMode: 'safe',
+            identifierNamesGenerator: 'mangled',
+            reservedNames: ['^a$']
         }
     );
 

+ 53 - 3
test/functional-tests/node-transformers/rename-properties-transformers/rename-properties-transformer/RenamePropertiesTransformer.spec.ts

@@ -12,7 +12,7 @@ import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFac
 describe('RenamePropertiesTransformer', () => {
     describe('transformNode', () => {
         describe('Mode: `unsafe`', () => {
-            describe('Hexadecimal identifier names generator', () => {
+            describe('Variant #1: Hexadecimal identifier names generator', () => {
                 describe('Variant #1: base properties rename', () => {
                     const property1RegExp: RegExp = /'(_0x[a-f0-9]{4,6})': *0x1/;
                     const property2RegExp: RegExp = /'(_0x[a-f0-9]{4,6})': *0x2/;
@@ -54,7 +54,7 @@ describe('RenamePropertiesTransformer', () => {
                 });
             });
 
-            describe('Mangled identifier names generator', () => {
+            describe('Variant #2: Mangled identifier names generator', () => {
                 describe('Variant #1: base properties mangle', () => {
                     const property1RegExp: RegExp = /'a': *0x1/;
                     const property2RegExp: RegExp = /'b': *0x2/;
@@ -335,7 +335,7 @@ describe('RenamePropertiesTransformer', () => {
                 });
             });
 
-            describe('Ignored literal node type', () => {
+            describe('Variant #3: Ignored literal node type', () => {
                 describe('Variant #1: boolean literal node', () => {
                     const regExp: RegExp = /var obj *= *{}; *obj\[!!\[]] *= *0x1;/;
 
@@ -359,6 +359,31 @@ describe('RenamePropertiesTransformer', () => {
                     });
                 });
             });
+
+            describe('Variant #4: Prevent generation of the property names that are equal to the existing object property names', () => {
+                const regExp: RegExp = /var object *= *{'b': *'field', *'c': *'value'};/;
+
+                let obfuscatedCode: string;
+
+                before(() => {
+                    const code: string = readFileAsString(__dirname + '/fixtures/duplicated-generated-names-1.js');
+
+                    obfuscatedCode = JavaScriptObfuscator.obfuscate(
+                        code,
+                        {
+                            ...NO_ADDITIONAL_NODES_PRESET,
+                            renameProperties: true,
+                            renamePropertiesMode: RenamePropertiesMode.Unsafe,
+                            identifierNamesGenerator: 'mangled',
+                            reservedNames: ['^a$']
+                        }
+                    ).getObfuscatedCode();
+                });
+
+                it('Match #1: should skip literal property with invalid type', () => {
+                    assert.match(obfuscatedCode, regExp);
+                });
+            });
         });
 
         describe('Mode: `safe`', () => {
@@ -406,6 +431,31 @@ describe('RenamePropertiesTransformer', () => {
                     assert.match(obfuscatedCode, referencesRegExp);
                 });
             });
+
+            describe('Variant #2: Prevent generation of the property names that are equal to the existing object property names', () => {
+                const regExp: RegExp = /var object *= *{'b': *'field', *'c': *'value'};/;
+
+                let obfuscatedCode: string;
+
+                before(() => {
+                    const code: string = readFileAsString(__dirname + '/fixtures/duplicated-generated-names-1.js');
+
+                    obfuscatedCode = JavaScriptObfuscator.obfuscate(
+                        code,
+                        {
+                            ...NO_ADDITIONAL_NODES_PRESET,
+                            renameProperties: true,
+                            renamePropertiesMode: RenamePropertiesMode.Safe,
+                            identifierNamesGenerator: 'mangled',
+                            reservedNames: ['^a$']
+                        }
+                    ).getObfuscatedCode();
+                });
+
+                it('Match #1: should skip literal property with invalid type', () => {
+                    assert.match(obfuscatedCode, regExp);
+                });
+            });
         });
 
         describe('Property identifier names from property identifier names cache', () => {

+ 4 - 0
test/functional-tests/node-transformers/rename-properties-transformers/rename-properties-transformer/fixtures/duplicated-generated-names-1.js

@@ -0,0 +1,4 @@
+var object = {
+    b: 'field',
+    bar: 'value'
+};

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.