machobot icon indicating copy to clipboard operation
machobot copied to clipboard

A Python toolbox for Mach-O files analysis.

machobot

.. image:: https://travis-ci.org/rodionovd/machobot.svg?branch=master :target: https://travis-ci.org/rodionovd/machobot .. image:: https://codeclimate.com/github/rodionovd/machobot/badges/gpa.svg :target: https://codeclimate.com/github/rodionovd/machobot :alt: Code Climate

A Python toolbox for Mach-O files analysis. Heavily relies on macholib.

Installation

For usage '''''''''

::

$ [sudo] pip install machobot

For development '''''''''''''''

::

$ pip install nose macholib
$ git clone https://github.com/rodionovd/machobot.git machobot
$ cd ./machobot
$ nosetests # run the test suite

Usage

  • As a command-line util:

    .. code:: bash

    $ inject_dylib ./target "@rpath/mylib.dylib"
    
  • As a Python module:

    .. code:: python

    import machobot
    

    Example usage:

    .. code:: python

    import machobot.dylib as dylib
    
    dylib.insert_load_command("output.a", "@executable_path/../../libk.dylib")
    

Modules

dylib '''''''''

.. code:: python

   insert_load_command (target_path, library_install_name)

Inserts a new LC_LOAD_DYLIB load command into the target Mach-O header.

+----------------------------+-------------------------------------------------------------------------------------------------+ | Argument | Description | +============================+=================================================================================================+ | target_path | A path to the target Mach-O executable file. This file will be overwritten. | +----------------------------+-------------------------------------------------------------------------------------------------+ | library_install_name | An install name for the library to inject. This string is used as a part of the load command. | +----------------------------+-------------------------------------------------------------------------------------------------+

+-----------------------------------------------------------------------+ | Return value | +=======================================================================+ | Returns True if everything is OK. Otherwise rises an exception. | +-----------------------------------------------------------------------+

.. code:: python

   macho_dependencies_list (target_path, header_magic=None)

Generates a list of libraries the given Mach-O file depends on.

In that list a single library is represented by its "install path": for some libraries it would be a full file path, and for others it would be a relative path (sometimes with dyld templates like @executable_path or @rpath in it).

Note: I don't know any reason why would some architectures of a fat Mach-O depend on certain libraries while others don't, but it's technically possible. So that's why you may want to specify the header_magic value for a particular header.

+----------------------------+-------------------------------------------------------------------------------------------------+ | Argument | Description | +============================+=================================================================================================+ | target_path | A path to the target Mach-O executable file. | +----------------------------+-------------------------------------------------------------------------------------------------+ | header_magic | Mach-O MAGIC value for a header you want to inspect. If this argument is not provided, the | | | function returns a list of the first header's dependencies. | +----------------------------+-------------------------------------------------------------------------------------------------+

+-----------------------------------------------------------------------+ | Return value | +=======================================================================+ | An object with two properties: weak and strong that hold lists| | of weak and strong dependencies respectively. | +-----------------------------------------------------------------------+

See machobot/tests/test_dylib.py for usage examples.


Found an issue? Submit an issue! :shipit: