Giter Site home page Giter Site logo

voltron's Introduction

Voltron

build

Voltron is an extensible debugger UI toolkit written in Python. It aims to improve the user experience of various debuggers (LLDB, GDB, VDB and WinDbg) by enabling the attachment of utility views that can retrieve and display data from the debugger host. By running these views in other TTYs, you can build a customised debugger user interface to suit your needs.

Voltron does not aim to be everything to everyone. It's not a wholesale replacement for your debugger's CLI. Rather, it aims to complement your existing setup and allow you to extend your CLI debugger as much or as little as you like. If you just want a view of the register contents in a window alongside your debugger, you can do that. If you want to go all out and have something that looks more like OllyDbg, you can do that too.

Built-in views are provided for:

  • Registers
  • Disassembly
  • Stack
  • Memory
  • Breakpoints
  • Backtrace

The author's setup looks something like this:

voltron example LLDB

Any debugger command can be split off into a view and highlighted with a specified Pygments lexer:

command views

More screenshots are here.

Support

Voltron supports LLDB, GDB, VDB and WinDbg/CDB (via PyKD) and runs on macOS, Linux and Windows.

WinDbg support is still fairly new, please open an issue if you have problems.

The following architectures are supported:

lldb gdb vdb windbg
x86
x86_64
arm
arm64
powerpc

Installation

Note: Only macOS and Debian derivatives are fully supported by the install script. It should hopefully not fail on other Linux distros, but it won't try to install package dependencies. If you're using another distro, have a look at install.sh to work out what dependencies you might need to install before running it.

Download the source and run the install script:

$ git clone https://github.com/snare/voltron
$ cd voltron
$ ./install.sh

By default, the install script will install into the user's site-packages directory. If you want to install into the system site-packages, use the -s flag:

$ ./install.sh -s

You can also install into a virtual environment (for LLDB only) like this:

$ ./install.sh -v /path/to/venv -b lldb

If you are on Windows without a shell, have problems installing, or would prefer to install manually, please see the manual installation documentation.

Quick Start

  1. If your debugger has an init script (.lldbinit for LLDB or .gdbinit for GDB) configure it to load Voltron when it starts by sourcing the entry.py entry point script. The full path will be inside the voltron package. For example, on macOS it might be /Library/Python/2.7/site-packages/voltron/entry.py. The install.sh script will add this to your .gdbinit or .lldbinit file automatically if it detects GDB or LLDB in your path.

    LLDB:

     command script import /path/to/voltron/entry.py
    

    GDB:

     source /path/to/voltron/entry.py
    
  2. Start your debugger and initialise Voltron manually if necessary.

    On recent versions of LLDB you do not need to initialise Voltron manually:

     $ lldb target_binary
    

    On older versions of LLDB you need to call voltron init after you load the inferior:

     $ lldb target_binary
     (lldb) voltron init
    

    GDB:

     $ gdb target_binary
    

    VDB:

     $ ./vdbbin target_binary
     > script /path/to/voltron/entry.py
    

    WinDbg/CDB is only supported run via Bash with a Linux userland. The author tests with Git Bash and ConEmu. PyKD and Voltron can be loaded in one command when launching the debugger:

     $ cdb -c '.load C:\path\to\pykd.pyd ; !py --global C:\path\to\voltron\entry.py' target_binary
    
  3. In another terminal (I use iTerm panes) start one of the UI views. On LLDB, WinDbg and GDB the views will update immediately. On VDB they will not update until the inferior stops (at a breakpoint, after a step, etc):

     $ voltron view register
     $ voltron view stack
     $ voltron view disasm
     $ voltron view backtrace
    
  4. Set a breakpoint and run your inferior.

     (*db) b main
     (*db) run
    
  5. When the debugger hits the breakpoint, the views will be updated to reflect the current state of registers, stack, memory, etc. Views are updated after each command is executed in the debugger CLI, using the debugger's "stop hook" mechanism. So each time you step, or continue and hit a breakpoint, the views will update.

Documentation

See the wiki on github.

FAQ

Q. Why am I getting an ImportError loading Voltron?

A. You might have multiple versions of Python installed and have installed Voltron using the wrong one. See the more detailed installation instructions.

Q. GEF? PEDA? PwnDbg? fG's gdbinit?

