首页 > 其他分享 >[ida插件]IDAPyHelper

[ida插件]IDAPyHelper

时间:2024-02-27 09:46:02浏览次数:32  
标签:插件 name self sym kernwin IDAPyHelper data ida

https://github.com/patois/IDAPyHelper
修改为插件,可放到plugins目录下,Alt+h调用

IDAPyHelper 是交互式反汇编器的脚本,可帮助编写 IDAPython 脚本和插件。
它通过获取可通过 IDAPython 访问的所有名称来实现这一点,并将它们放在一个可浏览的列表中,该列表可以任意排序、扫描 (Alt-T) 和过滤 (Ctrl-F)。双击列表条目将打开一个单独的视图,其中显示该条目的文档字符串(如果可用)。按 Alt-E 可打开整个模块以供查看。

image

import ida_kernwin, ida_diskio, ida_pro
import os, inspect, sys,idaapi

__author__ = "Dennis Elser"

DBG = False

# -----------------------------------------------------------------------------
def is_ida_version(min_ver_required):
    return ida_pro.IDA_SDK_VERSION >= min_ver_required

# --------------------------------------------------------------------------
class FileViewer(ida_kernwin.Form):
    """A form that displays a text file's content."""
    def __init__(self, title, content):
        ida_kernwin.Form.__init__(self,
("BUTTON YES NONE\n"
"BUTTON NO NONE\n"
"BUTTON CANCEL NONE\n"
"%s\n\n"
"<##Docstring##:{cbEditable}>"
) % title,
{'cbEditable': ida_kernwin.Form.MultiLineTextControl(text=content,
    flags=ida_kernwin.textctrl_info_t.TXTF_READONLY |
    ida_kernwin.textctrl_info_t.TXTF_FIXEDFONT)})

# --------------------------------------------------------------------------
class DocstringViewer(ida_kernwin.Form):
    """A form that displays a docstring."""
    def __init__(self, title, docstr):
        ida_kernwin.Form.__init__(self,
("BUTTON YES NONE\n"
"BUTTON NO NONE\n"
"BUTTON CANCEL NONE\n"
"%s\n\n"
"<##Docstring##:{cbEditable}>"
) % title,
{'cbEditable': ida_kernwin.Form.MultiLineTextControl(text=docstr,
    flags=ida_kernwin.textctrl_info_t.TXTF_READONLY |
    ida_kernwin.textctrl_info_t.TXTF_FIXEDFONT)})

# --------------------------------------------------------------------------
class ChooserData:
    """Structure that holds information for the chooser to display."""
    icon_ids = {"str": 80,
    "int": 8,
    "class": 89,
    "function": 81,
    "method": 99}
    def __init__(self, mod_name, sym_name, file_name):
        self.mod_name = mod_name
        self.sym_name = sym_name
        self.file_name = file_name
        self.doc_str = ""
        self.sym_type = ""
        self.sym_value = ""
        self.line_no = ""

    def get_icon(self):
        return self.icon_ids[self.sym_type]

