Harding-Stardust/community_base

GitHub: Harding-Stardust/community_base

一个构建在 IDA Python 之上的封装层,通过强类型、完整文档和智能默认值简化 IDA Pro 脚本与插件开发。

Stars: 29 | Forks: 1

# 摘要 这个 Python 脚本将帮助你开发 [Hex-Rays IDA Pro](https://hex-rays.com/ida-pro) 的脚本。 community_base 将 IDA Python 变成了 [DWIM (Do What I Mean)](https://en.wikipedia.org/wiki/DWIM) 风格,并且我努力遵循[“最小惊讶原则”](https://en.wikipedia.org/wiki/Principle_of_least_astonishment)。 你可以将此脚本视为用户创建的脚本与 IDA Python API 之间的填充层。 如果你以此脚本为基础开发脚本,那么如果(当)Hex-Rays 更改了其 API 中的某些内容时,无需修复所有的外部脚本,社区只需修复此脚本,所有依赖于此脚本的用户创建的脚本就能再次正常工作。 我试图保持较低的认知负荷。“重要的是开发人员在阅读代码时所感受到的困惑程度。” 引用自 # 为什么你应该使用这个脚本 - 更容易为 IDA Python 编写插件和脚本 - 为所有内容提供了类型提示! - 强类型。我使用 [Pydantic](https://docs.pydantic.dev/latest/) 来强制执行类型。这使得代码更易于阅读,因为你可以清楚地了解函数的输入和输出。我尽可能地遵循 [PEP 484](https://peps.python.org/pep-0484/)。我还使用 [mypy](https://www.mypy-lang.org/) 来检查我的代码。 - 完整的函数/变量名。这使得变量和函数一眼就能轻松看懂。 - 详尽的文档。我尽可能进行全面记录,而不会留下多余的注释。 - 易于调试(希望如此!)。所有非简单的函数都有一个名为 ```arg_debug``` 的最后一个参数,这是一个布尔值,如果设置,将打印出代码执行过程的有用信息。 - 设置了良好的默认值。例如,```ida_idp.assemble(ea, 0, ea, True, 'mov eax, 1')``` 有许多你并不知道该如何设置的参数。 - 理解用户的意图。我进行了类型检查,并根据你的输入进行不同的处理。例如,地址与标签的区别。在我的脚本中,在任何需要地址的地方,你都可以传入一个标签(或寄存器),脚本会自动将其解析。参见 ```address()``` 和 ```eval_expression()```(同样,在需要 tinfo_t(类型信息)的地方,你也可以直接传入 C 类型的字符串) - 我尽可能地将代码写得易于阅读(希望如此),这可能不是最 Pythonic 的方式(也不一定是最快的),但我注重可读性。当然,我也明白这是主观的。 - _不_ 与其他插件发生冲突。我非常谨慎,只覆盖 docstring 等内容,否则我只会向 IDA Python 中已有的类添加内容 - 我对 IDA 的部分 Python API 进行了封装,并真正遵循了它们编写的类型提示。你可以使用以下代码找到它们: ``` import community_base; print("\n".join([wrapper.replace("_idaapi_","") for wrapper in dir(community_base) if wrapper.startswith("_idaapi_")])) ``` - 取消耗时过长的脚本。你可以将字符串 "abort.ida" 复制到剪贴板,脚本将在 10 秒内停止。查看 ```_check_if_long_running_script_should_abort()``` 了解实现细节 - 方便的错误报告。参见函数 ```bug_report()``` - 获取一些实用资源的优质链接。参见函数 ```links()``` - 在开发时,拥有一种快速且简便的方法来重新加载脚本及其所有依赖项是非常棒的,参见函数 ```reload_python_module()``` - 使用 [AppCall](https://www.youtube.com/watch?v=GZUHXkV0vdM) 将 shellcode 加载到运行中的进程。参见 ```load_file_into_memory()``` - 辅助使用 [AppCall](https://www.youtube.com/watch?v=GZUHXkV0vdM) 来调用可执行文件内部的函数。(想想解密函数)例如 ```win_LoadLibraryA()``` - 简单快捷地获取 API 相关信息的方法,参见 ```google()``` - 4 个新的快捷键: - - w --> 选中的字节将被转储到磁盘 - - alt + ins --> 将当前地址复制到剪贴板(与 [x64dbg](https://x64dbg.com/) 相同) - - shift + c --> 将选中的字节作为十六进制文本复制到剪贴板(与 [x64dbg](https://x64dbg.com/) 相同) - - delete --> 智能删除。如果选中的字节是代码,则将它们变为 NOP(仅限 Intel!),如果再次按 delete(或者你在数据段中),则写入 0x00 # 安装 有两种方法可以使用此脚本,推荐的方法是下载此文件并将其放入 plugins 目录中。这样你就可以使用该库并获得新的快捷键。可以通过以下方式找到 plugins 目录: ``` import idaapi; print(idaapi.get_ida_subdirs("plugins")[0]) ``` 如果你 __不__ 想添加新的快捷键,而只是将其作为库使用,请下载该文件并将其放在 IDA 可以找到的位置: ``` import idaapi; print(idaapi.__file__.replace("idaapi.py", "community_base.py")) ``` 阅读更多: # 它 _应该_ 可以在所有操作系统上运行,但我仅在以下系统进行了测试: | OS | IDA | Python | 备注 | |--|--|--|--| | Windows 10 | 8.4 | 3.8 | OK | Windows 10 | 9.1 | 3.12 | OK | Windows 10 | 9.2 | 3.12 | OK | Windows 10 | 9.3 BETA 1 | 3.10 | OK | Windows 10 | 9.3 | 3.10 | OK | Windows 10 | 9.3sp2 | 3.10 | OK | Windows 10 | 9.4 BETA 1 | 3.14 | OK # 未来计划 - 我还没有时间把所有细节打磨到我期望的程度。请持续关注此仓库,后续会不断更新! - 我计划制作一些简短的剪辑,介绍该脚本的使用方法,这需要时间,而且视频编辑不是我的强项 - 需要更多测试方面的帮助 - 完善更多内容 :-D
标签:API封装, IDA插件, Python, SOC Prime, 云资产清单, 开发工具, 无后门, 逆向工具, 逆向工程