A. All super great extensions for GDB. These tools primarily provide sets of additional commands for exploitation tasks, but each also provides a "context" display with a view of registers, stack, code, etc, like Voltron. These tools print their context display in the debugger console each time the debugger stops. Voltron takes a different approach by embedding an RPC server implant in the debugger and enabling the attachment of views from other terminals (or even web browsers, or now synchronising with Binary Ninja), which allows the user to build a cleaner multi-window interface to their debugger. Voltron works great alongside all of these tools. You can just disable the context display in your GDB extension of choice and hook up some Voltron views, while still getting all the benefits of the useful commands added by these tools.

Bugs and Errata

See the issue tracker on github for more information or to submit issues.

If you're experiencing an ImportError loading Voltron, please ensure you've followed the installation instructions for your platform.

LLDB

On older versions of LLDB, the voltron init command must be run manually after loading the debug target, as a target must be loaded before Voltron's hooks can be installed. Voltron will attempt to automatically register its event handler, and it will inform the user if voltron init is required.

WinDbg

More information about WinDbg/CDB support here.

Misc

The authors primarily use Voltron with the most recent version of LLDB on macOS. We will try to test everything on as many platforms and architectures as possible before releases, but LLDB/macOS/x64 is going to be by far the most frequently-used combination. Hopefully Voltron doesn't set your pets on fire, but YMMV.

License

See the LICENSE file.

If you use this and don't hate it, buy me a beer at a conference some time. This license also extends to other contributors - richo definitely deserves a few beers for his contributions.

Credits

Thanks to my former employers Assurance and Azimuth Security for giving me time to spend working on this.

Props to richo for all his contributions to Voltron.

fG!'s gdbinit was the original inspiration for this project.

Thanks to Willi for implementing the VDB support.

Voltron now uses Capstone for disassembly as well as the debugger hosts' internal disassembly mechanism. Capstone is a powerful, open source, multi-architecture disassembler upon which the next generation of reverse engineering and debugging tools are being built. Check it out.

Thanks to grazfather for ongoing contributions.

voltron's People

Contributors

alexanderomara avatar betaveros avatar davidrb avatar grazfather avatar jaseg avatar joeabbey avatar liptonb avatar miaubiz avatar mspublic avatar mycon avatar nateozem avatar richo avatar seanballais avatar snare avatar suve avatar williballenthin avatar xfwduke avatar yrp604 avatar zcutlip avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

voltron's Issues

AttributeError: 'NoneType' object has no attribute 'adaptor_class'

commit a9cc84f

OS X 10.10, installed by

python setup.py install

error:

(lldb) command script import /Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/dbgentry.py
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/dbgentry.py", line 148, in __lldb_init_module
    env_dict['cmd'] = VoltronLLDBCommand(debugger, env_dict)
  File "/Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/dbgentry.py", line 109, in __init__
    self.adaptor = self.pm.debugger_plugin_for_host('lldb').adaptor_class()
AttributeError: 'NoneType' object has no attribute 'adaptor_class'

Then I changed to load from git repo

(lldb) command script import ~/Work/voltron/dbgentry.py                                                                                                                                                                                       Traceback (most recent call last):
  File "/Users/sskaje/Work/voltron/dbgentry.py", line 148, in __lldb_init_module
    env_dict['cmd'] = VoltronLLDBCommand(debugger, env_dict)
  File "/Users/sskaje/Work/voltron/dbgentry.py", line 109, in __init__
    self.adaptor = self.pm.debugger_plugin_for_host('lldb').adaptor_class()
AttributeError: 'NoneType' object has no attribute 'adaptor_class'

I read plugin.py, and found if I change

    def debugger_plugin_for_host(self, host=None):
        """
        Find a debugger plugin that supports the debugger host.
        """
        return self.debugger_plugins[host]

to

    def debugger_plugin_for_host(self, host=None):
        """
        Find a debugger plugin that supports the debugger host.
        """
        return self._debugger_plugins[host]

This error is gone.

Then comes voltron status in lldb

(lldb) 
(lldb) voltron start
Usage: voltron <init|status|debug|update>
(lldb) voltron init
Registered stop-hook
(lldb) voltron status
Traceback (most recent call last):
  File "/Users/sskaje/Work/voltron/dbgentry.py", line 157, in lldb_invoke
    env_dict['cmd'].invoke(debugger, command, result, env_dict)
  File "/Users/sskaje/Work/voltron/dbgentry.py", line 122, in invoke
    self.handle_command(command)
  File "/Users/sskaje/Work/voltron/dbgentry.py", line 54, in handle_command
    self.status()
  File "/Users/sskaje/Work/voltron/dbgentry.py", line 75, in status
    summs = self.server.client_summary()
