def
vm(ins):
opcode
=
int
(ins[
2
])
operands
=
ins[
3
]
if
opcode
=
=
0x21344D4938CE0640
:
print
(
'system({0})'
.
format
(
repr
(operands[
0
][
0
].decode())))
elif
opcode
=
=
0x3820EA1739C3E154
:
print
(
'map[{0}] = hex(vigenere(map[{0}], "恭喜发财".encode("gbk")))'
.
format
(
repr
(operands[
0
][
4
])))
elif
opcode
=
=
0x4B0134D06B40680
:
print
(
'if (len(map[{0}]) {1} {2}) goto {3}'
.
format
(
repr
(operands[
0
][
4
]), operands[
1
][
5
].decode(), operands[
2
][
1
], operands[
3
][
6
].decode()))
elif
opcode
=
=
0x5304FD305CA8C22A
:
print
(
'sleep({})'
.
format
(operands[
0
][
1
]))
elif
opcode
=
=
0x5AC009C0F14B76E8
:
print
(
'map[{0}] = input()'
.
format
(
repr
(operands[
0
][
4
])))
elif
opcode
=
=
0x6975C7A3C07CD226
:
print
(
'map[{0}] += {1}'
.
format
(
repr
(operands[
0
][
4
]),
repr
(operands[
1
][
0
])))
elif
opcode
=
=
0x7929CBF0A1496FB0
:
print
(
'map[{0}] = base64encode(map[{0}])'
.
format
(
repr
(operands[
0
][
4
])))
elif
opcode
=
=
0x885F75A1461ECEBB
:
print
(
'if (map[{0}] == map[{1}]) goto {2}'
.
format
(
repr
(operands[
0
][
4
]),
repr
(operands[
1
][
4
]), operands[
2
][
6
].decode()))
elif
opcode
=
=
0x8DB9D83D80004137
:
print
(
'print({})'
.
format
(
repr
(operands[
0
][
0
].replace(b
'\\n'
, b
'\n'
).decode(
'gbk'
))))
elif
opcode
=
=
0xA43CBF9D015186F1
:
if
len
(operands): code
=
operands[
0
][
1
]
else
: code
=
0
print
(
'exit({0})'
.
format
(code))
elif
opcode
=
=
0xAA9C8E70F01F8D61
:
print
(
'map[{0}] = map[{1}]'
.
format
(
repr
(operands[
0
][
4
]),
repr
(operands[
1
][
4
])))
elif
opcode
=
=
0xDDEEFF2200112233
:
print
(
'nop'
)
elif
opcode
=
=
0xE56D33B21C50A892
:
print
(
'goto {0}'
.
format
(operands[
0
][
6
].decode()))
elif
opcode
=
=
0xF4CC06C2E34200F0
:
print
(
'nop 0'
)
elif
opcode
=
=
0xF4CC06F2E3420459
:
print
(
'nop 1'
)
elif
opcode
=
=
0xFD1D1DFB19850CA1
:
print
(
'map[{0}] = md5(map[{0}])'
.
format
(
repr
(operands[
0
][
4
])))
else
:
assert
False
,
hex
(opcode)
mem_offset
=
0xea0000
mem_size
=
0x20000
mem_dump
=
open
(
'MEM_00EA0000_00020000.mem'
,
'rb'
).read()
ins_start
=
0xeb4b00
ins_end
=
0xeb62a4
def
read_dword(addr):
assert
mem_offset <
=
addr < mem_offset
+
mem_size
return
int
.from_bytes(mem_dump[addr
-
mem_offset: addr
-
mem_offset
+
4
],
'little'
)
def
read_data(addr, size):
assert
mem_offset <
=
addr < mem_offset
+
mem_size
-
size
return
mem_dump[addr
-
mem_offset: addr
-
mem_offset
+
size]
def
read_str(addr):
size
=
read_dword(addr
+
0x10
)
cap
=
read_dword(addr
+
0x14
)
if
cap >
0x10
: addr
=
read_dword(addr)
return
read_data(addr, size)
def
read_A(addr):
return
(read_str(addr
+
4
), read_dword(addr
+
0x1c
), read_dword(addr
+
0x20
), read_dword(addr
+
0x24
), read_str(addr
+
0x28
), read_str(addr
+
0x40
), read_str(addr
+
0x58
))
def
read_B(addr):
B
=
(read_dword(addr), read_dword(addr
+
4
), read_str(addr
+
0x20
), [])
A_start
=
read_dword(addr
+
0x38
)
A_end
=
read_dword(addr
+
0x3c
)
for
addr
in
range
(A_start, A_end,
0x70
):
B[
-
1
].append(read_A(addr))
return
B
ins
=
[]
for
addr
in
range
(ins_start, ins_end,
0x44
):
ins.append(read_B(addr))
for
i
in
range
(
len
(ins)):
t
=
ins[i]
if
t[
0
]:
print
(t[
3
][
0
][
6
].decode()
+
':'
)
else
:
print
(
' '
, end
=
'')
vm(ins[i])