1+ -- This Script is Part of the Prometheus Obfuscator by Levno_710
2+ --
3+ -- NumbersToExpressions.lua
4+ --
5+ -- This Script provides an Obfuscation Step, that converts Number Literals to expressions
6+ unpack = unpack or table.unpack ;
7+
8+ local Step = require (" prometheus.step" );
9+ local Ast = require (" prometheus.ast" );
10+ local Scope = require (" prometheus.scope" );
11+ local visitast = require (" prometheus.visitast" );
12+ local util = require (" prometheus.util" )
13+
14+ local AstKind = Ast .AstKind ;
15+
16+ local NumbersToExpressions = Step :extend ();
17+ NumbersToExpressions .Description = " This Step Converts number Literals to Expressions" ;
18+ NumbersToExpressions .Name = " Numbers To Expressions" ;
19+
20+ NumbersToExpressions .SettingsDescriptor = {
21+ Treshold = {
22+ type = " number" ,
23+ default = 1 ,
24+ min = 0 ,
25+ max = 1 ,
26+ },
27+ InternalTreshold = {
28+ type = " number" ,
29+ default = 0.2 ,
30+ min = 0 ,
31+ max = 0.8 ,
32+ }
33+ }
34+
35+ function NumbersToExpressions :init (settings )
36+ self .ExpressionGenerators = {
37+ function (val , depth ) -- Addition
38+ local val2 = math.random (- 2 ^ 20 , 2 ^ 20 );
39+ local diff = val - val2 ;
40+ if tonumber (tostring (diff )) + tonumber (tostring (val2 )) ~= val then
41+ return false ;
42+ end
43+ return Ast .AddExpression (self :CreateNumberExpression (val2 , depth ), self :CreateNumberExpression (diff , depth ), false );
44+ end ,
45+ function (val , depth ) -- Subtraction
46+ local val2 = math.random (- 2 ^ 20 , 2 ^ 20 );
47+ local diff = val + val2 ;
48+ if tonumber (tostring (diff )) - tonumber (tostring (val2 )) ~= val then
49+ return false ;
50+ end
51+ return Ast .SubExpression (self :CreateNumberExpression (diff , depth ), self :CreateNumberExpression (val2 , depth ), false );
52+ end
53+ }
54+ end
55+
56+ function NumbersToExpressions :CreateNumberExpression (val , depth )
57+ if depth > 0 and math.random () >= self .InternalTreshold or depth > 15 then
58+ return Ast .NumberExpression (val )
59+ end
60+
61+ local generators = util .shuffle ({unpack (self .ExpressionGenerators )});
62+ for i , generator in ipairs (generators ) do
63+ local node = generator (val , depth + 1 );
64+ if node then
65+ return node ;
66+ end
67+ end
68+
69+ return Ast .NumberExpression (val )
70+ end
71+
72+ function NumbersToExpressions :apply (ast )
73+ visitast (ast , nil , function (node , data )
74+ if node .kind == AstKind .NumberExpression then
75+ if math.random () <= self .Treshold then
76+ return self :CreateNumberExpression (node .value , 0 );
77+ end
78+ end
79+ end )
80+ end
81+
82+ return NumbersToExpressions ;
0 commit comments