AttributeError: 'Server' object has no attribute 'client_summary'

Use Relative Imports

Many of the Python modules import voltron itself, which requires a previous installation (or otherwise adding it to PYTHONPATH).

It might make more sense to use relative imports (e.g. from .. import voltron) so that it can be run as a self-contained entity.

I might be missing some downside though.

rl dependency breaking voltron on freebsd

❯ python --version
Python 2.7.10

❯ freebsd-version; uname -a                                                                                           
11.0-CURRENT
FreeBSD z600 11.0-CURRENT FreeBSD 11.0-CURRENT #18: Mon Nov 23 10:52:48 CST 2015     root@z600:/usr/obj/usr/src/sys/MYKERNEL  amd64


❯ pip install --user rl
Collecting rl
  Using cached rl-2.4.zip
Requirement already satisfied (use --upgrade to upgrade): setuptools in /usr/local/lib/python3.5/site-packages (from rl)
Building wheels for collected packages: rl
  Running setup.py bdist_wheel for rl
  Complete output from command /usr/local/bin/python3.5 -c "import setuptools;__file__='/tmp/pip-build-2dklih7w/rl/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" bdist_wheel -d /tmp/tmpqwb42ayppip-wheel-:
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.freebsd-11.0-CURRENT-amd64-3.5
  creating build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/testing.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/__init__.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/_history.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/_completion.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  creating build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples
  copying rl/examples/raw_input.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples
  copying rl/examples/__init__.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples
  copying rl/examples/email.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples
  copying rl/examples/factory.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples
  copying rl/examples/static.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples
  copying rl/examples/pre_input_hook.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples
  creating build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  copying rl/tests/test_generator.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  copying rl/tests/test_readline.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  copying rl/tests/test_callhooks.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  copying rl/tests/test_histfile.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  copying rl/tests/__init__.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  copying rl/tests/test_properties.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  copying rl/tests/test_initfile.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  copying rl/tests/test_unicode.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  copying rl/tests/test_history.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests
  creating build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/utils
  copying rl/utils/__init__.py -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/utils
  running egg_info
  writing rl.egg-info/PKG-INFO
  writing dependency_links to rl.egg-info/dependency_links.txt
  writing top-level names to rl.egg-info/top_level.txt
  writing requirements to rl.egg-info/requires.txt
  warning: manifest_maker: standard file '-c' not found

  reading manifest file 'rl.egg-info/SOURCES.txt'
  writing manifest file 'rl.egg-info/SOURCES.txt'
  copying rl/iterator.c -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/iterator.h -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/readline.c -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/stringarray.c -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/stringarray.h -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/unicode.c -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/unicode.h -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl
  copying rl/examples/README.txt -> build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples
  Fixing build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/testing.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/__init__.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/_history.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/_completion.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/raw_input.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/__init__.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/email.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/factory.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/static.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/pre_input_hook.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_generator.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_readline.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_callhooks.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_histfile.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/__init__.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_properties.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_initfile.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_unicode.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_history.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/utils/__init__.py
  Skipping optional fixer: buffer
  Skipping optional fixer: idioms
  Skipping optional fixer: set_literal
  Skipping optional fixer: ws_comma
  Fixing build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/testing.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/__init__.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/_history.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/_completion.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/raw_input.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/__init__.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/email.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/factory.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/static.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/examples/pre_input_hook.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_generator.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_readline.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_callhooks.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_histfile.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/__init__.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_properties.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_initfile.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_unicode.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/tests/test_history.py build/lib.freebsd-11.0-CURRENT-amd64-3.5/rl/utils/__init__.py
  Skipping optional fixer: buffer
  Skipping optional fixer: idioms
  Skipping optional fixer: set_literal
  Skipping optional fixer: ws_comma
  running build_ext
  building 'rl.readline' extension
  creating build/temp.freebsd-11.0-CURRENT-amd64-3.5
  creating build/temp.freebsd-11.0-CURRENT-amd64-3.5/rl
  cc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -fPIC -I/usr/local/include/python3.5m -c rl/readline.c -o build/temp.freebsd-11.0-CURRENT-amd64-3.5/rl/readline.o
  rl/readline.c:42:10: fatal error: 'readline/readline.h' file not found
  #include <readline/readline.h>
           ^
  1 error generated.
  error: command 'cc' failed with exit status 1

  ----------------------------------------
  Failed building wheel for rl
