Can you believe it’s been over 2 years since our last major version increment? We certainly couldn’t at first, but when we look over the list of changes since then it seems almost surprising we haven’t done it sooner! We’re super pleased to announce Binary Ninja 4.0 is available. It includes an absolutely massive set of improvements, new features, and fixes. Far more than any previous release and we can’t wait for everyone to try it out!
We’ve got so many changes that we’re not going to go into detail on each of them in a single blog post. Instead, we’ll be doing a quick summary of some new features and then over the next few weeks we’ll be doing deep dives into them.
Just check out this list of just the highest impact changes, and you’ll see why that’s the case:
Since the launch of Binary Ninja, we’ve offered the demo version which was severely restricted and really only intended to let people get a taste of what it could do. We have however quietly expanded what it could do such as removing the time-limitation.
Coinciding with the release of 4.0, we’re pleased to announce the release of Binary Ninja Free. This version of Binary Ninja is free for evaluation or non-commercial purposes, and we hope it helps those who can’t afford a paid license but want to get into the easiest to use and best designed decompiler available. With Binary Ninja Free, one of the last big restrictions has been removed: you can now save/load databases. Of course, there’s always still cloud.binary.ninja which has support for additional architectures and can show all IL levels.
We expect to continue to add additional features into Binary Ninja Free over time, just as we’ve continued to add features into Binary Ninja Non-Commercial since it was launched.
Improvements to the type system are a major improvement to 4.0. Not only have we introduced a brand new Types View, but we’ve also added support for Type Archives. Type Archives are a new way to share collections of types with other Binary Ninja users, or just between two analysis sessions. No more manually copying type information back and forth between sessions!
We’ll update this section of the blog when we publish a much more in-depth explanation of these two new systems and how you can use them to make your reversing more efficient than ever, but in the meantime check out the updated user guide for more information on the Types View, and Type Archives.
One of our major goals for 4.0 was to really focus on making the UI feel even fresher, easier to use, and adding even more power without overly complicating the experience of using it. Just because we think we have the top UI in our space doesn’t mean there isn’t room for improvement!
The first thing you’ll notice in 4.0 is that the new tab has gotten a makeover. Not only does it make it easier to access important features (recent files and the different ways to open files), but the dedicated change log area makes it easier to scroll the list of changes.
The other thing you’ll quickly notice is that there’s a new default theme in 4.0. In fact, we didn’t just add one new theme, but three! While we selected Ninja Edit as our new default, we know you’re going to love our other two new themes, Slushee Dark and Slushee Light. And of course, don’t forget that we have a huge collection of third party themes available as well! Of course, we left the original theme, Dark as well so if you’re one of those folks who find change uncomfortable, you can always change it back in settings.
We’ve also refreshed the theme documentation in our documentation refresh for those of you interested in making your own themes, you should definitely check it out as you can now do even more themes in 4.0.
What UI refresh would be complete without new icons as well? Not only have we refreshed the obvious sidebar icons, but all the icons all over the product have gotten a more consistent look, while also enhancing their distinct function to make them even more intuitive and unobtrusive.
Previously called the components UI, the newly launched Symbols View exposes the power of components by default. While it was available as an experimental feature in 3.5, in 4.0 it’s been polished off, performance was improved, and now it’s on by default! Check out the documentation for more information on the many features in this new UI and how it can help you organize functions and variables to make your life easier (and it works great with Sidekick!)
While our 3.0 release brought the powerful pane system and the simplified sidebar system in its UI redesign, not everyone was happy with the lack of flexibility. We heard you, and we made some major improvements in 4.0. Now you have the ability to control exactly where your sidebar panels live, how many are shown, and many more UI elements support both vertical and horizontal orientations for even greater flexibility. We’re super pleased with this update that brings the smart defaults and ease of access we wanted in 3.0, while restoring some flexibility for custom layouts that customers have been missing!
The last few releases have seen several improvements to our support for windows types. We’ve come a LONG way since even 3.0. We added a huge amount of default types in 3.1, better demangling, PDB, enumeration support, and CFG handling in 3.2, SEH prolog/epilog inlining and more libraries in 3.3, and TTD Debugging in 3.5! However, there were a few crucial pieces missing that we’ve now added in 4.0: Kernel types along with platform type improvements, amazing support for COM, and support for local and remote kernel debugging!
While some changes involved moving base types behind the scenes between type libraries and the Windows platform types, one obviously notable change is that _TEB
and _PEB
types are now available. Consider the above shellcode example above before and after applying the _TEB*
type to the pointer loaded from FS:30
.
Keep an eye out here for a more in-depth explanation of the improvements to both the platform types and the kernel types, or just open up any kernel driver, and you’ll immediately see the difference!
We’ve actually front-loaded the extra blog post for one feature! Several weeks ago Peter wrote about our new COM support in 4.0 in a blog entry. Go check it out as there’s a lot more than just a few extra types and these new changes add up to a massive quality of life improvement for anyone doing COM reverse engineering.
Our open-source debugger continues see major improvements and in this release, we’ve added both local and remote Windows Kernel Debugging.
If you happen to be on an OS that supports light/dark mode you might have noticed for a week now that the dev docs can switch based on your OS’s preferred color scheme. You can also manually trigger it yourself using the sun icon at the top. This change is now on stable as well.
That said, there’s far more useful changes than just the theme! Check out the commit that landed the new code to see the summary, or just dive right in to the new documentation.
New in 4.0 is our first new architecture in several releases, RISC-V. Like all our other default architectures it is open source. Check back later for a follow-up blog on the details of what you can expect when lifting and decompiling RISC-V 32bit and 64bit binaries.
For the first time in… well, since the launch of Binary Ninja, we’re adding a feature that is only available to the commercial edition and above. If you’re not familiar with the full history, at launch the non-commercial edition was limited to a single thread, had no headless API, and didn’t have caching of analysis data in the saved BNDB files.
However, over time we’ve continued to add features from commercial to non-commercial and prior to 4.0 the only remaining differences was the right to use the software for commercial purposes, and the headless API.
With 4.0, we’re finally adding our first commercial and enterprise only feature: Projects. Additionally, two other paid add-ons are now available: nanoMIPS support, and Sidekick.
Projects allow you to not only collect related analysis databases (or any other related files) but allows you to establish connections between databases, so you can walk cross-references. Think of a piece of malware that contains functionality split across multiple DLLs, or an embedded firmware that has multiple processes with RPC set up to call between them. You can link call destinations so that you can directly navigate within a project to the appropriate library. Check back for our updated blog post on projects!
At the request of a few customers we’ve added a paid nanoMIPS plugin. If you’re interested in a separately purchased plugin for nanoMIPS support, contact us.
Sidekick is our exciting new AI assistant for reverse engineering. It’s not just simply “send my text to the LLM and ask it to summarize it for me”, but rather represents the culmination of years of internal research and a combination of our own ML models and best-of-breed public tooling to make the best experience possible in reverse engineering.
While the full service is a paid offering, you can install it from the plugin manager and check out several of the features already.
We’re still in early-access, but we’ve caught up on sign-ups, so there’s no wait if you want to check it out now!
There are a lot more details coming about the many ways Sidekick can help enhance your reverse engineering, so keep an eye out for future blog entries. In the meantime, here’s a few real customer quotes:
I feel like Sidekick will slice through a binary like a hot knife through butter. … Dude. This is sick! I haven’t been this excited about anything in a while.
Sidekick is awesome.. saving me a ton of time.
If you want to see more specifics check out our launch stream segment on Sidekick.
Special thanks (in no particular order) to the following open source contributors! reciate, rbran, emesare, SmoothHacker, saagarjha, greaka, patacca, pdietl, 0xcaff, nullableVoidPtr, nbailluet, resistor, v1X3Q0, yrp604,
And those are just the major features, here’s a more complete list of Features, Improvements, and Fixes (and even a deprecation or two) for 4.0:
builtin_memcpy
and wide string detectionHRESULT
when imported from PDBsblx lr
instructionsvbroadcastsd
showed in correct memory accessget_large_choice_input
to select from a large choice of items__offset(0)
minStringLength
was not respectedtraverse
api for traversing IL expression treesNotificationBarrier
API for high performance notificationsProject
APIsTypeArchive
APIsBinaryView.metadata
property to retrieve all metadataTypeLibrary.metadata
property to retrieve all metadataBinaryView.import_type_library_by_GUID
BinaryView.get_type_name_by_GUID
TypeContainer
UI APITypeBrowser
UI APIAnimation
UI APISymbolic
SymbolTypeSSAVariable.def_site
SSAVariable.use_sites
GetRelocationsAt
APIBinaryView.read_uuid
APIexprIndex
field to BNInstructionTextToken
repr
of BasicBlock objectsType.with_replaced_*
APIsNameList.StringSize()
for empty NameListsBinaryView::GetRelocationsAt
Remote<Class>
compatibility.py
for scripts written prior to 4.0 using the old names--no-validate-tls
flag on Enterprise Server…and, of course, all the usual “many miscellaneous crashes and fixes” not explicitly listed here. Check them out in our full milestone list: https://github.com/Vector35/binaryninja-api/milestone/14?closed=1