# --------------------------------------------------------------------------
class PyHelperChooser(ida_kernwin.Choose):
    """A chooser filled with information about IDAPython bindings.
    Output is supposed to be filtered with Ctrl-F."""
    def __init__(self, title, nb=5):
        ida_kernwin.Choose.__init__(self,
                        title,
                        [ ["Module", 10 | ida_kernwin.Choose.CHCOL_PLAIN],
                        ["Symbol", 20 | ida_kernwin.Choose.CHCOL_PLAIN],
                        ["Documentation", 10 | ida_kernwin.Choose.CHCOL_PLAIN],
                        ["Type", 10 | ida_kernwin.Choose.CHCOL_PLAIN],
                        ["Value", 10 | ida_kernwin.Choose.CHCOL_HEX],
                        ["Line number", 10 | ida_kernwin.Choose.CHCOL_DEC],],
                        flags=ida_kernwin.Choose.CH_QFLT | ida_kernwin.Choose.CH_NOIDB)
        self.items = []
        self.icon = 0
        self.build_items()

    def build_items(self):
        subdir = ""
        if is_ida_version(740):
            subdir, _, _, _, _ = sys.version_info
        pydir = ida_diskio.idadir(os.path.join("python", str(subdir)))
        for mod_name in os.listdir(pydir):
            if mod_name.endswith(".py"):
                mod_name, _ = os.path.splitext(mod_name)
                if mod_name not in ["init", "idaapi"]:
                    mod = __import__(mod_name)
                    file_name = mod.__file__
                    for sym_name, obj in inspect.getmembers(mod):

                        if inspect.isfunction(obj):
                            data = ChooserData(mod_name, sym_name, file_name)
                            data.sym_type = "function"
                            data.line_no = "%d" % obj.__code__.co_firstlineno
                            data.doc_str = inspect.getdoc(obj)
                            self.items.append(data)

                        elif inspect.isclass(obj):
                            data = ChooserData(mod_name, sym_name, file_name)
                            data.sym_type = "class"
                            data.doc_str = inspect.getdoc(obj)
                            self.items.append(data)

                        elif inspect.ismethod(obj):
                            data = ChooserData(mod_name, sym_name, file_name)
                            data.sym_type = "method"
                            data.line_no = "%d" % obj.im_func.__code__.co_firstlineno
                            data.doc_str = inspect.getdoc(obj)
                            self.items.append(data)

                        elif type(obj) == int:
                            data = ChooserData(mod_name, sym_name, file_name)
                            data.sym_type = "int"
                            data.sym_value = "0x%x" % (obj)
                            self.items.append(data)

                        elif type(obj) == str:
                            data = ChooserData(mod_name, sym_name, file_name)
                            data.sym_type = "str"
                            data.sym_value = str(obj)
                            self.items.append(data)
                        else:
                            if DBG:
                                ida_kernwin.msg("%s: %s" % (type(obj), sym_name))

    def OnGetLine(self, n):
        data = self.items[n]
        return [data.mod_name,
        data.sym_name,
        "%s" % data.doc_str,
        data.sym_type,
        data.sym_value,
        data.line_no]

    def OnGetIcon(self, n):
        return self.items[n].get_icon()

    def OnGetSize(self):
        return len(self.items)

    def OnSelectLine(self, n):
        data = self.items[n]
        postfix = " (%s)" % data.mod_name if len(data.mod_name) else ""
        if not data.doc_str:
            ida_kernwin.msg("No documentation available for \"%s\"\n" % data.sym_name)
        else:
            f = DocstringViewer("%s%s" % (data.sym_name, postfix), data.doc_str)
            f.modal = False
            f.openform_flags = ida_kernwin.PluginForm.WOPN_TAB
            f, args = f.Compile()
            f.Open()
        return (ida_kernwin.Choose.NOTHING_CHANGED, )

    def OnEditLine(self, n):
        fn = self.items[n].file_name
        if fn:
            # ghetto
            if fn.endswith(".pyc"):
                fn = fn[:-1]
            with open(fn) as fin:
                f = FileViewer("%s" % (os.path.basename(fn)), fin.read())
                f.modal = False
                f.openform_flags = ida_kernwin.PluginForm.WOPN_TAB
                f, args = f.Compile()
                f.Open()
        return (ida_kernwin.Choose.NOTHING_CHANGED, )            


class IDAPyHelperPlugin(idaapi.plugin_t):
    flags =idaapi.PLUGIN_SKIP #idaapi.PLUGIN_UNL
    wanted_name = "IDAPyHelper"
    wanted_hotkey = "Alt+h"
    comment = "IDAPyHelper plugin"
    help = "Something helpful"

    def init(self):
        idaapi.msg('IDAPyHelper init')
        return idaapi.PLUGIN_KEEP

    def term(self):
        idaapi.msg('IDAPyHelper term')

    def run(self, arg):
        try:
            self.pyhelper
        except:
            self.pyhelper=PyHelperChooser("IDAPyHelper")
            print('IDAPyHelper new run')
        else:
            if DBG:
                del self.pyhelper
                self.pyhelper=PyHelperChooser("IDAPyHelper")
        self.pyhelper.Show()

def PLUGIN_ENTRY():
    return IDAPyHelperPlugin()

标签:插件,name,self,sym,kernwin,IDAPyHelper,data,ida
From: https://www.cnblogs.com/DirWang/p/18036195