Failed to build rl
Installing collected packages: rl
  Running setup.py install for rl
    Complete output from command /usr/local/bin/python3.5 -c "import setuptools, tokenize;__file__='/tmp/pip-build-2dklih7w/rl/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-s8c8l_73-record/install-record.txt --single-version-externally-managed --compile --user --prefix=:
    running install
    running build
    running build_py
    running egg_info
    writing dependency_links to rl.egg-info/dependency_links.txt
    writing top-level names to rl.egg-info/top_level.txt
    writing requirements to rl.egg-info/requires.txt
    writing rl.egg-info/PKG-INFO
    warning: manifest_maker: standard file '-c' not found

    reading manifest file 'rl.egg-info/SOURCES.txt'
    writing manifest file 'rl.egg-info/SOURCES.txt'
    running build_ext
    building 'rl.readline' extension
    cc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -fPIC -I/usr/local/include/python3.5m -c rl/readline.c -o build/temp.freebsd-11.0-CURRENT-amd64-3.5/rl/readline.o
    rl/readline.c:42:10: fatal error: 'readline/readline.h' file not found
    #include <readline/readline.h>
             ^
    1 error generated.
    error: command 'cc' failed with exit status 1

    ----------------------------------------
Command "/usr/local/bin/python3.5 -c "import setuptools, tokenize;__file__='/tmp/pip-build-2dklih7w/rl/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-s8c8l_73-record/install-record.txt --single-version-externally-managed --compile --user --prefix=" failed with error code 1 in /tmp/pip-build-2dklih7w/rl

❯ find /usr/ -name "readline.h"
/usr/local/include/readline/readline.h
/usr/local/include/editline/readline.h

Can't run on OSX 10.9 (ImportError: No module named lldb)

[vitaliy:~] $ voltron
Traceback (most recent call last):
File "/usr/local/bin/voltron", line 9, in
load_entry_point('voltron==0.1', 'console_scripts', 'voltron')()
File "/usr/local/lib/python2.7/site-packages/pkg_resources.py", line 357, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/local/lib/python2.7/site-packages/pkg_resources.py", line 2394, in load_entry_point
return ep.load()
File "/usr/local/lib/python2.7/site-packages/pkg_resources.py", line 2108, in load
entry = import(self.module_name, globals(),globals(), ['name'])
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/init.py", line 8, in
from .main import *
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/main.py", line 15, in
from .console import *
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/console.py", line 6, in
import lldb
ImportError: No module named lldb

Linux socket connect error

OS: Linux Mint 17.2
voltron version: git clone today.

