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

59 lines
2.0 KiB
Python

"""
summary: modifying function local variables
description:
Use a `ida_hexrays.user_lvar_modifier_t` to modify names,
comments and/or types of local variables.
level: intermediate
"""
import ida_hexrays
import ida_typeinf
import idc
class my_modifier_t(ida_hexrays.user_lvar_modifier_t):
def __init__(self, name_prefix="", cmt_prefix="", new_types={}):
ida_hexrays.user_lvar_modifier_t.__init__(self)
self.name_prefix = name_prefix
self.cmt_prefix = cmt_prefix
self.new_types = new_types
def modify_lvars(self, lvars):
def log(msg):
print("modify_lvars: %s" % msg)
"""Note: lvars.lvvec contains only variables modified from the defaults.
To change other variables, you can, for example, first use rename_lvar()
so they get added to this list, then use modify_user_lvar_info() or modify_lvars().
"""
log("len(lvars.lvvec) = %d" % len(lvars.lvvec))
log("lvars.lmaps.size() = %d" % lvars.lmaps.size())
log("lvars.stkoff_delta = %d" % lvars.stkoff_delta)
log("lvars.ulv_flags = %x" % lvars.ulv_flags)
for idx, one in enumerate(lvars.lvvec):
def varlog(msg):
log("var #%d: %s" % (idx, msg))
varlog("name = '%s'" % one.name)
varlog("type = '%s'" % one.type._print())
varlog("cmt = '%s'" % one.cmt)
varlog("size = %d" % one.size)
varlog("flags = %x" % one.flags)
new_type = self.new_types.get(one.name)
if new_type:
ida_typeinf.parse_decl(one.type, None, new_type, 0)
one.name = self.name_prefix + one.name
one.cmt = self.cmt_prefix + one.cmt
return True
def modify_function_lvars(name_prefix="patched_", cmt_prefix="(patched) ", new_types={}):
ea = idc.here()
my_mod = my_modifier_t(
name_prefix=name_prefix,
cmt_prefix=cmt_prefix,
new_types=new_types)
ida_hexrays.modify_user_lvars(ea, my_mod)