相关文章

  • ssts-hospital-web-master项目实战记录三十一:项目迁移-Vue项目Hook和插件的区别
    记录时间:2024-02-27一、准备工作【使用“文心一言”搜索】Vue中的生命周期钩子与React中的生命周期方法有何异同?Vue3中的Hook是组合式API的一部分,它们提供了一种新的方式来组织和复用组件逻辑。这些Hook函数,如setup、onMounted、onUpdated等,都是在组件的不同生命周期阶段被调......
  • ssts-hospital-web-master项目实战记录三十二:项目迁移-Vue项目Hook和插件的区别
    记录时间:2024-02-27一、准备工作【使用“文心一言”搜索】Vue3中的Hook(如setup、onMounted、onUpdated等)具体是如何工作的?它们与组件的生命周期有何关联?Vue3引入了CompositionAPI,这是一种新的、可选的方式来组织和重用Vue组件的逻辑。在CompositionAPI中,Hook(如setup、onMo......
  • Eplan插件 - 页描述批量编辑器
    前言在工作中,我们经常会遇到修改页描述属性的情况,比如从其他项目复制了页或者是新建了多页。但是在Eplan中,没有办法直接批量编辑页描述属性。通常我们有以下两种方法来批量修改属性。1.修改高层代号/位置代号中的页描述属性在这里我们可以选择顶层的文档类型代号,点击属性在......
  • @Valid和@Validated区别
    @Valid和@Validated都是用来在Java中进行数据校验的注解,但它们来自不同的框架并服务于不同的目的:@Valid:@Valid是JavaEE(现在是JakartaEE)规范的一部分,具体来说是JSR303/JSR349(BeanValidation)的标准注解。它用于验证对象属性,当使用在方法参数上时,会在方法调用前自动触发......
  • BOSHIDA 提高效率的DC电源模块设计技巧
    BOSHIDA提高效率的DC电源模块设计技巧设计高效率的BOSHIDADC电源模块可以帮助减少能源浪费和提高系统功耗,以下是一些设计技巧: 1.选择高效率的功率转换器:选择具有高效率的开关电源作为电源模块的核心。开关电源通常比线性电源具有更高的转换效率,可以将输入电压转换为所需的......
  • Jenkins插件开发遇到的问题
    创建模板问题很多教程都是使用这个命令去创建Jenkins插件项目mvn-Uarchetype:generate-Dfilter=io.jenkins.archetypes:我使用这个命令,会报archetype不存在[WARNING]Noarchetypefoundinremotecatalog.Defaultingtointernalcatalog可以使用官方提供的非互动式......
  • Jenkins下载插件报错
    只要看日志报了什么错下载超时更新代理源https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json报unabletofindvalidcertificationpathtorequestedtarget需要ssl认证,两种解决办法跳过ssl检查https://mirrors.tuna.tsinghua.edu.cn/jenkin......
  • ssts-hospital-web-master项目实战记录三十:项目迁移-插件实现说明
    记录时间:2024-02-26一、准备工作【使用“文心一言”搜索:Vue.js中模块和插件有什么区别?】在Vue.js中,模块(Modules)和插件(Plugins)都是用于扩展和增强Vue.js功能的方式,但它们在使用和目的上有一些不同。模块(Modules)模块是Vue.js中组织代码的一种方式,通常用于将应用程序划分为不同......
  • [超实用插件]在Visual Studio中查看EF Core查询计划
    前言EFCore是我们.NET开发中比较常用的一款ORM框架,今天我们分享一款可以直接在VisualStudio中查看EFCore查询计划调试器可视化工具(帮助开发者分析和优化数据库查询性能):EFCore.Visualizer。值得推荐的.NETORM框架对于还不知道怎么选择.NETORM框架的同学可以看下面这两篇文......
  • validation参数检验
    SpringValidation1.导入validation坐标2.参数上添加@Pattern注解,制定校验规则3.在Controller类上添加@Validated注解(4.在全局异常处理器中处理参数校验失败的异常)实体参数校验实体类的成员变量添加注解@NotNull:不能为null,但可以为empty(""),一般用在基本数据类型的非......