Skip to content

Commit 1d3a0ce

Browse files
committed
Refactor mem save and restore
1 parent c13b6ca commit 1d3a0ce

File tree

1 file changed

+21
-23
lines changed

1 file changed

+21
-23
lines changed

qiling/os/memory.py

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -211,34 +211,32 @@ def align(self, addr: int, alignment: int = 0x1000) -> int:
211211

212212
return (addr + (alignment - 1)) & mask
213213

214-
# save all mapped mem
215-
def save(self):
214+
def save(self) -> Mapping[int, Tuple[int, int, int, str, bytes]]:
215+
"""Save entire memory content.
216+
"""
217+
216218
mem_dict = {}
217-
seq = 1
218219

219-
for start, end, perm, info in self.map_info:
220-
mem_read = self.read(start, end-start)
221-
mem_dict[seq] = start, end, perm, info, mem_read
222-
seq += 1
220+
for i, (lbound, ubound, perm, label) in enumerate(self.map_info, 1):
221+
data = self.read(lbound, ubound - lbound)
222+
mem_dict[i] = (lbound, ubound, perm, label, bytes(data))
223223

224224
return mem_dict
225225

226-
# restore all dumped memory
227-
def restore(self, mem_dict):
228-
for key, value in mem_dict.items():
229-
start = value[0]
230-
end = value[1]
231-
perm = value[2]
232-
info = value[3]
233-
mem_read = bytes(value[4])
234-
235-
self.ql.log.debug("restore key: %i 0x%x 0x%x %s" % (key, start, end, info))
236-
if self.is_mapped(start, end-start) == False:
237-
self.ql.log.debug("mapping 0x%x 0x%x mapsize 0x%x" % (start, end, end-start))
238-
self.map(start, end-start, perms=perm, info=info)
239-
240-
self.ql.log.debug("writing 0x%x size 0x%x write_size 0x%x " % (start, end-start, len(mem_read)))
241-
self.write(start, mem_read)
226+
def restore(self, mem_dict: Mapping[int, Tuple[int, int, int, str, bytes]]):
227+
"""Restore saved memory content.
228+
"""
229+
230+
for key, (lbound, ubound, perms, label, data) in mem_dict.items():
231+
self.ql.log.debug(f'restore key: {key} {lbound:#08x} {ubound:#08x} {label}')
232+
233+
size = ubound - lbound
234+
if not self.is_mapped(lbound, size):
235+
self.ql.log.debug(f'mapping {lbound:#08x} {ubound:#08x}, mapsize = {size:#x}')
236+
self.map(lbound, size, perms, label)
237+
238+
self.ql.log.debug(f'writing {lbound:#08x}, size = {size:#x}, write_size = {len(data):#x}')
239+
self.write(lbound, data)
242240

243241
def read(self, addr: int, size: int) -> bytearray:
244242
"""Read bytes from memory.

0 commit comments

Comments
 (0)