我正在使用 ida 6.8 SDK,但在保存更改的变量名称时遇到问题,
我使用了许多函数,如 set_reg_name(C++)、setMemberName(in python),它们更改名称但不是永久更改,按 refresh 或重新打开 ida 后,变量具有旧名称。
当您按“N”重命名 Iyvar 并获取有关保存已更改变量名称的正确方法的信息时,使用了什么功能?
我正在使用 ida 6.8 SDK,但在保存更改的变量名称时遇到问题,
我使用了许多函数,如 set_reg_name(C++)、setMemberName(in python),它们更改名称但不是永久更改,按 refresh 或重新打开 ida 后,变量具有旧名称。
当您按“N”重命名 Iyvar 并获取有关保存已更改变量名称的正确方法的信息时,使用了什么功能?
解决方法很简单:
获取指向伪视图的指针
vdui_t * vuu= open_pseudocode(func->startEA, 0);
获取变量指针
lvars_t& lvars = *pFunction->get_lvars();
只需重命名变量
vuu->rename_lvar(&lvars.at(i), "permanamed", true);
rename_lvar func 中的最后一个 bool 标志,如果重命名是永久的,则操作。
ps 这是一个糟糕的解决方案,因为它需要打开伪视图,但我没有找到任何其他方法来永久或类似的工作函数设置标志,如 rename_lvar func 。
出色的工作@LighFusion 和@bravosierra99。由于我在寻找 Python 解决方案后最终来到这里,因此我会将其粘贴给其他人。
widget = ida_kernwin.find_widget('Pseudocode-Y')
vu = ida_hexrays.get_widget_vdui(widget)
vu.rename_lvar(vu.cfunc.lvars[2], "pModelInfo", 1)
@Igor Skochinsky - 我只是认为提供有关现有基本 [上下文] 菜单功能如何工作的源代码或文档是一种普遍的礼貌,因此人们可以建立一些东西。我数不清有多少次我无法完全复制一些基本的内置菜单选项,当我可以手动执行操作并且它完美运行时,脚本不断失败。
这是一个更完整的例子:
def rename_lvar(src, dst, ea):
# if you want to use an existing view:
# widget = ida_kernwin.find_widget('Pseudocode-Y')
# vu = ida_hexrays.get_widget_vdui(widget)
func = idaapi.get_func(ea)
if func:
ea = func.start_ea
vu = idaapi.open_pseudocode(ea, 0)
lvars = [n for n in vu.cfunc.lvars if n.name == src]
if len(lvars) == 1:
print("renaming {} to {}".format(lvars[0].name, dst))
vu.rename_lvar(lvars[0], dst, 1)
# how to close the view without a widget object?
# idautils.close_pseudocode (nope)
# ida_kerwin.close_widget (nope)
else:
print("couldn't find var {}".format(src))
最好直接执行此操作,而不使用用户界面类vdui_t。这是一个小函数,您可以调用它来设置局部变量的名称,假设您已经拥有lvar_t要重命名的对象:
def SetLvarName(func_ea,lvar,name):
lsi = ida_hexrays.lvar_saved_info_t()
lsi.ll = lvar
lsi.name = name
ida_hexrays.modify_user_lvar_info(func_ea, ida_hexrays.MLI_NAME, lsi)
这是我为确保其工作而编写的一个小工具。它反编译我的数据库中的一些函数,找到lvar_t名为“v35”的函数,并将其重命名为“vNewName”。
def GetCfunc(ea):
f = idaapi.get_func(ea)
if f is None:
return None
# Decompile the function.
cfunc = None
try:
cfunc = idaapi.decompile(f)
finally:
return cfunc
cfunc = GetCfunc(0x61FE5DDE)
if cfunc:
mba = cfunc.mba
for idx in xrange(mba.vars.size()):
var = mba.vars[idx]
if var.name == "v35":
SetLvarName(cfunc.entry_ea,var,"vNewName")
break