Files
2025-03-13 16:17:53 +01:00

86 lines
2.4 KiB
Python

"""
This script shows how to send debugger commands and use the result in IDA
Copyright (c) 1990-2025 Hex-Rays
ALL RIGHTS RESERVED.
"""
from __future__ import print_function
import re
import ida_kernwin
# class to store parsed results
class memva:
def __init__(self, m):
self.base = int(m.group(1), 16)
self.regionsize = int(m.group(2), 16)
self.state = int(m.group(3), 16)
self.statestr = m.group(4).strip()
self.protect = int(m.group(5), 16)
self.protectstr = m.group(6).strip()
if m.group(7):
self.type = int(m.group(8), 16)
self.typestr = m.group(9).strip()
else:
self.type = 0
self.typestr = ""
# Chooser class
class MemChoose(ida_kernwin.Choose):
def __init__(self, title, items):
headers = []
headers.append(["Base", 10])
headers.append(["RegionSize", 10])
headers.append(["State", 20])
headers.append(["Protect", 20])
headers.append(["Type", 20])
ida_kernwin.Choose.__init__(self, title, headers)
self.items = items
def OnGetLine(self, n):
o = self.items[n]
line = []
line.append("%08X" % o.base)
line.append("%08X" % o.regionsize)
line.append("%08X/%10s" % (o.state, o.statestr))
line.append("%08X/%10s" % (o.protect, o.protectstr))
line.append("%08X/%10s" % (o.type, o.typestr))
return line
def OnGetSize(self):
return len(self.items)
def OnSelectLine(self, n):
o = self.items[n]
ida_kernwin.jumpto(o.base)
return (ida_kernwin.Choose.NOTHING_CHANGED, )
# main
def main():
ok, s = ida_dbg.send_dbg_command("!vadump")
if not ok:
return (False, "Cannot execute the command")
matches = re.finditer(r'BaseAddress:\s*?(\w+?)\n' \
+'RegionSize:\s*?(\w*?)\n' \
+'State:\s*?(\w*?)\s*?(\w*?)\n' \
+'Protect:\s*?(\w*?)\s*?(\w*?)\n' \
+'(Type:\s*?(\w*?)\s*?(\w*?)\n)*', s)
L = []
for x in matches:
L.append(memva(x))
if not L:
return (False, "Nothing to display: Could not parse the result!")
# Get a Choose instance
chooser = MemChoose("Memory choose", L)
# Run the chooser
chooser.Show()
return (True, "Success!")
r = main()
if not r[0]:
print(r[1])