binary ninja如何安装和编写插件

binary ninja也是逆向的一员大将。

安装

第一种方式

image.png
一般这种情况下插件的存放地点都是github,

git clone 仓库地址

image.png image.png

第二种方式

image.png 第二种不知道咋用,没研究过

2023.4.19 image.png 第二种方法相当于包管理器,替你git clone一下,不过会因为网络问题出现错误。

https://docs.binary.ninja/guide/plugins.html

编写

建议直接改现成的项目中(如obfuscation_detection)的代码完成一些代码编写工作,之后在考虑单独搞成一个项目。

image.png 看上图,将test文件夹视为一个包。 binary ninja启动的额时候会自动调用这个包。 image.png

开发路径
image.png 快捷命令

copy .\test.py __init__.py
copy __init__.py "$env:APPDATA\Binary Ninja\plugins\test"
copy <测试脚本文件> __init__.py;copy __init__.py "$env:APPDATA\Binary Ninja\plugins\test"

2023.5.10
其实不用copy,直接在%APPDATA%\Binary Ninja\plugins\test_init_.py修改代码不就完事了。

上面是非交互式,脚本要实用肯定得是加载了具体的PE文件才调用的(Interact)。 最简单的交互式插件代码

from binaryninja.plugin import BackgroundTaskThread,PluginCommand

class Solver(BackgroundTaskThread):
    # bv是binaryview对象
    def __init__(self, bv):
        BackgroundTaskThread.__init__(self, "Resolving...", True)
        self.bv = bv

    def run(self):
        print('hello')

def solve(bv):
    s = Solver(bv)
    s.start()

PluginCommand.register("Test", "this is description", solve)

测试脚本的时候每次都要重新启动binary ninja,很烦
关于上面的问题,github有人提了,
https://github.com/Vector35/binaryninja-api/discussions/1734
好像还不如重启

https://docs.binary.ninja/dev/index.html