summaryrefslogtreecommitdiff
path: root/python/demangle.py
diff options
context:
space:
mode:
authorplafosse <peter@vector35.com>2016-10-28 20:16:37 -0400
committerplafosse <peter@vector35.com>2016-10-28 20:16:37 -0400
commit5e4cca1f1796bec109adacdb049d9e34c17656eb (patch)
tree68d9effb24f5fae58c1016d992f9af57c18024cc /python/demangle.py
parent253fc58d774f74edd47724eaec0197fc41561112 (diff)
Refactor python api into separate files and add Enumeration support. Also fixed bugs found with pyflakes
Diffstat (limited to 'python/demangle.py')
-rw-r--r--python/demangle.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/python/demangle.py b/python/demangle.py
new file mode 100644
index 00000000..75c63f40
--- /dev/null
+++ b/python/demangle.py
@@ -0,0 +1,83 @@
+# Copyright (c) 2015-2016 Vector 35 LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+import ctypes
+
+# Binary Ninja components
+import _binaryninjacore as core
+import bntype
+
+
+def get_qualified_name(names):
+ """
+ ``get_qualified_name`` gets a qualified name for the provied name list.
+
+ :param list(str) names: name list to qualify
+ :return: a qualified name
+ :rtype: str
+ :Example:
+
+ >>> type, name = demangle_ms(Architecture["x86_64"], "?testf@Foobar@@SA?AW4foo@1@W421@@Z")
+ >>> get_qualified_name(name)
+ 'Foobar::testf'
+ >>>
+ """
+ return "::".join(names)
+
+
+def demangle_ms(arch, mangled_name):
+ """
+ ``demangle_ms`` demangles a mangled Microsoft Visual Studio C++ name to a Type object.
+
+ :param Architecture arch: Architecture for the symbol. Required for pointer and integer sizes.
+ :param str mangled_name: a mangled Microsoft Visual Studio C++ name
+ :return: returns a Type object for the mangled name
+ :rtype: Type
+ :Example:
+
+ >>> demangle_ms(Architecture["x86_64"], "?testf@Foobar@@SA?AW4foo@1@W421@@Z")
+ (<type: public: static enum Foobar::foo __cdecl (enum Foobar::foo)>, ['Foobar', 'testf'])
+ >>>
+ """
+ handle = ctypes.POINTER(core.BNType)()
+ outName = ctypes.POINTER(ctypes.c_char_p)()
+ outSize = ctypes.c_ulonglong()
+ names = []
+ if core.BNDemangleMS(arch.handle, mangled_name, ctypes.byref(handle), ctypes.byref(outName), ctypes.byref(outSize)):
+ for i in xrange(outSize.value):
+ names.append(outName[i])
+ core.BNFreeDemangledName(outName.value, outSize.value)
+ return (bntype.Type(handle), names)
+ return (None, mangled_name)
+
+
+def demangle_gnu3(arch, mangled_name):
+ handle = ctypes.POINTER(core.BNType)()
+ outName = ctypes.POINTER(ctypes.c_char_p)()
+ outSize = ctypes.c_ulonglong()
+ names = []
+ if core.BNDemangleGNU3(arch.handle, mangled_name, ctypes.byref(handle), ctypes.byref(outName), ctypes.byref(outSize)):
+ for i in xrange(outSize.value):
+ names.append(outName[i])
+ core.BNFreeDemangledName(outName.value, outSize.value)
+ if not handle:
+ return (None, names)
+ return (bntype.Type(handle), names)
+ return (None, mangled_name)