Skip to content

Commit 49616fa

Browse files
committed
Fixed NumbersToExpressions Edge Case!
Updated Strong preset to use NEW NumberRespresentationMutation! eg 0 -> 0x0, 0e0, etc. Binary Representation is available but disabled by default. Even then you'll get a warning in logger making sure you know it won't run on lua5.1. It will run on Luau & LuaJIT though! Also added opaque boolean representation to the compiler. Added swapping to for statement handling in the compiler and also fixed duplicate local name in while_statement.lua. Finally... The new default for ConstantArray is now mixed! the first character is a prefix and tells it if it should decode base64 or base85. dont worry, i already made sure both characters are NEVER the same.
1 parent ff5b592 commit 49616fa

6 files changed

Lines changed: 489 additions & 59 deletions

File tree

src/presets.lua

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ return {
2828
Name = "ConstantArray",
2929
Settings = {
3030
Threshold = 1,
31-
StringsOnly = true,
31+
StringsOnly = true
3232
},
3333
},
3434
{ Name = "WrapInFunction", Settings = {} },
@@ -105,10 +105,15 @@ return {
105105
StringsOnly = true,
106106
Shuffle = true,
107107
Rotate = true,
108-
LocalWrapperThreshold = 0,
108+
LocalWrapperThreshold = 0
109+
},
110+
},
111+
{
112+
Name = "NumbersToExpressions",
113+
Settings = {
114+
NumberRepresentationMutaton = true
109115
},
110116
},
111-
{ Name = "NumbersToExpressions", Settings = {} },
112117
{ Name = "WrapInFunction", Settings = {} },
113118
},
114119
},

src/prometheus/compiler/expressions/boolean.lua

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,42 @@
55
-- This Script contains the expression handler for the BooleanExpression.
66

77
local Ast = require("prometheus.ast");
8+
local function createRandomASTCFlowExpression(resultBool)
9+
local expTB = {
10+
Ast.GreaterThanExpression,
11+
Ast.LessThanExpression,
12+
Ast.GreaterThanOrEqualsExpression,
13+
Ast.LessThanOrEqualsExpression,
14+
Ast.NotEqualsExpression
15+
}
816

