我正在尝试对专有脚本“编译字节码”进行逆向工程,因此我可以恢复已经离开的承包商的源代码。
虽然我已经完成了大部分工作,但我正在努力研究如何将表达式转换回代码。想知道是否有人可能从下面的模式中对可能用于重建方程的逻辑类型有一些想法。特别是如何将运算符应用回表达式的组件。
具体来说,我想弄清楚如何反编译这两个表达式:
A = B * C+D/E-F
A = B * (C+D)/E-F
操作代码,这是从下面提供的示例中得出的
22 04 >
2B 04 <
32 04 *
01 04 +
17 04 /
55 04 -
25 00 AND
27 00 OR
26 04 end of statement
任务类型:
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
在这个例子中,变量是:
A = 00 00
B = 00 04
C = 00 08
D = 00 0C
E = 00 10
F = 00 14
例子:
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 = BC
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+DE/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/EF
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)/EF
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=BC
3D 40 00 04 ; B
3D 40 00 08 ; C
55 04 ; -
38 40 00 00 ; assign result to A
A=B*C+DE/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
布尔表达式
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 和 b128 或 d>1024 或 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 ; ?