Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Binary Ninja Plugin #751

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open

New Binary Ninja Plugin #751

wants to merge 11 commits into from

Conversation

xfoxfu
Copy link

@xfoxfu xfoxfu commented Sep 27, 2023

This new version of Binary Ninja plugin will provide better experience over the existing one.

Features

It will not load the entire il2cpp.h header file into Binary Ninja, since this is super slow on big projects. (Shall we add an option to allow the user to still load the entire header file?)

When the user wants to get type information on a function or a static ScriptMetadata item, the user would use Il2Cpp Annotate from the plugin menu to load function signature and all related global variable types. (Note: the type may not update immediately after annotation for Binary Ninja's problem, so the user has to manually switch to graph view and back to get the views updated.)

It no longer requires preprocessing header file with il2cpp_header_to_binja.py. Instead, it uses tree-sitter to compute the type dependencies to comply with Binary Ninja's C++ parser.

It additionally loads ScriptMetadata and ScriptMetadataMethod.

Demo

Load

SCR-20230927-qkfh.png

The menu Il2Cpp Load loads script.json and il2cpp.h to the Binary Ninja instance.

image.png

It can optionally mark the functions and global variables with names, string literal values, etc. If the user opens an existing BNDB, it does not need to load names, and this will make loading faster.

After loading and marking names, the functions and global data variables are marked without types.

functions

string literals

global data variables (ScriptMetadata)

global data variables (ScriptMetadata)

method metadata (ScriptMetadataMethod)

Annotate

The menu Il2Cpp Annotate will load type information for a given function or data variable. The user does not have to select precisely the beginning of the function. It will detect the surrounding function at the current cursor position.

image.png

Annotate is only available after loading. If the user saves the project as BNDB, and reopens it, it requires to use Il2Cpp Load first without loading the names (Skip naming = Yes).

Annotate will load the types and all its dependents to Binary Ninja, and then load the function signature type or the data variable type.

function

After annotating function, the analysis may not update. The user has to switch to graph view and back to get it updated (shortcut: press Space twice). This is a known problem of Binary Ninja.

data variable

Credits to @SyxP and @exstrim401 for their existing work. This code is based on @SyxP 's IL2CPPDumperBinja and @exstrim401 's version in this repository.

@SyxP
Copy link

SyxP commented Oct 19, 2023

Note to self and other people using this:

Line 197 of _init_.py may need to be changed to tys = self.bv.parse_types_from_string(header, None, default_dirs) where default_dirs can be found via https://docs.binary.ninja/guide/type.html#finding-system-headers if it gives the following error while running Annotate:

[Default]   File "/home/syx/Documents/binaryninja/plugins/../python/binaryninja/binaryview.py", line 6889, in parse_types_from_string
[Default]     raise SyntaxError(error_str)
[Default] SyntaxError: error: sources.hpp:1:10 'stdint.h' file not found

@unknowntrojan
Copy link

when running on nightly versions of Binja, and soon on stable, before creating any undo actions you need to group them between calls to bv.begin_undo_actions() and bv.end_undo_actions(). easy fix, although annoying, it does increase undo performance a lot.

@bobberman
Copy link

Thanks! The plugin is amazing! :)

@SyxP
Copy link

SyxP commented Nov 2, 2024

Due to grantjenks/py-tree-sitter-languages#64

One needs to use

import tree_sitter_cpp
from tree_sitter import Node, Language, Parser

parser =  Parser(Language(tree_sitter_cpp.language())

going forward. (With changes in requirements.txt unless using older versions.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants