Skip to content

Commit e99cb12

Browse files
author
Ian Bouchard
committed
Supports parsing for cache files compiled through the opcache_compile_file function
1 parent 214a02f commit e99cb12

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

analysis_tools/opcache_parser.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from construct import *
66
from definitions import *
77

8+
meta = None
9+
810
def unserialize_zend_function():
911
return Zend_Op_Array("op_array")
1012

@@ -30,8 +32,11 @@ def Z_Val(name, callback = None, unserialize = True):
3032
ULInt32("u2"),
3133

3234
If(lambda z: z.u1.type == 6 and unserialize,
33-
Pointer(lambda z: z.value.w1 + Struct.sizeof(Meta), Zend_String("string"))
34-
),
35+
OnDemand(Pointer(lambda z: (z.value.w1 & ~1) +
36+
(meta['mem_size'] if meta['str_size'] != 0 else 0) +
37+
Struct.sizeof(Meta),
38+
Zend_String("string"))
39+
)),
3540
If(lambda z: z.u1.type == 17 and unserialize,
3641
Pointer(lambda z: z.value.w1 + Struct.sizeof(Meta), callback()))
3742
)
@@ -42,7 +47,7 @@ def Pointer_To(name, structure):
4247
ULInt32("position"),
4348
IfThenElse(structure.name, lambda z: z.position == 0,
4449
Empty(),
45-
Pointer(lambda z: z.position + Struct.sizeof(Meta), structure))
50+
Pointer(lambda z: (z.position & ~1) + Struct.sizeof(Meta), structure))
4651
)
4752

4853
def Zend_Class_Entry(name):
@@ -99,7 +104,8 @@ def Hash_Table(name, callback = None):
99104
Pointer(lambda z: z.bucket_pos + Struct.sizeof(Meta),
100105
Array(lambda z: z.nNumUsed,
101106
Bucket("buckets", callback)
102-
)))
107+
))
108+
)
103109

104110
def Zend_Value(name):
105111
return Struct(name,
@@ -172,8 +178,8 @@ def Zend_Op_Array(name):
172178
Pointer(lambda z: z.vars_pos_pos + Struct.sizeof(Meta),
173179
Array(lambda z: z.last_var,
174180
Struct("vars",
175-
ULInt32("pos"),
176-
Pointer(lambda v: v.pos + Struct.sizeof(Meta), Zend_String("var")))
181+
ULInt32("pos"))
182+
#Pointer(lambda v: v.pos + Struct.sizeof(Meta), Zend_String("var")))
177183
)
178184
),
179185
ULInt32("last_live_range"),
@@ -306,7 +312,7 @@ def parse_zval(self, offset, op_type):
306312
# Interpret the z_val
307313
if op_type == IS_CONST:
308314
if type == IS_STRING:
309-
return repr(Zend_String("val").parse(self.stream[w1 + size_of_meta:])['val'])
315+
return repr(Zend_String("val").parse(self.stream[(w1 & ~1) + (meta['mem_size'] if meta['str_size'] != 0 else 0) + size_of_meta:])['val'])
310316

311317
if type == IS_LONG:
312318
return str(w1)
@@ -344,6 +350,9 @@ def __init__(self, file_path):
344350

345351
self.parsed = OPcacheParser.parse_stream(self.stream)
346352

353+
global meta
354+
meta = self.parsed['meta']
355+
347356
def __getitem__(self, index):
348357
return self.parsed[index]
349358

0 commit comments

Comments
 (0)