Don’t panic! Binary Ninja version 4.2 Frogstar is here. It is, after all, the answer to everything. Much like a trusty towel, you’ll find that the improvements in 4.2 are applicable to many situations. This major release (despite the number increment being minor since we couldn’t skip version 4.2) includes an industry-first multiple-language decompilation, DYLD Shared Cache analysis, MSVC RTTI support, a new signature system fittingly called WARP, and so many more features.
One of Vector 35’s long-standing goals has been to break people away from the assumption that “C” is the ultimate output of a decompiler. That is one reason why HLIL is our default view, even though we offer Pseudo-C output. Now, in Binary Ninja 4.2, we are taking this one step further. We are adding a brand new, unique capability to Binary Ninja: the ability to decompile to other target languages.
This new Language Representation system is designed to allow custom renderings of HLIL that are language-specific. Using this system, we are adding Pseudo-Rust, which displays decompiled code in a style similar to the popular language Rust. The best part of this feature is that it is fully pluggable and user-customizable, with both a comprehensive API available and fully-featured example plugins for you to explore. In addition to both the Pseudo-C and Pseudo-Rust representations being released as open source C++ plugins, we are also releasing a Pseudo-Python example, written in Python, to demonstrate how to use this new system in Python plugins.
Not only does this add to the groundwork for new language-specific decompilation, but it also is a dramatic improvement in the quality of our Pseudo-C output. Instead of a one-off implementation, it’s now much more robust so users who prefer Pseudo-C as their default should see a noticeable increase in quality.
Most C++ binaries contain a significant amount of information about their types, as it is necessary when using the object-oriented features of the language. Now, in C++ binaries compiled using MSVC, Binary Ninja will automatically extract this type information and apply it for you. It will discover Virtual Function Tables, creating structures for them in your analysis, and making data variables with those structures where they are found. For classes with multiple inheritance, multiple Virtual Function Tables are supported and will be created accordingly. This update specifically adds support for extracting RTTI from x86 and x64 PE files compiled with MSVC. In future updates, we plan to expand this functionality to include Itanium RTTI support.
This release features a new way to transfer function information between binaries. Unlike our existing SigKit tool, WARP is meant for whole function matching. This means fewer false positives and more opportunities to match on smaller functions, thanks to WARP’s function constraints. WARP integration is currently in alpha, and is disabled by default. If you would like to try it, you can enable analysis.warp
in your settings. For more information about WARP, visit the documentation here!
For those iOS researchers who have been waiting for our new dyld shared cache (DSC) support, thanks for your patience! We’re extremely happy to announce that Binary Ninja 4.2 contains an alpha preview of our DSC support. The current release contains full support for iOS 11-17 shared cache bundles and partial support for iOS 18 and all macOS caches. Like many of our custom views, the implementation is open source and feedback is welcome.
Our DSC loader lets you select images from the shared cache to load into the analysis space and will automatically link loaded images. You can search either by image in the Images
tab or you can search by a symbol to cause the image that contains it to be loaded.
We’re excited to announce major updates to the Workflows Feature in version 4.2. These enhancements bring powerful new capabilities to streamline and customize your binary analysis process. Here’s what’s new:
The new changes to workflows will be getting their own dedicated blog with a lot more examples and information, so make sure to check out the documentation in the meantime. These changes to workflows enable future improvements, such as combining with the language representation to allow far more granular control of decompilation for specific languages in the future.
Just two months ago, we announced our new Binary Ninja Ultimate edition. While we previously had been making some very niche architectures available as separate paid add-ons, we decided to bundle all of those features into one new higher-end version called Ultimate. With an introductory price of $2999, unlimited access to a growing list of architectures, no subscription pricing, and other new features coming regularly, the uptake from the community has been quite strong!
As of 4.2, Binary Ninja Ultimate adds support for C-Sky, TriCore, and nanoMIPS architectures, VxWorks images, and has several other new features on the way. There’s never been a better time to upgrade – current customers even get a discount on upgrades; contact us to get a custom quote.
While Ultimate includes new niche architectures at a higher price point, we are continuing to add new architectures for all of our other customers as well! In Binary Ninja 4.2 we added support for MSP430, partnering with Joe Rozner to integrate his plugin as a first-class architecture plugin. It is open source and, as a Rust plugin, it fits right in with our trend of new plugins being written against our Rust API!
A number of new features are small enough that they don’t deserve a whole major section, but we know they’re going to make a huge difference for many of our users. We don’t want to let them get buried in the detailed notes below, so here are a couple special mentions:
One of our oldest and most upvoted issues, “collapsible regions in linear view” was completed in this release. You can now fold code at different indentation levels of HLIL and other high level language representations. Still to come, support for folding data structures in linear view. Note that the folding indicators only show up when you hover over their column.
A new feature that allows for manual forward type propagation was added and mapped to the Q
hotkey. Also available from the command-palette as “Forward Propagate Type”, this further streamlines marking up type annotations while reverse engineering.
We plan to automate this in the future, but in the meantime this work-around can save a lot of time!
“Undefine”, or the u
hotkey in the UI, previously was only able to undefine a symbol. This would, for example, remove the name of a function or variable but not remove the object itself. This was not the most intuitive behavior, and so we’ve replaced the previous functionality with a new “smart” Undefine that does what most users would expect! Now, when using u
, the symbol, variable, or function selected will be removed, in addition to the symbol itself, even if there are technically two distinct objects from an API perspective.
New to the New Tab page is the plugin status widget. It shows the status of all installed plugins, whether they failed to load, and whether they have available updates. You can also use it to jump straight to the plugin manager.
Special thanks (in no particular order) to the following open source contributors whose unpaid work is either directly merged into this release or whose PRs prompted changes that landed! riskydissonance, mkrasnitski, Whurbin, alexmullins, Zerotistic, bdash, and SmoothHacker. We appreciate your contributions!
A recent twitter comment mentioned “crazy how fast binja is progressing” and we agree! Even though this is technically a minor version change, the list of major improvements is even larger than our previous 3.0 stable release. We’ve upped the bar with what changes we can ship and we hope it’s obvious to our current customers.
If you’re not yet a current customer, now’s a great time to evaluate the free version, or purchase a license! Don’t forget our student discount program if you’re a full-time student.
We’re also looking forward to seeing everyone attending RE//verse next February!
And those are just the major features, here’s a more complete list of features, improvements, deprecations and fixes for 4.2:
Go to Entry Point
is_valid_for
callbacks without making them available for all files, such as many firmware loaders)TerminateProcess(GetCurrentProcess())
is a no-return callAppleArm64ObjcFastARCCallingConvention
0xffff0000 & (b & 0xffff) => b & 0
zx.q(var_4 & 1) & 1 => zx.q(var_4) & 1
if (boolean)
SPACE
analysis.limits.maxGlobalPointerValueUpdates
set to 0 no longer causes a hangTerminateProcess
detectionmpidr_el1
aarch64 sysregVPOP
, VPUSH
, VLDR
, VSTR
, VMOV
, RRX
, VABS
, VMRS
, VCVT
, VSTMIA
, VLDMIA
, VSUB
, VDIV
, VMUL
, VFMA
, VMRS
, VNEG
VMOV
xori
lifting error)push r16
instructions in x86HI
, LO
REV
S
and D
registers in Lifted ILR
register groups referencing PC
for 15th register indexVADD
, VDIV
, and VABS
VPOP
not setting registersSBB
instruction on Aarch64BinaryView::GetMemoryRegionFlags
/BinaryView::SetMemoryRegionFlags
(add ability to modify segments via the MemoryMap API)FileContext::newMappedFile
allows creation of a new mapped FilePlatform::GetRelatedPlatforms
BinaryNinja::SetThreadName
MediumLevelILFunction::IsSSAVarLiveAt
BinaryView::GetDataOffsetForAddress
BinaryView::GetFunctionAnalysisUpdateDisabled
/ BinaryView::SetFunctionAnalysisUpdateDisabled
Splitter::setMinimumWidgetSize
/ Splitter::minimumWidgetSize
class RemoteFolder
getStringForGraphType
/ getGraphTypeForString
class FlowGraphLayout
FlowGraphWidget::tagAddressAccepted
TagTypeSelectDialog::selected
LinearView::goToEntryPoint
/ FlowGraphWidget::goToEntryPoint
StackView::getBaseOffset
UIContextNotification::OnContextMenuCreated
Workflow::GetEligibilitySettings
RepoPlugin::IsViewOnly
Settings::QueryProperty
FlowGraphWidget/LinearView::forwardPropagateType
/ FlowGraphWidget/LinearView::inferFunctionType
/ FlowGraphWidget/LinearView::propagateVariableTypeAndName
OptionsDialog::removeTabAndSettingsView
/ OptionsDialog::viewTypeSelectionChanged
BinaryView::IsForceLoadableCallback
LinearView::undefine
Load(Ref<ProjectFile>)
TypeBuilder::GetNameType()
/ TypeBuilder::HasTemplateArguments
/ TypeBuilder::SetNameType
/ TypeBuilder::SetHasTemplateArguments
/ TypeBuilder::VarArgsType
/ TypeBuilder::ValueType
/ Type::GetNameTypeString
/ Type::GetCallingConventionName
/ Type::SetCallingConventionName
Logger::Indent
/ Logger::Dedent
/ Logger::ResetIndent
namespace BinaryNinja::Unicode
class Demangler
for custom name demangler supportclass GenericRangeMap
/ class GenericRange
FlowGraphWidget::getEdgeForMouseEvent
/ FlowGraphWidget::canCopyAddress
class LanguageRepresentationFunction
/ class LanguageRepresentationFunctionType
/ class HighLevelILTokenEmitter
BinaryView::AddAutoSegments
BinaryView::BeginBulkAddSegments
, BinaryView::EndBulkAddSegments
, and BinaryView::CancelBulkAddSegments
BinaryView::GetGlobalPointerValue()
, BinaryView::UserGlobalPointerValueSet()
, BinaryView::ClearUserGlobalPointerValue()
TypeLibrary::WriteToFile
Now returns a bool if it failedRequest::Request
/ Request::Post
BinaryView::UndefineDataVariable
set_user_var_value
now works on function parametersSegment::SetLength
, Segment::SetDataOffset
, Segment::SetDataLength
, Segment::SetFlags
undefineName
/ undefineFunc
/ undefineVariable
CarryFlagWithInvertedSubtractRole
which makes the carry flag value be inverted with subtraction vs addition, this is used in Arm64 and 6502TypedDataAccessor
can now slice into array objectsBackgroundTaskThread
execute_backend_command
now also returns the output from the command execution for the DbgEng adapterrestart_and_wait
restarts the target and wait for the operation to completeAs a reminder, all Enterprise stable client builds for 4.2 are now labeled “Ultimate” as we have merged those editions together. This means all Enterprise customers are receiving our new Ultimate-only features for no additional cost. The Enterprise server will continue to be a separate product.
_init_plugins()
no longer checks out a licenseRemoteProject.create_folder
API no longer throws an error even though folder is created successfully…plus all of the usual “additional” changes included in the full list of closed issues.