IDA SDK - 永久重命名变量

逆向工程 艾达 idapro-sdk
2021-06-25 11:56:30

我正在使用 ida 6.8 SDK,但在保存更改的变量名称时遇到问题,

我使用了许多函数,如 set_reg_name(C++)、setMemberName(in python),它们更改名称但不是永久更改,按 refresh 或重新打开 ida 后,变量具有旧名称。

当您按“N”重命名 Iyvar 并获取有关保存已更改变量名称的正确方法的信息时,使用了什么功能?

3个回答

解决方法很简单:

  1. 获取指向伪视图的指针

    vdui_t * vuu= open_pseudocode(func->startEA, 0);

  2. 获取变量指针

    lvars_t& lvars = *pFunction->get_lvars();

  3. 只需重命名变量

    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