@@ -64,6 +64,31 @@ def __init__(self, ql: Qiling, pagesize: int = 0x1000):
6464 # make sure pagesize is a power of 2
6565 assert self .pagesize & (self .pagesize - 1 ) == 0 , 'pagesize has to be a power of 2'
6666
67+ self ._packers = {
68+ (1 , True ): ql .pack8s ,
69+ (2 , True ): ql .pack16s ,
70+ (4 , True ): ql .pack32s ,
71+ (8 , True ): ql .pack64s ,
72+
73+ (1 , False ): ql .pack8 ,
74+ (2 , False ): ql .pack16 ,
75+ (4 , False ): ql .pack32 ,
76+ (8 , False ): ql .pack64
77+ }
78+
79+ self ._unpackers = {
80+ (1 , True ): ql .unpack8s ,
81+ (2 , True ): ql .unpack16s ,
82+ (4 , True ): ql .unpack32s ,
83+ (8 , True ): ql .unpack64s ,
84+
85+ (1 , False ): ql .unpack8 ,
86+ (2 , False ): ql .unpack16 ,
87+ (4 , False ): ql .unpack32 ,
88+ (8 , False ): ql .unpack64
89+ }
90+
91+
6792 def __read_string (self , addr : int ) -> str :
6893 ret = bytearray ()
6994 c = self .read (addr , 1 )
@@ -344,22 +369,12 @@ def read_ptr(self, addr: int, size: int = 0, *, signed = False) -> int:
344369 if not size :
345370 size = self .ql .arch .pointersize
346371
347- __unpack = ({
348- 1 : self .ql .unpack8s ,
349- 2 : self .ql .unpack16s ,
350- 4 : self .ql .unpack32s ,
351- 8 : self .ql .unpack64s
352- } if signed else {
353- 1 : self .ql .unpack8 ,
354- 2 : self .ql .unpack16 ,
355- 4 : self .ql .unpack32 ,
356- 8 : self .ql .unpack64
357- }).get (size )
358-
359- if __unpack is None :
372+ try :
373+ _unpack = self ._unpackers [(size , signed )]
374+ except KeyError :
360375 raise QlErrorStructConversion (f"Unsupported pointer size: { size } " )
361376
362- return __unpack (self .read (addr , size ))
377+ return _unpack (self .read (addr , size ))
363378
364379 def write (self , addr : int , data : bytes ) -> None :
365380 """Write bytes to a memory.
@@ -385,22 +400,12 @@ def write_ptr(self, addr: int, value: int, size: int = 0, *, signed = False) ->
385400 if not size :
386401 size = self .ql .arch .pointersize
387402
388- __pack = ({
389- 1 : self .ql .pack8s ,
390- 2 : self .ql .pack16s ,
391- 4 : self .ql .pack32s ,
392- 8 : self .ql .pack64s
393- } if signed else {
394- 1 : self .ql .pack8 ,
395- 2 : self .ql .pack16 ,
396- 4 : self .ql .pack32 ,
397- 8 : self .ql .pack64
398- }).get (size )
399-
400- if __pack is None :
403+ try :
404+ _pack = self ._packers [(size , signed )]
405+ except KeyError :
401406 raise QlErrorStructConversion (f"Unsupported pointer size: { size } " )
402407
403- self .write (addr , __pack (value ))
408+ self .write (addr , _pack (value ))
404409
405410 def search (self , needle : Union [bytes , Pattern [bytes ]], begin : Optional [int ] = None , end : Optional [int ] = None ) -> List [int ]:
406411 """Search for a sequence of bytes in memory.
0 commit comments