$ voltron view backtrace
Encountered an exception while running the view 'BacktraceView':
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/voltron-0.1-py2.7.egg/voltron/main.py", line 53, in main
    inst.run()
  File "/usr/local/lib/python2.7/dist-packages/voltron-0.1-py2.7.egg/voltron/view.py", line 228, in run
    self.server_version = self.client.perform_request('version')
  File "/usr/local/lib/python2.7/dist-packages/voltron-0.1-py2.7.egg/voltron/core.py", line 407, in perform_request
    res = self.send_request(req)
  File "/usr/local/lib/python2.7/dist-packages/voltron-0.1-py2.7.egg/voltron/core.py", line 337, in send_request
    response = self.session.post(self.url, data=str(request))
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 497, in post
    return self.request('POST', url, data=data, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 455, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 553, in send
    adapter = self.get_adapter(url=request.url)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 598, in get_adapter
    raise InvalidSchema("No connection adapters were found for '%s'" % url)
InvalidSchema: No connection adapters were found for 'http+unix://%2fhome%2fwilson%2f.voltron%2fsock/api/request'

SSE Registers are displayed as N/A when using LLDB

I'm using lldb-340.4.70. When running 'voltron view register -sse, SSE registers are displayed as n/a. I tracked the bug down to line:

https://github.com/snare/voltron/blob/master/voltron/plugins/debugger/dbg_lldb.py#L201

SBValues for XMM registers don't have a valid value. In order to work around it, I have to iterate over all its children instead.

if reg.value != None:
  try:
      val = reg.GetValueAsUnsigned()
  except:
      reg = None
elif reg.num_children > 0:
  children = []
  for i in range (reg.GetNumChildren()):
      children.append(reg.GetChildAtIndex(i, lldb.eNoDynamicValues, True).value)
  val = ", ".join(children)

AttributeError: 'NoneType' object has no attribute 'is_success'

Running voltron view stack with lldb gives me:

Encountered an exception while running the view 'StackView':
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/main.py", line 49, in main
    inst.run()
  File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/view.py", line 215, in run
    self.render()
  File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/plugins/view/memory.py", line 153, in render
    super(StackView, self).render()
  File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/plugins/view/memory.py", line 85, in render
    if deref_res.is_success:
AttributeError: 'NoneType' object has no attribute 'is_success'

This triggers as soon as I step.

Variable/Memory/Register stalker

Something like the ImmunitySec debugger which permit to follow the variable/memory/register during the debugging to see how it changes during the execution.

Error in default.cfg

At line 169 we have format error at:
format: "{red}voltron>{reset} "
Should be:
"format": "{red}voltron>{reset} "

voltron server: AttributeError: 'StandaloneServer' object has no attribute '_clients' & 'cleanup'

When running voltron server I get the following error:

voltron: [ERROR] Exception running module StandaloneServer: Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/main.py", line 57, in main
    inst.run()
  File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/comms.py", line 259, in run
    self.start()
  File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/comms.py", line 162, in start
    self.thread = ServerThread(self, self._clients, self.exit_out)
AttributeError: 'StandaloneServer' object has no attribute '_clients'

Traceback (most recent call last):
  File "/usr/local/bin/voltron", line 9, in <module>
    load_entry_point('voltron==0.1', 'console_scripts', 'voltron')()
  File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/voltron-0.1-py2.7.egg/voltron/main.py", line 62, in main
    inst.cleanup()
AttributeError: 'StandaloneServer' object has no attribute 'cleanup'

Install failed

Hello, I'm trying to install voltron to Kali Linux. Fully updated, and I fixed all of the "except , e" errors, and now I'm stuck on a syntax error here:

File "build/bdist.linux-x86_64/egg/tests/common.py", line 71
dereference_response = [[u'pointer', 140734748778168], [u'pointer', 140735677462013], [u'symbol', u'start + 0x1']]
                 ^
SyntaxError: invalid syntax

There's another one here that I'm not quite able to find either:

Traceback (most recent call last):
File "setup.py", line 21, in <module>
dependency_links = ["https://github.com/snarez/scruffy/tarball/master#egg=scruffy"]
File "/usr/lib/python3.2/distutils/core.py", line 148, in setup
dist.run_commands()
File "/usr/lib/python3.2/distutils/dist.py", line 917, in run_commands
self.run_command(cmd)
File "/usr/lib/python3.2/distutils/dist.py", line 936, in run_command
cmd_obj.run()
File "/usr/lib/python3/dist-packages/setuptools/command/install.py", line 73, in run
self.do_egg_install()
File "/usr/lib/python3/dist-packages/setuptools/command/install.py", line 101, in do_egg_install
cmd.run()
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 368, in run
self.easy_install(spec, not self.no_deps)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 588, in easy_install
return self.install_item(None, spec, tmpdir, deps, True)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 640, in install_item
self.process_distribution(spec, dist, deps)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 692, in process_distribution
[requirement], self.local_index, self.easy_install
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 576, in resolve
dist = best[req.key] = env.best_match(req, self, installer)
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 822, in best_match
return self.obtain(req, installer) # try and download/install
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 834, in obtain
return installer(requirement)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 608, in easy_install
return self.install_item(spec, dist.location, tmpdir, deps)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 638, in install_item
dists = self.install_eggs(spec, download, tmpdir)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 828, in install_eggs
return self.build_and_install(setup_script, setup_base)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 1105, in build_and_install
self.run_setup(setup_script, setup_base, args)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 1094, in run_setup
run_setup(setup_script, args)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 31, in run_setup
lambda: exec(compile(open(
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 73, in run
return func()
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 33, in <lambda>
).read(), "setup.py", 'exec'),
File "setup.py", line 122
east_asian_width_properties=(u'W', u'F',)):
                                                      ^
SyntaxError: invalid syntax

Any ideas?

After using regular python instead of python3, install worked.

lldb support seems pretty broken in lldb-300.5.27.3

So far what I've deduced:

I can get voltron to work if I:

  • start lldb
  • load voltron
  • start voltron
  • attach a bunch of viewers
  • manually call voltron update
  • Do whatever I'm doing in lldb
  • manually call voltron update every time I want the viewer to update.

I get a barf in get_registers that crashes lldb if it's run in a hook, but if you run voltron update from the debugger it dumps a stack trace. It looks like GetRegisters is returning an empty set.

tl;dr I'm happy to work on this but missing a bunch of domain knowledge about how lldb's interface works/how voltron is bound to it. If you're free, wanna give me a primer at some point?

Problem with gdbinit

Hey, me again. gdb 7.4.1-debian is giving me this error:

Exception <type 'exceptions.ImportError'> raised while loading Voltron: No module named blessed
/home/admin/.gdbinit:2: Error in sourced command file:
Undefined command: "voltron".  Try "help".

I'm assuming this is from the 'import blessed' line in dbgentry.py. Any ideas?

Sorry I'm treating this as a forum since there's no official forum for voltron. Cheers

Exception <class 'ImportError'> raised while loading Voltron: No module named 'plugin'

Hi,

just spent last 2-3 days in implementing a python server inside gdb, with some external views that can be started in different terminals (register, stack etc.). And accidentally bumped into this project! Briliant!!!!

just that... did not manage to make it working... got the error above.

default python is the same version for gdb and the one found in path (both are 3.4)

thanks in advance for your help

Interrupted System Call

Really trying to get this to work on a 32-bit Ubuntu 12.04 LTS VM.
I can get everything installed/compiled/etc. "Voltron loaded" appears in a glowing red when I fire up GDB, my .gdbinit has the source and init lines but I have two issues:

 Starting program: myFile 9999
 Exception in thread Thread-1:
 Traceback (most recent call last):
 File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
 self.run()
 File "/usr/local/lib/python2.7/dist-packages/voltron-0.1-py2.7.egg/voltron/core.py", line 193, in run
 rfds, _, _ = select.select([serv, self.exit_pipe] + self.clients, [], [])
 error: (4, 'Interrupted system call')'

and then in my second terminal, when trying to start a view, I get:

 Error connecting to server: Connection refused

Thanks for any guidance you can provide.

segfault on gdb 7.9

os: Ubuntu 15.04 gdb: GNU gdb (Ubuntu 7.9-1ubuntu1) 7.9
elf file is https://github.com/ctfs/write-ups-2015/tree/master/defcon-qualifier-ctf-2015/reverse/pr0dk3y

i do load the file with gdb: gdb ./pr0dk3y_40687b492c80205cccb34db1eabf6456
bp *0 to break as soon as it executes then info file, bpd 1 and bp *entry_point (this is to break on entry point since the elf has PIE)

it will break and seems to work but as soon as i single step one or at most two instructions (either si/ni) gdb will segfault:

0x0000555555554a65 in ?? ()
/build/buildd/gdb-7.9/gdb/common/cleanups.c:265: internal-warning: restore_my_cleanups has found a stale cleanup
A problem internal to GDB has been detected,
further debugging may prove unreliable.

This is a bug, please report it.  For instructions, see:
<http://www.gnu.org/software/gdb/bugs/>.

[1]    5903 abort (core dumped)  gdb pr0dk3y_40687b492c80205cccb34db1eabf6456

or:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/voltron-0.1-py3.4.egg/voltron/core.py", line 215, in run
    rfds, _, _ = select.select([serv, self.exit_pipe] + self.clients, [], [])
InterruptedError: [Errno 4] Chiamata di sistema interrotta

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.4/dist-packages/voltron-0.1-py3.4.egg/voltron/core.py", line 218, in run
    if ex[0] == errno.EINTR: # interrupted system call
TypeError: 'InterruptedError' object is not subscriptable


0x0000555555554a84 in ?? ()

here is my gdb-init:

source ~/coding_home/reversing/voltron/dbgentry.py                                                                                                                                                                                         
voltron init                                                                                                                                                                                                                               

#source ~/.fg_gdbinit

i did both import and remove https://github.com/gdbinit/Gdbinit but still keeps on crashing.

Connecting to Voltron from another computer

While the server can listen on TCP, it seems that the client is hard-coded to use a UNIX_SOCKET. Is there an existing client that can connect to Voltron from a remote host?

Several command-line flags are undocumented (-o, -v, -s)

When running voltron with no arguments I get the following output:

usage: voltron [-h] [--debug] {reg,disasm,stack,bt,cmd,server,gdb6proxy} ...
voltron: error: too few arguments

Shouldn't it include -o, -v and -s options?

Also include it somewhere in the README.

Command API method breaks LLDB history

If you use the command method, it breaks LLDB's history so you can't just press enter to execute the same command again. Instead of executing the command you entered at the command line, it will re-execute the command from the command view, so you won't get the output you expect.

Error when using 'disasm' view

Running on OS X with LLDB version lldb-320.4.124.10, the disasm view displays

Unhandled exception <type 'exceptions.TypeError'> disassembling: 'SBTarget' object has no attribute '__getitem__'

"voltron view ..." fails to connect: "No such file or directory"

I tried following the installation instructions, and managed to get lldb started and dbgentry.py loaded through .lldbinit:

Current executable set to './wtdx' (x86_64).
(lldb) voltron start
voltron start 
Starting voltron 
Stop hook #1 added.
(lldb) 

But when I try to start a view using e.g. voltron view bt, I get the error message Failed connecting to server:[Errno 2] No such file or directory.

Did I miss a setup step?

(Running Linux Mint, let me know if you need any more details about the system.)

It's not working on Ubuntu 14.04

user@ubuntu:~$ gdb -q
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/voltron-0.1-py2.7.egg/dbgentry.py", line 1, in <module>
    import voltron
ImportError: No module named 'voltron'
/home/user/.gdbinit:2: Error in sourced command file:
Undefined command: "voltron".  Try "help".
(gdb) 
user@ubuntu:~$ cat .gdbinit 
source /usr/local/lib/python2.7/dist-packages/voltron-0.1-py2.7.egg/dbgentry.py
voltron start
user@ubuntu:~$ which voltron 
/usr/local/bin/voltron
user@ubuntu:~$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import voltron
>>> voltron.__file__
'/usr/local/lib/python2.7/dist-packages/voltron-0.1-py2.7.egg/voltron/__init__.pyc'

Install into the user directory

I'm trying to install voltran with the --user key:

$ python setup.py install --user

running install
running bdist_egg
running egg_info
writing requirements to voltron.egg-info/requires.txt
writing voltron.egg-info/PKG-INFO
writing top-level names to voltron.egg-info/top_level.txt
writing dependency_links to voltron.egg-info/dependency_links.txt
writing entry points to voltron.egg-info/entry_points.txt
reading manifest file 'voltron.egg-info/SOURCES.txt'
writing manifest file 'voltron.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
warning: build_py: byte-compiling is disabled, skipping.

warning: install_lib: byte-compiling is disabled, skipping.

installing package data to build/bdist.linux-x86_64/egg
running install_data
warning: install_data: setup script did not provide a directory for 'voltron.gdb' -- installing right in 'build/bdist.linux-x86_64/egg'

error: can't copy 'voltron.gdb': doesn't exist or not a regular file

There is no voltran.gdb file in the repository. Maybe I've missed something?

Unable to use voltron on OS X 10.8.5 + gdb 7.6.1 installed with brew

Note that I didn't try with stock gdb.

Here is what I get:

GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin12.5.0".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /Users/greedo/Projects/PackedArray/bin/Darwin-x86_64/PackedArraySelfTest...Reading symbols from /Users/greedo/Projects/PackedArray/bin/Darwin-x86_64/PackedArraySelfTest.dSYM/Contents/Resources/DWARF/PackedArraySelfTest...done.
done.
(gdb) source /Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/d
dbgentry.py   dbgentry.pyc
(gdb) source /Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/dbgentry.py
Voltron loaded.
(gdb) voltron enable debug
Debug logging enabled
(gdb) voltron start
Starting voltron
(gdb) voltron status
Python Exception <type 'exceptions.AttributeError'> 'NoneType' object has no attribute 'clients':
Error occurred in Python command: 'NoneType' object has no attribute 'clients'
(gdb) voltron stop
Stopping voltron
voltron: [DEBUG] Server thread is not running
(gdb)

It says logging has been enabled but I couldn't find a log file. Where should I look?

Implicitly Setting an Architecture

I have issues (Ubu 14.04, lldb 3.7) with voltron views recognizing architecture types. I tried compiling from both clang and gcc.

file reports: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=, not stripped

I am thinking about just modifying register.py to implicitly set an architecture - I could submit a pull request if there's no resources to support this. I realize this is more a feature request than a bug. It looks like we could possibly just add an argument to configure_subparser and then I would have to spend a few minutes digging into where targets sets it to propagate properly. Shouldn't be too difficult. Let me know if you think i should just do it and submit a pull request.

Regards,

-- q

voltron status command complain about this with lldb on Mac OSX Yosemite(10.10.3)

Voltron status command complain about this with lldb on Mac OSX Yosemite(10.10.3). Is this a problem? Can you fix this?

It seems voltron was successfully loaded when lldb started, but failed create socket

voltron git:(master) ✗ lldb
Voltron loaded.
Run voltron init after you load a target.
(lldb) voltron init
Registered stop-hook
(lldb)

(lldb) voltron status
The following listeners are active:
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/dbgentry.py", line 157, in lldb_invoke
env_dict['cmd'].invoke(debugger, command, result, env_dict)
File "/Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/dbgentry.py", line 122, in invoke
self.handle_command(command)
File "/Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/dbgentry.py", line 54, in handle_command
self.status()

File "/Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/dbgentry.py", line 78, in status
print(" domain socket ({})".format(voltron.env['sock']))
File "build/bdist.macosx-10.10-intel/egg/scruffy/env.py", line 49, in getitem
KeyError: 'sock'
(lldb)

And, my disassembly view has no color but the other views do, How can I fix this?

Thanks advance~

Assertion failed: (semantics == (const llvm::fltSemantics*)&IEEEdouble && "Float semantics are not IEEEdouble"), function convertToDouble, file /Users/wd/code/lldb/llvm/lib/Support/APFloat.cpp, line 3128.

Hi

when i debug iphone app the following error happend.

"Assertion failed: (semantics == (const llvm::fltSemantics*)&IEEEdouble && "Float semantics are not IEEEdouble"), function convertToDouble, file /Users/wd/code/lldb/llvm/lib/Support/APFloat.cpp, line 3128."

my code is
sysadmindeiMac:~ sysadmin$ lldb
(lldb) command script import /Library/Python/2.7/site-packages/voltron-0.1-py2.7.egg/dbgentry.py
Voltron loaded.
Run voltron init after you load a target.
(lldb) process connect connect://192.168.2.83:1234
Process 1313 stopped

  • thread #1: tid = 0xf2e1, 0x319a9474 libsystem_kernel.dylibmach_msg_trap + 20, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP frame #0: 0x319a9474 libsystem_kernel.dylibmach_msg_trap + 20
    libsystem_kernel.dylib`mach_msg_trap:
    -> 0x319a9474 <+20>: pop {r4, r5, r6, r8}
    0x319a9478 <+24>: bx lr

libsystem_kernel.dylibmach_msg_overwrite_trap: 0x319a947c <+0>: mov r12, sp 0x319a9480 <+4>: push {r4, r5, r6, r8} (lldb) c Process 1313 resuming (lldb) voltron init Registered stop-hook (lldb) br s -S onAction: Breakpoint 1: where = DevApp-[ViewController onAction:], address = 0x000baa64
Process 1313 stopped

  • thread #1: tid = 0xf2e1, 0x000baa64 DevApp-[ViewController onAction:], queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x000baa64 DevApp-[ViewController onAction:]
    DevApp`-[ViewController onAction:]:
    -> 0xbaa64 <+0>: push {r7, lr}
    0xbaa66 <+2>: mov r7, sp
    0xbaa68 <+4>: sub sp, #0xc
    0xbaa6a <+6>: mov r3, sp
    (lldb) Assertion failed: (semantics == (const llvm::fltSemantics*)&IEEEdouble && "Float semantics are not IEEEdouble"), function convertToDouble, file /Users/wd/code/lldb/llvm/lib/Support/APFloat.cpp, line 3128.
    Abort trap: 6
    sysadmindeiMac:~ sysadmin$

$ voltron view stack
$ voltron view backtrace

test environment
iphone 5c, ios 8.3 ,mac ox 10.10

thanks

debian 8 + voltron

 cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
gdb --version
GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1

cd /tmp
sudo apt-get install libreadline6-dev python3-dev python3-setuptools python3-yaml
mkdir bug
cd bug/
virtualenv -p python3 env
source env/bin/activate
git clone https://github.com/snare/voltron.git
cd voltron
python3 setup.py install
....
....
#Download error on https://pypi.python.org/simple/MarkupSafe/: [Errno 113] No route to host -- Some #packages may not be found!
pip install --upgrade pip
pip install MarkupSafe
python3 setup.py install
Finished processing dependencies for voltron==0.1 (ok?)

cp voltron/voltron/config/default.cfg  ~/.voltron/config

$gdb
source voltron/dbgentry.py
Exception <type 'exceptions.ImportError'> raised while loading Voltron: No module named blessed

Voltron should be easier to install

Getting exceptions like: 'Exception <class 'ImportError'> raised while loading Voltron: No module named 'blessed'
Should not occur, as the install.py should take care of this.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.