Skip to content

Instantly share code, notes, and snippets.

@tatewake
Last active September 21, 2017 00:26
Show Gist options
  • Save tatewake/d4743b093dea2d9f3bccbd2c3e9f44a5 to your computer and use it in GitHub Desktop.
Save tatewake/d4743b093dea2d9f3bccbd2c3e9f44a5 to your computer and use it in GitHub Desktop.
Implementation of state machine described by the "deobfuscate" code example in http://antonioparata.blogspot.it/2017/09/using-mealy-automata-for-string.html
public class obfuscate2
{
enum StateType
{
kUninitialized,
kDestroyed,
k0,
k1,
k10,
k11,
k12,
k2,
k3,
k4,
k5,
k6,
k7,
k8,
k9,
};
protected StateType mState = StateType.kUninitialized;
protected void EnterWriteA()
{
System.out.print('A');
}
protected void EnterWriteC()
{
System.out.print('C');
}
protected void EnterWriteD()
{
System.out.print('D');
}
protected void EnterWriteE()
{
System.out.print('E');
}
protected void EnterWriteO()
{
System.out.print('O');
}
protected void EnterWriteP()
{
System.out.print('P');
}
protected void EnterWriteR()
{
System.out.print('R');
}
protected void EnterWriteS()
{
System.out.print('S');
}
protected void EnterWriteT()
{
System.out.print('T');
}
protected void EnterWriteU()
{
System.out.print('U');
}
protected void EnterWriteW()
{
System.out.print('W');
}
protected void On0()
{
assert(mState == StateType.k0 || mState == StateType.k1 || mState == StateType.k10 || mState == StateType.k11 || mState == StateType.k12 || mState == StateType.k2 || mState == StateType.k3 || mState == StateType.k4 || mState == StateType.k5 || mState == StateType.k6 || mState == StateType.k7 || mState == StateType.k8 || mState == StateType.k9);
switch (mState)
{
case k0:
mState = StateType.k6;
EnterWriteE();
break;
case k1:
mState = StateType.k5;
EnterWriteE();
break;
case k10:
mState = StateType.k6;
EnterWriteA();
break;
case k11:
case k6:
mState = StateType.k12;
EnterWriteD();
break;
case k12:
mState = StateType.k11;
EnterWriteS();
break;
case k2:
mState = StateType.k3;
EnterWriteP();
break;
case k3:
mState = StateType.k4;
EnterWriteE();
break;
case k4:
mState = StateType.k0;
EnterWriteR();
break;
case k5:
mState = StateType.k4;
EnterWriteC();
break;
case k7:
mState = StateType.k8;
EnterWriteS();
break;
case k8:
mState = StateType.k12;
EnterWriteU();
break;
case k9:
mState = StateType.k0;
EnterWriteP();
break;
default:
break;
}
}
protected void On1()
{
assert(mState == StateType.k0 || mState == StateType.k1 || mState == StateType.k10 || mState == StateType.k11 || mState == StateType.k12 || mState == StateType.k2 || mState == StateType.k3 || mState == StateType.k4 || mState == StateType.k5 || mState == StateType.k6 || mState == StateType.k7 || mState == StateType.k8 || mState == StateType.k9);
switch (mState)
{
case k0:
mState = StateType.k1;
EnterWriteS();
break;
case k1:
mState = StateType.k2;
EnterWriteU();
break;
case k10:
mState = StateType.k4;
EnterWriteO();
break;
case k11:
mState = StateType.k7;
EnterWriteS();
break;
case k12:
mState = StateType.k10;
EnterWriteP();
break;
case k2:
EnterWriteE();
break;
case k3:
mState = StateType.k7;
EnterWriteA();
break;
case k4:
mState = StateType.k11;
EnterWriteR();
break;
case k5:
mState = StateType.k12;
EnterWriteW();
break;
case k6:
mState = StateType.k2;
EnterWriteT();
break;
case k7:
mState = StateType.k4;
EnterWriteD();
break;
case k8:
mState = StateType.k9;
EnterWriteS();
break;
case k9:
mState = StateType.k10;
EnterWriteW();
break;
default:
break;
}
}
protected void OnConstruct()
{
assert(mState == StateType.kUninitialized);
if (mState == StateType.kUninitialized)
{
mState = StateType.k0;
}
}
protected void OnDestruct()
{
assert(mState == StateType.k0 || mState == StateType.k1 || mState == StateType.k10 || mState == StateType.k11 || mState == StateType.k12 || mState == StateType.k2 || mState == StateType.k3 || mState == StateType.k4 || mState == StateType.k5 || mState == StateType.k6 || mState == StateType.k7 || mState == StateType.k8 || mState == StateType.k9);
switch (mState)
{
case k0:
case k1:
case k10:
case k11:
case k12:
case k2:
case k3:
case k4:
case k5:
case k6:
case k7:
case k8:
case k9:
mState = StateType.kDestroyed;
break;
default:
break;
}
}
public obfuscate2()
{
mState = StateType.kUninitialized;
OnConstruct();
}
public void finalize() throws Throwable
{
OnDestruct();
super.finalize();
}
public static void main(String arg[])
{
if (arg.length == 1)
{
if (arg[0].length() > 0)
{
obfuscate2 fsm = new obfuscate2();
for(int i = 0; i < arg[0].length(); i++)
{
if (arg[0].charAt(i) == '0')
{
fsm.On0();
}
else if (arg[0].charAt(i) == '1')
{
fsm.On1();
}
}
}
}
System.out.println();
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment