I'm trying to reverse engineer a proprietary scripting "compiled bytecode" So I can recover source codes of contractor who has gone.
While I worked out the majority of it, I'm trying to work out how to translate expressions back into code. Wondering if anyone may have some ideas from the patterns below the sort of logic that might be used to rebuild the equations. In particular how operators may be applied back to the components of the expression.
Specifically I'm trying to work out how to decompile these two expressions:
A = B * C+D/E-F
A = B * (C+D)/E-F
Operation Codes ,this was worked out from examples provided below
22 04 >
2B 04 <
32 04 *
01 04 +
17 04 /
55 04 -
25 00 AND
27 00 OR
26 04 end of statement
Type of assignment:
3D 40 xx xx = Variable xx xx
3D 45 xx xx xx xx = 4 byte number
4B xx = One byte value
48 xx = One byte value
38 40 xx xx = Assign result to variable xx xx
In this example the variables are:
A = 00 00
B = 00 04
C = 00 08
D = 00 0C
E = 00 10
F = 00 14
Example:
A = 10*20+30/40-50/2
4B AF ; 175
38 40 00 00 ; Assign result to A
A = 10*B+30/40-50/2
48 0A ; 10
3D 40 00 04 ; B
32 04 ; *
48 00 ; 0
01 04 ; +
48 19 ; 25
55 04 ; -
38 40 00 00 ; assign result to A
A = B+C
3D 40 00 04 ; B
3D 40 00 08 ; C
01 04 ; +
38 40 00 00 ; assign result to A
A = B*C
3D 40 00 04 ; B
3D 40 00 08 ; C
32 04 ; *
38 40 00 00 ; assign result to A
A = B-C
3D 40 00 04 ; B
3D 40 00 08 ; C
55 04 ; -
38 40 00 00 ; Assign result to A
A = B/C
3D 40 00 04 ; B
3D 40 00 08 ; C
17 04 ; /
38 40 00 00 ; Assign result to A
A = B*C+D-E/F
3D 40 00 04 ; B
3D 40 00 08 ; C
32 04 ; *
3D 40 00 0C ; D
01 04 ; +
3D 40 00 10 ; E
3D 40 00 14 ; F
17 04 ; /
55 04 ; -
38 40 00 00 ; Assign result to A
A = B*C+D/E-F
3D 40 00 04 ; B
3D 40 00 08 ; C
32 04 ; *
3D 40 00 0C ; D
3D 40 00 10 ; E
17 04 ; /
01 04 ; +
3D 40 00 14 ; F
55 04 ; -
38 40 00 00 ; Assign result to A
A = B*(C+D)/E-F
3D 40 00 04 ; B
3D 40 00 08 ; C
3D 40 00 0C ; D
01 04 ; +
32 04 ; *
3D 40 00 10 ; E
17 04 ; /
3D 40 00 14 ; F
55 04 ; -
38 40 00 00 ; Assign result to A
A = B+C * D
3D 40 00 04 ; B
3D 40 00 08 ; C
3D 40 00 0C ; D
32 04 ; *
01 04 ; +
38 40 00 00 ; assign result to A
A=(B+C) * D
3D 40 00 04 ; B
3D 40 00 08 ; C
01 04 ; +
3D 40 00 0C ; D
32 04 ; *
38 40 00 00 ; assign result to A
A=B+C+D * E
3D 40 00 04 ; B
3D 40 00 08 ; C
01 04 ; +
3D 40 00 0C ; D
3D 40 00 10 ; E
32 04 ; *
01 04 ; +
38 40 00 00 ; assign result to A
A=(B+C+D) * E
3D 40 00 04 ; B
3D 40 00 08 ; C
01 04 ; +
3D 40 00 0C ; D
01 04 ; +
3D 40 00 10 ; E
32 04 ; *
38 40 00 00 ; assign result to A
A=A+B * C+D+E * F
3D 40 00 00 ; A
3D 40 00 04 ; B
3D 40 00 08 ; C
32 04 ; *
01 04 ; +
3D 40 00 0C ; D
01 04 ; +
3D 40 00 10 ; E
3D 40 00 14 ; F
32 04 ; *
01 04 ; +
38 40 00 00 ; Assign result to A
A=(A+B) * (C+D)+E * F
3D 40 00 00 ; A
3D 40 00 04 ; B
01 04 ; +
3D 40 00 08 ; C
3D 40 00 0C ; D
01 04 ; +
32 04 ; *
3D 40 00 10 ; E
3D 40 00 14 ; F
32 04 ; *
01 04 ; +
38 40 00 00 ; Assign result to A
A=A+B+(C * D)+E
3D 40 00 00 ; A
3D 40 00 04 ; B
01 04 ; +
3D 40 00 08 ; C
3D 40 00 0C ; D
32 04 ; *
01 04 ; +
3D 40 00 10 ; E
01 04 ; +
38 40 00 00 ; assign result to A
A=A+B+(C* D *E)+F
3D 40 00 00 ; A
3D 40 00 04 ; B
01 04 ; +
3D 40 00 08 ; C
3D 40 00 0C ; D
32 04 ; *
3D 40 00 10 ; E
32 04 ; *
01 04 ; +
3D 40 00 14 ; F
01 04 ; +
38 40 00 00 ; assign result to A
A=B-C
3D 40 00 04 ; B
3D 40 00 08 ; C
55 04 ; -
38 40 00 00 ; assign result to A
A=B*C+D-E/F
3D 40 00 04 ; B
3D 40 00 08 ; C
32 04 ; *
3D 40 00 0C ; D
01 04 ; +
3D 40 00 10 ; E
3D 40 00 14 ; F
17 04 ; -
55 04 ; /
38 40 00 00 ; Assign result to A
Boolean Expressions
512 < A
3D 45 00 00 02 00 ; 512
3D 40 00 00 ; variable A
2B 04 ; <
26 00 ; end of expression
00 7E ; ?
a>B and b128 or d>1024 or e>128
3D 40 00 00 ; A
3D 40 00 04 ; B
22 04 ; >
25 00 ; AND
00 CC ;
3D 40 00 04 ; B
3D 40 00 08 ; C
2B 04 ; <
25 00 ; AND
00 CC ;
3D 40 00 08 ; C
4B 80 ; 128
22 04 ; >
27 00 ; OR
00 E8 ;
3D 40 00 0C ; D
3D 45 00 00 04 00 ; 1024
22 04 ; >
27 00 ; OR
00 E8 ;
3D 40 00 10 ; E
4B 80 ; 128
22 04 ; >
26 00 ; end of expression
01 14 ; ?
A=B*C+D-E/F
incorrect? It should have beenB C * D + E F / -
instead ofB C * D + E F - /