luau-obfuscator 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/release.yml +56 -56
- package/dist/index.cjs +2186 -95
- package/dist/index.d.cts +34 -2
- package/dist/index.d.ts +34 -2
- package/dist/index.js +2186 -95
- package/generated/grammers.luau +13643 -0
- package/generated/tests.luau +5567 -0
- package/package.json +2 -2
- package/scripts/test.js +24 -8
- package/{scripts/example.luau → smoketest/grammers.luau} +1174 -1174
- package/smoketest/tests.luau +115 -0
- package/src/config.ts +2 -1
- package/src/passes/ConstantArray.ts +90 -89
- package/src/passes/EncryptNumbers.ts +122 -65
- package/src/passes/EncryptStrings.ts +162 -82
- package/src/passes/GlobalMapping.ts +193 -193
- package/src/passes/InsertJunk.ts +184 -184
- package/src/passes/Minify.ts +5 -5
- package/src/passes/NumbersToExpressions.ts +183 -2
- package/src/passes/RenameVariables.ts +2 -9
- package/src/passes/StringsToExpressions.ts +195 -6
- package/src/passes/StripTypes.ts +191 -191
- package/src/passes/Vmify.ts +87 -0
- package/src/passes/WrapInFunction.ts +31 -31
- package/src/passes/nodeFactory.ts +36 -1
- package/src/passes/vmify/chunk.ts +54 -0
- package/src/passes/vmify/compiler.ts +1026 -0
- package/src/passes/vmify/names.ts +72 -0
- package/src/passes/vmify/opcodes.ts +80 -0
- package/src/passes/vmify/registers.ts +63 -0
- package/src/passes/vmify/runtime.ts +334 -0
- package/src/passes/vmify/scope-walk.ts +175 -0
- package/src/passes/vmify/serialize.ts +68 -0
- package/src/passes/walk.ts +141 -43
- package/src/pipeline.ts +5 -6
- package/tsconfig.json +20 -20
- package/tsup.config.ts +9 -9
- package/generated/final.luau +0 -1029
package/dist/index.d.cts
CHANGED
|
@@ -5,6 +5,13 @@ interface StringsToExpressionsOptions {
|
|
|
5
5
|
min: number;
|
|
6
6
|
/** 청크 하나에 들어가는 바이트 개수 최대값 */
|
|
7
7
|
max: number;
|
|
8
|
+
/**
|
|
9
|
+
* 0~1. 청크를 소스 순서 그대로 이어붙이는 대신, 순서를 섞어 저장해두고
|
|
10
|
+
* for 루프나 재귀 함수로 원래 순서를 되짚어가며 런타임에 조립할 확률.
|
|
11
|
+
* 소스에 보이는 조각 순서와 실제 결합 순서가 달라지므로, 단순 텍스트 상의
|
|
12
|
+
* concat 체인 스캔만으로는 원문을 복원할 수 없다. 기본값 0.6.
|
|
13
|
+
*/
|
|
14
|
+
controlFlowProbability?: number;
|
|
8
15
|
}
|
|
9
16
|
|
|
10
17
|
interface NumbersToExpressionsOptions {
|
|
@@ -12,10 +19,18 @@ interface NumbersToExpressionsOptions {
|
|
|
12
19
|
min: number;
|
|
13
20
|
/** 랜덤 보조항의 최대 절댓값 */
|
|
14
21
|
max: number;
|
|
22
|
+
/**
|
|
23
|
+
* 0~1. 정수 리터럴을 순수 산술식(depth 얕은 a+b 형태) 대신
|
|
24
|
+
* for/while 루프나 재귀 함수 호출로 "런타임에 조립"할 확률.
|
|
25
|
+
* 단순 트리 순회형 상수 접기(constant folding)는 문(statement)/제어흐름을
|
|
26
|
+
* 해석하지 못하므로 이 경로로 만든 값은 그런 도구로는 복원되지 않는다.
|
|
27
|
+
* 기본값 0.35.
|
|
28
|
+
*/
|
|
29
|
+
controlFlowProbability?: number;
|
|
15
30
|
}
|
|
16
31
|
|
|
17
32
|
interface RenameVariablesOptions {
|
|
18
|
-
random
|
|
33
|
+
random: () => string;
|
|
19
34
|
}
|
|
20
35
|
|
|
21
36
|
interface GlobalMappingOptions {
|
|
@@ -30,13 +45,30 @@ interface EncryptStringsOptions {
|
|
|
30
45
|
interface EncryptNumbersOptions {
|
|
31
46
|
}
|
|
32
47
|
|
|
48
|
+
interface VmifyOptions {
|
|
49
|
+
/**
|
|
50
|
+
* VM 밖에서 값을 그대로 참조해야 하는 전역 이름 목록(GETGLOBAL/SETGLOBAL 대상).
|
|
51
|
+
* Luau엔 getfenv가 없어서 "임의의 전역 읽기"를 흉내낼 수 없기 때문에,
|
|
52
|
+
* 여기 나열된 이름들만 브리지 테이블에 실제 값으로 미리 채워 넣는다.
|
|
53
|
+
* 나열되지 않은 전역을 참조하면 컴파일은 되지만 런타임에 nil이 나온다 — 실사용 전
|
|
54
|
+
* 반드시 프로그램에서 실제로 쓰는 전역 이름을 전부 이 목록에 채워야 함(TODO: 컴파일러가
|
|
55
|
+
* ScopeAnalysis.globalsByName을 이용해 자동으로 목록을 뽑아주도록 개선 가능).
|
|
56
|
+
*/
|
|
57
|
+
builtinGlobals?: readonly string[];
|
|
58
|
+
/**
|
|
59
|
+
* opcode 번호 셔플 + 전역/필드 이름 무작위화에 쓸 난수 생성기. 지정하지 않으면
|
|
60
|
+
* Math.random. 재현 가능한 빌드가 필요하면(테스트 등) 시드 고정 PRNG를 넘길 것.
|
|
61
|
+
*/
|
|
62
|
+
random?: () => number;
|
|
63
|
+
}
|
|
64
|
+
|
|
33
65
|
type ObfuscateConfigEach<C> = ({
|
|
34
66
|
active: true;
|
|
35
67
|
} & C) | {
|
|
36
68
|
active: false;
|
|
37
69
|
};
|
|
38
70
|
type ObfuscateConfig = {
|
|
39
|
-
Vmify: ObfuscateConfigEach<
|
|
71
|
+
Vmify: ObfuscateConfigEach<VmifyOptions>;
|
|
40
72
|
Minify: ObfuscateConfigEach<{}>;
|
|
41
73
|
StringsToExpressions: ObfuscateConfigEach<StringsToExpressionsOptions>;
|
|
42
74
|
NumbersToExpressions: ObfuscateConfigEach<NumbersToExpressionsOptions>;
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,13 @@ interface StringsToExpressionsOptions {
|
|
|
5
5
|
min: number;
|
|
6
6
|
/** 청크 하나에 들어가는 바이트 개수 최대값 */
|
|
7
7
|
max: number;
|
|
8
|
+
/**
|
|
9
|
+
* 0~1. 청크를 소스 순서 그대로 이어붙이는 대신, 순서를 섞어 저장해두고
|
|
10
|
+
* for 루프나 재귀 함수로 원래 순서를 되짚어가며 런타임에 조립할 확률.
|
|
11
|
+
* 소스에 보이는 조각 순서와 실제 결합 순서가 달라지므로, 단순 텍스트 상의
|
|
12
|
+
* concat 체인 스캔만으로는 원문을 복원할 수 없다. 기본값 0.6.
|
|
13
|
+
*/
|
|
14
|
+
controlFlowProbability?: number;
|
|
8
15
|
}
|
|
9
16
|
|
|
10
17
|
interface NumbersToExpressionsOptions {
|
|
@@ -12,10 +19,18 @@ interface NumbersToExpressionsOptions {
|
|
|
12
19
|
min: number;
|
|
13
20
|
/** 랜덤 보조항의 최대 절댓값 */
|
|
14
21
|
max: number;
|
|
22
|
+
/**
|
|
23
|
+
* 0~1. 정수 리터럴을 순수 산술식(depth 얕은 a+b 형태) 대신
|
|
24
|
+
* for/while 루프나 재귀 함수 호출로 "런타임에 조립"할 확률.
|
|
25
|
+
* 단순 트리 순회형 상수 접기(constant folding)는 문(statement)/제어흐름을
|
|
26
|
+
* 해석하지 못하므로 이 경로로 만든 값은 그런 도구로는 복원되지 않는다.
|
|
27
|
+
* 기본값 0.35.
|
|
28
|
+
*/
|
|
29
|
+
controlFlowProbability?: number;
|
|
15
30
|
}
|
|
16
31
|
|
|
17
32
|
interface RenameVariablesOptions {
|
|
18
|
-
random
|
|
33
|
+
random: () => string;
|
|
19
34
|
}
|
|
20
35
|
|
|
21
36
|
interface GlobalMappingOptions {
|
|
@@ -30,13 +45,30 @@ interface EncryptStringsOptions {
|
|
|
30
45
|
interface EncryptNumbersOptions {
|
|
31
46
|
}
|
|
32
47
|
|
|
48
|
+
interface VmifyOptions {
|
|
49
|
+
/**
|
|
50
|
+
* VM 밖에서 값을 그대로 참조해야 하는 전역 이름 목록(GETGLOBAL/SETGLOBAL 대상).
|
|
51
|
+
* Luau엔 getfenv가 없어서 "임의의 전역 읽기"를 흉내낼 수 없기 때문에,
|
|
52
|
+
* 여기 나열된 이름들만 브리지 테이블에 실제 값으로 미리 채워 넣는다.
|
|
53
|
+
* 나열되지 않은 전역을 참조하면 컴파일은 되지만 런타임에 nil이 나온다 — 실사용 전
|
|
54
|
+
* 반드시 프로그램에서 실제로 쓰는 전역 이름을 전부 이 목록에 채워야 함(TODO: 컴파일러가
|
|
55
|
+
* ScopeAnalysis.globalsByName을 이용해 자동으로 목록을 뽑아주도록 개선 가능).
|
|
56
|
+
*/
|
|
57
|
+
builtinGlobals?: readonly string[];
|
|
58
|
+
/**
|
|
59
|
+
* opcode 번호 셔플 + 전역/필드 이름 무작위화에 쓸 난수 생성기. 지정하지 않으면
|
|
60
|
+
* Math.random. 재현 가능한 빌드가 필요하면(테스트 등) 시드 고정 PRNG를 넘길 것.
|
|
61
|
+
*/
|
|
62
|
+
random?: () => number;
|
|
63
|
+
}
|
|
64
|
+
|
|
33
65
|
type ObfuscateConfigEach<C> = ({
|
|
34
66
|
active: true;
|
|
35
67
|
} & C) | {
|
|
36
68
|
active: false;
|
|
37
69
|
};
|
|
38
70
|
type ObfuscateConfig = {
|
|
39
|
-
Vmify: ObfuscateConfigEach<
|
|
71
|
+
Vmify: ObfuscateConfigEach<VmifyOptions>;
|
|
40
72
|
Minify: ObfuscateConfigEach<{}>;
|
|
41
73
|
StringsToExpressions: ObfuscateConfigEach<StringsToExpressionsOptions>;
|
|
42
74
|
NumbersToExpressions: ObfuscateConfigEach<NumbersToExpressionsOptions>;
|