GeezerVison is showing api.binary.ninja — demangle module — Binary Ninja API Documentation v6.0.10905
demangle module¶
CoreDemangler¶
-
class CoreDemangler[source]¶
Bases: Demangler
-
demangle(name: str, config: DemanglerConfig) → DemangleResult | None[source]¶
Demangle a raw name into a Type and QualifiedName.
The result of this function is a DemangleResult with Type and QualifiedName
fields for the demangled name’s details. DemangleResult can be unpacked as
(type, name).
Any unresolved named types referenced by the resulting Type will be created as
empty structures or void typedefs in the view, if the result is used on
a data structure in the view. Given this, the call to demangle
should NOT cause any side-effects creating types in the view trying to resolve this
and instead just return a type with unresolved named type references.
The most recently registered demangler that claims a name is a mangled string
(returns true from is_mangled_string), and then returns a value from
this function will determine the result of a call to demangle_any.
If this call returns None, the next most recently used demangler(s) will be tried instead.
If the mangled name has no type information, but a name is still possible to extract,
this function may return a successful DemangleResult(None, <name>), which will be accepted.
Custom demanglers using the legacy demangle(arch, name, view) signature remain
supported for one deprecation cycle.
- Parameters:
-
- Returns:
DemangleResult with type and name fields if successful, None if not.
Type may be None if only a demangled name can be recovered from the raw name.
- Return type:
DemangleResult | None
-
is_mangled_string(name: str) → bool[source]¶
Determine if a given name is mangled and this demangler can process it
The most recently registered demangler that claims a name is a mangled string
(returns true from this function), and then returns a value from
demangle will determine the result of a call to demangle_any.
Returning True from this does not require the demangler to succeed the call to
demangle, but simply implies that it may succeed.
- Parameters:
name (str) – Raw mangled name string
- Returns:
True if the demangler thinks it can handle the name
- Return type:
bool
DemangleResult¶
-
class DemangleResult[source]¶
Bases: NamedTuple
Tuple-compatible demangle result. A successful result always has a QualifiedName;
the type may be None when the demangler can recover only a name.
-
static __new__(_cls, type: Type | None, name: QualifiedName)¶
Create new instance of DemangleResult(type, name)
- Parameters:
-
-
name: QualifiedName¶
Alias for field number 1
-
type: Type | None¶
Alias for field number 0
Demangler¶
-
class Demangler[source]¶
Bases: object
Pluggable name demangling interface. See register and demangle
for details on the process of this interface.
Custom Demangler subclasses can be registered and promoted at runtime.
The list of Demanglers can be queried:
>>> list(Demangler)
[<Demangler: MS>, <Demangler: GNU3>, <Demangler: LLVM>]
-
__init__(handle=None)[source]¶
-
demangle(name: str, config: DemanglerConfig) → DemangleResult | None[source]¶
Demangle a raw name into a Type and QualifiedName.
The result of this function is a DemangleResult with Type and QualifiedName
fields for the demangled name’s details. DemangleResult can be unpacked as
(type, name).
Any unresolved named types referenced by the resulting Type will be created as
empty structures or void typedefs in the view, if the result is used on
a data structure in the view. Given this, the call to demangle
should NOT cause any side-effects creating types in the view trying to resolve this
and instead just return a type with unresolved named type references.
The most recently registered demangler that claims a name is a mangled string
(returns true from is_mangled_string), and then returns a value from
this function will determine the result of a call to demangle_any.
If this call returns None, the next most recently used demangler(s) will be tried instead.
If the mangled name has no type information, but a name is still possible to extract,
this function may return a successful DemangleResult(None, <name>), which will be accepted.
Custom demanglers using the legacy demangle(arch, name, view) signature remain
supported for one deprecation cycle.
- Parameters:
-
- Returns:
DemangleResult with type and name fields if successful, None if not.
Type may be None if only a demangled name can be recovered from the raw name.
- Return type:
DemangleResult | None
-
static demangle_any(name: str, config: DemanglerConfig | None = None) → DemangleResult | None[source]¶
Demangle a raw name using an optional prebuilt DemanglerConfig.
- Parameters:
-
- Return type:
DemangleResult | None
-
is_mangled_string(name: str) → bool[source]¶
Determine if a given name is mangled and this demangler can process it
The most recently registered demangler that claims a name is a mangled string
(returns true from this function), and then returns a value from
demangle will determine the result of a call to demangle_any.
Returning True from this does not require the demangler to succeed the call to
demangle, but simply implies that it may succeed.
- Parameters:
name (str) – Raw mangled name string
- Returns:
True if the demangler thinks it can handle the name
- Return type:
bool
-
classmethod promote(demangler)[source]¶
Promote a demangler to the highest-priority position.
>>> list(Demangler)
[<Demangler: MS>, <Demangler: GNU3>, <Demangler: LLVM>]
>>> Demangler.promote(list(Demangler)[0])
True
>>> list(Demangler)
[<Demangler: GNU3>, <Demangler: LLVM>, <Demangler: MS>]
- Parameters:
demangler – Demangler to promote
- Returns:
True if promotion succeeded; False if the demangler was invalid or not registered.
-
classmethod register()[source]¶
Register a custom Demangler. Newly registered demanglers will get priority over
previously registered demanglers and built-in demanglers.
- Returns:
True if registration succeeded; False if the demangler was invalid.
-
name = None¶
demangle_any¶
-
demangle_any(mangled_name: str, config: DemanglerConfig | None = None) → DemangleResult | None[source]¶
Attempt to demangle a mangled name, trying all relevant demanglers and using whichever one accepts it.
- Parameters:
mangled_name (str) – a mangled symbol name
config (Optional[DemanglerConfig]) – Platform/view/options used while demangling. If omitted,
the core default standalone platform is used.
- Returns:
returns a DemangleResult with type and name fields, or None on error. DemangleResult can be unpacked as (type, name).
- Return type:
Optional[DemangleResult]
- Example:
>>> result = demangle_any("?testf@Foobar@@SA?AW4foo@1@W421@@Z")
>>> result.type
<type: immutable:FunctionTypeClass 'enum Foobar::foo __cdecl(enum Foobar::foo)'>
>>> result.name
'Foobar::testf'
demangle_gnu3¶
-
demangle_gnu3(arch: Architecture | Platform | DemanglerConfig, mangled_name: str, options=None) → DemangleResult | None[source]¶
demangle_gnu3 demangles a mangled name to a Type object.
Warning
Passing a BinaryView through the legacy options compatibility path queries
its template-simplifier setting on every call. This is very slow and should not
be used in an inner loop. Create one DemanglerConfig with
DemanglerConfig.for_binary_view(view) and pass it to demangle_any instead.
- Parameters:
-
- Returns:
returns a DemangleResult with type and name fields, or None on error
- Return type:
Optional[DemangleResult]
demangle_llvm¶
-
demangle_llvm(mangled_name: str, options: DemanglerConfig | None = None) → DemangleResult | None[source]¶
demangle_llvm demangles a mangled name using the LLVM demangler.
Warning
Passing a BinaryView through the legacy options compatibility path queries
its template-simplifier setting on every call. This is very slow and should not
be used in an inner loop. Create one DemanglerConfig with
DemanglerConfig.for_binary_view(view) and pass it to demangle_any instead.
- Parameters:
-
- Returns:
returns a DemangleResult with type and name fields, or None on error
- Return type:
Optional[DemangleResult]
- Example:
>>> config = DemanglerConfig.default()
>>> demangle_llvm("?testf@Foobar@@SA?AW4foo@1@W421@@Z", config)
DemangleResult(type=None, name='public: static enum Foobar::foo __cdecl Foobar::testf(enum Foobar::foo)')
>>>
demangle_ms¶
-
demangle_ms(archOrPlatform: Architecture | Platform | DemanglerConfig, mangled_name: str, options=False) → DemangleResult | None[source]¶
demangle_ms demangles a mangled Microsoft Visual Studio C++ name to a Type object.
Warning
Passing a BinaryView through the legacy options compatibility path queries
its template-simplifier setting on every call. This is very slow and should not
be used in an inner loop. Create one DemanglerConfig with
DemanglerConfig.for_binary_view(view) and pass it to demangle_any instead.
- Parameters:
archOrPlatform (Architecture | Platform | DemanglerConfig) – A prebuilt configuration,
or an Architecture or Platform for the symbol
mangled_name (str) – a mangled Microsoft Visual Studio C++ name
archOrPlatform
- Returns:
returns a DemangleResult with type and name fields, or None on error
- Return type:
Optional[DemangleResult]
- Example:
>>> config = DemanglerConfig.for_platform(Architecture["x86_64"].standalone_platform)
>>> demangle_ms(config, "?testf@Foobar@@SA?AW4foo@1@W421@@Z")
DemangleResult(type=<type: immutable:FunctionTypeClass 'enum Foobar::foo __cdecl(enum Foobar::foo)'>, name='Foobar::testf')
>>>
|