9-
return function(self, expression, funcDepth, numReturns)
17+
local expLookup = {
18+
[Ast.GreaterThanExpression] = ">";
19+
[Ast.LessThanExpression] = "<";
20+
[Ast.GreaterThanOrEqualsExpression] = ">=";
21+
[Ast.LessThanOrEqualsExpression] = "<=";
22+
[Ast.NotEqualsExpression] = "~=";
23+
}
24+
25+
local leftInt, rightInt, boolResult, r3, randomExp
26+
repeat
27+
randomExp = expTB[math.random(1, #expTB)]
28+
leftInt = Ast.NumberExpression(math.random(1, 2^24))
29+
rightInt = Ast.NumberExpression(math.random(1, 2^24))
30+
r3 = "return " .. leftInt.value .. expLookup[randomExp] .. rightInt.value
31+
boolResult = loadstring(r3)()
32+
until boolResult == resultBool
33+
34+
return randomExp(leftInt, rightInt, false)
35+
end
36+
37+
return function(self, expression, _, numReturns)
1038
local scope = self.activeBlock.scope;
1139
local regs = {};
1240
for i = 1, numReturns do
1341
regs[i] = self:allocRegister();
1442
if i == 1 then
15-
self:addStatement(self:setRegister(scope, regs[i], Ast.BooleanExpression(expression.value)), {regs[i]}, {}, false);
43+
self:addStatement(self:setRegister(scope, regs[i], createRandomASTCFlowExpression(expression.value)), {regs[i]}, {}, false);
1644
else
1745
self:addStatement(self:setRegister(scope, regs[i], Ast.NilExpression()), {regs[i]}, {}, false);
1846
end

src/prometheus/compiler/statements/for_statement.lua

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
-- This Script contains the statement handler for the ForStatement
66

77
local Ast = require("prometheus.ast");
8+
local util = require("prometheus.util");
89

910
return function(self, statement, funcDepth)
1011
local scope = self.activeBlock.scope;
@@ -33,7 +34,11 @@ return function(self, statement, funcDepth)
3334
local tmpReg = self:allocRegister(false);
3435
self:addStatement(self:setRegister(scope, tmpReg, Ast.NumberExpression(0)), {tmpReg}, {}, false);
3536
local incrementIsNegReg = self:allocRegister(false);
36-
self:addStatement(self:setRegister(scope, incrementIsNegReg, Ast.LessThanExpression(self:register(scope, incrementReg), self:register(scope, tmpReg))), {incrementIsNegReg}, {incrementReg, tmpReg}, false);
37+
38+
local shouldSwap3 = math.random(1, 2) == 2;
39+
local shuffledRegs4 = shouldSwap3 and {incrementReg, tmpReg} or {tmpReg, incrementReg};
40+
self:addStatement(self:setRegister(scope, incrementIsNegReg, Ast[shouldSwap3 and "LessThanExpression" or "GreaterThanExpression"](self:register(scope, shuffledRegs4[1]), self:register(scope, shuffledRegs4[2]))), {incrementIsNegReg}, {shuffledRegs4[1], shuffledRegs4[2]}, false);
41+
3742
self:freeRegister(tmpReg);
3843

3944
local currentReg = self:allocRegister(true);
@@ -45,13 +50,26 @@ return function(self, statement, funcDepth)
4550
self:setActiveBlock(checkBlock);
4651

4752
scope = checkBlock.scope;
48-
self:addStatement(self:setRegister(scope, currentReg, Ast.AddExpression(self:register(scope, currentReg), self:register(scope, incrementReg))), {currentReg}, {currentReg, incrementReg}, false);
53+
54+
-- x = x + y or x = y + x instead of just x = x + y.
55+
--> NEW: In an attempt to thwart deobfuscations, despite this being a simple comparison... Shuffling these causes problems for decompilers.
56+
--> NOTE: This isn't unstable code, I've tested it multiple times.
57+
58+
local shuffledRegs = util.shuffle({currentReg, incrementReg});
59+
self:addStatement(self:setRegister(scope, currentReg, Ast.AddExpression(self:register(scope, shuffledRegs[1]), self:register(scope, shuffledRegs[2]))), {currentReg}, {shuffledRegs[1], shuffledRegs[2]}, false);
4960
local tmpReg1 = self:allocRegister(false);
5061
local tmpReg2 = self:allocRegister(false);
5162
self:addStatement(self:setRegister(scope, tmpReg2, Ast.NotExpression(self:register(scope, incrementIsNegReg))), {tmpReg2}, {incrementIsNegReg}, false);
52-
self:addStatement(self:setRegister(scope, tmpReg1, Ast.LessThanOrEqualsExpression(self:register(scope, currentReg), self:register(scope, finalReg))), {tmpReg1}, {currentReg, finalReg}, false);
63+
64+
local shouldSwap = math.random(1, 2) == 2;
65+
local shuffledRegs2 = shouldSwap and {currentReg, finalReg} or {finalReg, currentReg};
66+
self:addStatement(self:setRegister(scope, tmpReg1, Ast[shouldSwap and "LessThanOrEqualsExpression" or "GreaterThanOrEqualsExpression"](self:register(scope, shuffledRegs2[1]), self:register(scope, shuffledRegs2[2]))), {tmpReg1}, {shuffledRegs2[1], shuffledRegs2[2]}, false);
5367
self:addStatement(self:setRegister(scope, tmpReg1, Ast.AndExpression(self:register(scope, tmpReg2), self:register(scope, tmpReg1))), {tmpReg1}, {tmpReg1, tmpReg2}, false);
54-
self:addStatement(self:setRegister(scope, tmpReg2, Ast.GreaterThanOrEqualsExpression(self:register(scope, currentReg), self:register(scope, finalReg))), {tmpReg2}, {currentReg, finalReg}, false);
68+
69+
local shouldSwap2 = math.random(1, 2) == 2;
70+
local shuffledRegs3 = shouldSwap2 and {currentReg, finalReg} or {finalReg, currentReg};
71+
self:addStatement(self:setRegister(scope, tmpReg2, Ast[shouldSwap2 and "LessThanOrEqualsExpression" or "GreaterThanOrEqualsExpression"](self:register(scope, shuffledRegs3[1]), self:register(scope, shuffledRegs3[2]))), {tmpReg2}, {shuffledRegs3[1], shuffledRegs3[2]}, false);
72+
5573
self:addStatement(self:setRegister(scope, tmpReg2, Ast.AndExpression(self:register(scope, incrementIsNegReg), self:register(scope, tmpReg2))), {tmpReg2}, {tmpReg2, incrementIsNegReg}, false);
5674
self:addStatement(self:setRegister(scope, tmpReg1, Ast.OrExpression(self:register(scope, tmpReg2), self:register(scope, tmpReg1))), {tmpReg1}, {tmpReg1, tmpReg2}, false);
5775
self:freeRegister(tmpReg2);

src/prometheus/compiler/statements/while_statement.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ return function(self, statement, funcDepth)
1818
self:addStatement(self:setPos(scope, checkBlock.id), {self.POS_REGISTER}, {}, false);
1919

2020
self:setActiveBlock(checkBlock);
21-
local scope = self.activeBlock.scope;
21+
scope = self.activeBlock.scope;
2222
local conditionReg = self:compileExpression(statement.condition, funcDepth, 1)[1];
2323
self:addStatement(self:setRegister(scope, self.POS_REGISTER, Ast.OrExpression(Ast.AndExpression(self:register(scope, conditionReg), Ast.NumberExpression(innerBlock.id)), Ast.NumberExpression(finalBlock.id))), {self.POS_REGISTER}, {conditionReg}, false);
2424
self:freeRegister(conditionReg, false);

0 commit comments

Comments
 (0)