mirror of
https://github.com/idapython/src
synced 2026-06-08 14:47:00 +00:00
86 lines
2.4 KiB
Python
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])
|