├── setup.cfg ├── docs ├── requirements.txt ├── _static │ └── images │ │ ├── deleting.gif │ │ ├── welcome.gif │ │ ├── config_main_window.gif │ │ ├── currently_applied.gif │ │ ├── add_single_function.gif │ │ ├── check_all_functions.gif │ │ ├── add_multiple_functions.gif │ │ ├── check_single_function.gif │ │ ├── view_history_check_all.gif │ │ ├── view_history_check_one.gif │ │ ├── view_history_function.gif │ │ ├── view_history_management.gif │ │ ├── ida_view_right_click_popup.gif │ │ └── view_history_currently_applied.gif ├── api │ ├── first │ │ ├── db.rst │ │ ├── info.rst │ │ ├── model.rst │ │ ├── metadata.rst │ │ ├── callbacks.rst │ │ ├── metadatashim.rst │ │ ├── configuration.rst │ │ ├── metadataserver.rst │ │ └── server.rst │ ├── ui │ │ ├── upload.rst │ │ ├── generic.rst │ │ ├── history.rst │ │ ├── welcome.rst │ │ ├── check-all.rst │ │ ├── check.rst │ │ ├── requests.rst │ │ ├── upload-all.rst │ │ └── shared-objects.rst │ └── index.rst ├── scripting.rst ├── index.rst ├── currently-applied.rst ├── deleting.rst ├── configuring.rst ├── view-history.rst ├── checking.rst ├── adding.rst ├── installing.rst ├── Makefile ├── make.bat └── conf.py ├── MANIFEST.in ├── README.rst ├── .gitignore ├── first_plugin_ida └── __init__.py ├── setup.py └── LICENSE /setup.cfg: -------------------------------------------------------------------------------- 1 | [bdist_wheel] 2 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | sphinxcontrib-napoleon 2 | -------------------------------------------------------------------------------- /docs/_static/images/deleting.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/deleting.gif -------------------------------------------------------------------------------- /docs/_static/images/welcome.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/welcome.gif -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | # Include the license file 2 | include LICENSE.txt 3 | 4 | # Include the data files 5 | recursive-include data * 6 | -------------------------------------------------------------------------------- /docs/_static/images/config_main_window.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/config_main_window.gif -------------------------------------------------------------------------------- /docs/_static/images/currently_applied.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/currently_applied.gif -------------------------------------------------------------------------------- /docs/_static/images/add_single_function.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/add_single_function.gif -------------------------------------------------------------------------------- /docs/_static/images/check_all_functions.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/check_all_functions.gif -------------------------------------------------------------------------------- /docs/_static/images/add_multiple_functions.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/add_multiple_functions.gif -------------------------------------------------------------------------------- /docs/_static/images/check_single_function.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/check_single_function.gif -------------------------------------------------------------------------------- /docs/_static/images/view_history_check_all.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/view_history_check_all.gif -------------------------------------------------------------------------------- /docs/_static/images/view_history_check_one.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/view_history_check_one.gif -------------------------------------------------------------------------------- /docs/_static/images/view_history_function.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/view_history_function.gif -------------------------------------------------------------------------------- /docs/_static/images/view_history_management.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/view_history_management.gif -------------------------------------------------------------------------------- /docs/_static/images/ida_view_right_click_popup.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/ida_view_right_click_popup.gif -------------------------------------------------------------------------------- /docs/_static/images/view_history_currently_applied.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cisco-Talos/FIRST-plugin-ida/HEAD/docs/_static/images/view_history_currently_applied.gif -------------------------------------------------------------------------------- /docs/api/first/db.rst: -------------------------------------------------------------------------------- 1 | =========== 2 | FIRST :: DB 3 | =========== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRST 6 | :noindex: 7 | :members: DB 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/first/info.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | FIRST :: Info 3 | ============= 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRST 6 | :noindex: 7 | :members: Info 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/first/model.rst: -------------------------------------------------------------------------------- 1 | ============== 2 | FIRST :: Model 3 | ============== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRST 6 | :noindex: 7 | :members: Model 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/ui/upload.rst: -------------------------------------------------------------------------------- 1 | ================= 2 | FIRSTUI :: Upload 3 | ================= 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRSTUI 6 | :noindex: 7 | :members: Upload 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/first/metadata.rst: -------------------------------------------------------------------------------- 1 | ================= 2 | FIRST :: Metadata 3 | ================= 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRST 6 | :noindex: 7 | :members: Metadata 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/ui/generic.rst: -------------------------------------------------------------------------------- 1 | ================== 2 | FIRSTUI :: Generic 3 | ================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRSTUI 6 | :noindex: 7 | :members: Generic 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/ui/history.rst: -------------------------------------------------------------------------------- 1 | ================== 2 | FIRSTUI :: History 3 | ================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRSTUI 6 | :noindex: 7 | :members: History 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/ui/welcome.rst: -------------------------------------------------------------------------------- 1 | ================== 2 | FIRSTUI :: Welcome 3 | ================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRSTUI 6 | :noindex: 7 | :members: Welcome 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/first/callbacks.rst: -------------------------------------------------------------------------------- 1 | ================== 2 | FIRST :: Callbacks 3 | ================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRST 6 | :noindex: 7 | :members: Callbacks 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/ui/check-all.rst: -------------------------------------------------------------------------------- 1 | =================== 2 | FIRSTUI :: CheckAll 3 | =================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRSTUI 6 | :noindex: 7 | :members: CheckAll 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/ui/check.rst: -------------------------------------------------------------------------------- 1 | ================ 2 | FIRSTUI :: Check 3 | ================ 4 | 5 | 6 | .. autoclass:: first_plugin_ida.first.FIRSTUI 7 | :noindex: 8 | :members: Check 9 | :undoc-members: 10 | -------------------------------------------------------------------------------- /docs/api/ui/requests.rst: -------------------------------------------------------------------------------- 1 | =================== 2 | FIRSTUI :: Requests 3 | =================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRSTUI 6 | :noindex: 7 | :members: Requests 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/ui/upload-all.rst: -------------------------------------------------------------------------------- 1 | ==================== 2 | FIRSTUI :: UploadAll 3 | ==================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRSTUI 6 | :noindex: 7 | :members: UploadAll 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/first/metadatashim.rst: -------------------------------------------------------------------------------- 1 | ===================== 2 | FIRST :: MetadataShim 3 | ===================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRST 6 | :noindex: 7 | :members: MetadataShim 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/first/configuration.rst: -------------------------------------------------------------------------------- 1 | ====================== 2 | FIRST :: Configuration 3 | ====================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRST 6 | :noindex: 7 | :members: Configuration 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/first/metadataserver.rst: -------------------------------------------------------------------------------- 1 | ======================= 2 | FIRST :: MetadataServer 3 | ======================= 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRST 6 | :noindex: 7 | :members: MetadataServer 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/api/ui/shared-objects.rst: -------------------------------------------------------------------------------- 1 | ======================== 2 | FIRSTUI :: SharedObjects 3 | ======================== 4 | 5 | .. autoclass:: first_plugin_ida.first.FIRSTUI 6 | :noindex: 7 | :members: SharedObjects 8 | :undoc-members: 9 | -------------------------------------------------------------------------------- /docs/scripting.rst: -------------------------------------------------------------------------------- 1 | .. _ida-scripting: 2 | 3 | ARCHIVED PROJECT 4 | ================ 5 | 6 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 7 | 8 | ====================== 9 | Scripting FIRST in IDA 10 | ====================== 11 | 12 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. ida-index: 2 | 3 | ======================= 4 | FIRST IDA Python Plugin 5 | ======================= 6 | 7 | ARCHIVED PROJECT 8 | ================== 9 | 10 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 11 | 12 | .. _ida-docs: 13 | 14 | .. toctree:: 15 | :maxdepth: 2 16 | :caption: IDA Pro Integration 17 | 18 | installing 19 | configuring 20 | adding 21 | deleting 22 | checking 23 | view-history 24 | currently-applied 25 | scripting 26 | api/index 27 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ARCHIVED PROJECT 2 | ================ 3 | 4 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 5 | 6 | FIRST IDA Pro Integration 7 | ========================= 8 | Function Identification and Recovery Signature Tool 9 | 10 | This project provides a Python plugin for IDA Pro. Make sure your environment 11 | meets the requirements. Using pip to install this package will ensure the 12 | minimum system requirements are met. If you are installing this manually then 13 | follow the in-depth guide for installation. 14 | 15 | Check out the docs at http://first-plugin-ida.readthedocs.io 16 | -------------------------------------------------------------------------------- /docs/api/index.rst: -------------------------------------------------------------------------------- 1 | ========================= 2 | IDA Integration FIRST API 3 | ========================= 4 | 5 | The below shows autodocs?? 6 | Yay, It works!! 7 | 8 | .. autoclass:: first_plugin_ida.first.FIRST 9 | :noindex: 10 | :members: initialize 11 | 12 | .. toctree:: 13 | :maxdepth: 2 14 | :caption: IDA UI Components 15 | 16 | ui/generic 17 | ui/welcome 18 | ui/check 19 | ui/check-all 20 | ui/upload 21 | ui/upload-all 22 | ui/requests 23 | ui/history 24 | ui/shared-objects 25 | 26 | 27 | .. toctree:: 28 | :maxdepth: 2 29 | :caption: FIRST Core 30 | 31 | first/callbacks 32 | first/configuration 33 | first/db 34 | first/info 35 | first/metadata 36 | first/metadataserver 37 | first/metadatashim 38 | first/model 39 | first/server 40 | -------------------------------------------------------------------------------- /docs/currently-applied.rst: -------------------------------------------------------------------------------- 1 | .. _ida-currently-applied: 2 | 3 | ARCHIVED PROJECT 4 | ================ 5 | 6 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 7 | 8 | ================= 9 | Currently Applied 10 | ================= 11 | 12 | Some times during analysis it can be very useful to know what annotations from FIRST where applied to the IDB. Additionaly, it could help quickly track down some functionality of interest. To aid in this, a user can go to the main FIRST plugin in window (press **1** from the IDA View window or through IDA Pro's menus: **Edit** > **Plugins** > **FIRST**). Once at the main FIRST plugin window, select the **Currently Applied** tab from the left panel. 13 | 14 | 15 | .. figure:: _static/images/currently_applied.gif 16 | :align: center 17 | :alt: Go to Function from Currently Applied 18 | 19 | Go to Function from Currently Applied 20 | -------------------------------------------------------------------------------- /docs/api/first/server.rst: -------------------------------------------------------------------------------- 1 | =============== 2 | FIRST :: Server 3 | =============== 4 | 5 | .. py:function:: data_callback_prototype(thread, response) 6 | 7 | Function prototype for data_callback arguments. 8 | 9 | :param threading.Thread thread: The thread associated with the server 10 | operation. 11 | :param requests.models.response response: The response from the server 12 | in JSON form. 13 | 14 | 15 | .. py:function:: complete_callback_prototype(thread, data) 16 | 17 | Function prototype for complete_callback arguments. This function should 18 | call ``FIRST.server.remove_operation`` to ensure data is released once it is 19 | not needed. 20 | 21 | :param threading.Thread thread: The thread associated with the server 22 | operation. 23 | :param dict data: All data received from the server. 24 | 25 | .. autoclass:: first_plugin_ida.first.FIRST 26 | :noindex: 27 | :members: Server 28 | :undoc-members: 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | *.egg-info/ 23 | .installed.cfg 24 | *.egg 25 | 26 | # PyInstaller 27 | # Usually these files are written by a python script from a template 28 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 29 | *.manifest 30 | *.spec 31 | 32 | # Installer logs 33 | pip-log.txt 34 | pip-delete-this-directory.txt 35 | 36 | # Unit test / coverage reports 37 | htmlcov/ 38 | .tox/ 39 | .coverage 40 | .coverage.* 41 | .cache 42 | nosetests.xml 43 | coverage.xml 44 | *,cover 45 | 46 | # Translations 47 | *.mo 48 | *.pot 49 | 50 | # Django stuff: 51 | *.log 52 | 53 | # Sphinx documentation 54 | docs/_build/ 55 | docs/_build_html/ 56 | 57 | # PyBuilder 58 | target/ 59 | -------------------------------------------------------------------------------- /docs/deleting.rst: -------------------------------------------------------------------------------- 1 | .. _ida-deleting: 2 | 3 | ARCHIVED PROJECT 4 | ================ 5 | 6 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 7 | 8 | ========================= 9 | Deleting Your Annotations 10 | ========================= 11 | 12 | .. important:: 13 | 14 | It is important to note you can only delete annotations you've created. Applying someone else's annotations to a function and modifying it will make a new annoations tied to you and not the original creator. 15 | 16 | To manange the annotations you've created and have added to FIRST open the FIRST plugin main window. To access the plugin's main window, users can either press **1** from a IDA Pro View window or by the IDA Pro Edit menu (Edit > Plugins > FIRST). Once the main window is open select the **Management** tab from the left panel. The plugin will query the server for all metadata you have added. This data will be populated in a tree view to allow you to view an organized list of your metadata. To delete an annotation, either right click and select **Delete** or press the Delete key. 17 | 18 | .. figure:: _static/images/deleting.gif 19 | :align: center 20 | :alt: Query FIRST for All Functions 21 | 22 | Query FIRST for All Functions 23 | -------------------------------------------------------------------------------- /docs/configuring.rst: -------------------------------------------------------------------------------- 1 | .. _ida-configuring: 2 | 3 | ARCHIVED PROJECT 4 | ================ 5 | 6 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 7 | 8 | =========== 9 | Configuring 10 | =========== 11 | FIRST plugin can be configured in three ways; the Welcome dialog box when initially installed, the plugin main window and manually modifying the config file (no recommend for most). 12 | 13 | Initial Installation 14 | ==================== 15 | When FIRST is initially installed and IDA is loaded a *Welcome* dialog box will appear. This only appears when FIRST is not configured. 16 | 17 | **Notice: public server moved to first.talosintelligence.com:443.** 18 | 19 | .. figure:: _static/images/welcome.gif 20 | :align: center 21 | :alt: FIRST welcome dialog box (with invalid API key) 22 | 23 | FIRST welcome dialog box (with invalid API key) 24 | 25 | 26 | The configuration requires a valid API key that can be obtained from the server (go to first.talosintelligence.com to register with public server). Make sure to test the connection and select **Save** 27 | 28 | Plugin Main Window 29 | ================== 30 | To access the plugin's main window, users can either press **1** from a IDA Pro View window or by the IDA Pro Edit menu (Edit > Plugins > FIRST). Once the main window is open select the **Configuration** tab from the left panel. From here the connection details can be updated. Selecting the **Test** button will test if a connection to FIRST can be made. However, it does not save and use that server connection until the **Save** button is selected. 31 | 32 | .. figure:: _static/images/config_main_window.gif 33 | :align: center 34 | :alt: FIRST Server Configuration (with invalid API key) 35 | 36 | FIRST Server Configuration (with invalid API key) 37 | -------------------------------------------------------------------------------- /docs/view-history.rst: -------------------------------------------------------------------------------- 1 | .. _ida-view-history: 2 | 3 | ARCHIVED PROJECT 4 | ================ 5 | 6 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 7 | 8 | ===================== 9 | View Metadata History 10 | ===================== 11 | The history for metadata can be viewed in several different places. 12 | - A match in a Query FIRST operation (Check Function or Check All Functions dialog box) 13 | - The management and currently applied view of the main FIRST plugin window 14 | - A function with FIRST metadata applied from the IDA View window via the right click menu 15 | 16 | The Check Function/Check All Functions dialog boxes and Currently Applied/Management views use a tree structure to display function annotations. Right click anywhere within the record for an annotation to open the popup menu. In this menu select the **View History** operation and a new dialog box will open up displaying the revisions made to the annotations by the original author. 17 | 18 | .. figure:: _static/images/view_history_check_one.gif 19 | :align: center 20 | :alt: View History from Check Function Dialog Box 21 | 22 | View History from Check Function Dialog Box 23 | 24 | .. figure:: _static/images/view_history_check_all.gif 25 | :align: center 26 | :alt: View History from Check All Functions Dialog Box 27 | 28 | View History from Check All Functions Dialog Box 29 | 30 | .. figure:: _static/images/view_history_currently_applied.gif 31 | :align: center 32 | :alt: View History from Currently Applied View 33 | 34 | View History from Currently Applied View 35 | 36 | .. figure:: _static/images/view_history_management.gif 37 | :align: center 38 | :alt: View History from Management View 39 | 40 | View History from Management View 41 | 42 | When annotations from FIRST are applied to a function, a new right click menu option becomes available. The **View metadata history** operation will open a dialog box with the revision history. 43 | 44 | .. figure:: _static/images/view_history_function.gif 45 | :align: center 46 | :alt: View History from Function with FIRST Annotations 47 | 48 | View History from Function with FIRST Annotations 49 | -------------------------------------------------------------------------------- /first_plugin_ida/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | import platform 3 | import shutil 4 | 5 | # Third party Module, should be installed by prerequisites 6 | import requests 7 | 8 | class ExitException(Exception): 9 | pass 10 | 11 | def main(): 12 | print ( 'FIRST: Function Identification and Recovery Signature Tool\n' 13 | 'IDA Pro Integration\n' 14 | 'Requirements: \n' 15 | '- IDA Pro 6.9 sp1 or higher\n' 16 | '- Admin Privileges\n' 17 | ' (usually needed to copy plugin into IDA directory)\n\n') 18 | 19 | try: 20 | first_dir = os.path.dirname(__file__) 21 | first_path = os.path.join(first_dir, 'first.py') 22 | 23 | ida_plugin_path = raw_input('Enter full path to IDA\'s plugins folder: ') 24 | if not os.path.exists(ida_plugin_path): 25 | print '[Error] Path provided does not exist.' 26 | raise ExitException() 27 | 28 | if not os.path.isdir(ida_plugin_path): 29 | print '[Error] Path provided is not a directory.' 30 | raise ExitException() 31 | 32 | if (os.name == 'posix') and (platform.system() == 'Darwin'): 33 | # Install for Mac 34 | 35 | requests_path = os.path.dirname(requests.__file__) 36 | ida_path = os.path.dirname(ida_plugin_path) 37 | 38 | # Copy requests to IDA's python folder 39 | print '- Copying FIRST dependencies to IDA\'s python folder...' 40 | cmd = 'cp -r {} {}/python/requests/'.format(requests_path, ida_path) 41 | os.system(cmd) 42 | 43 | 44 | elif (os.name == 'nt') and (platform.system() == 'Windows'): 45 | # Install for Windows - no additional steps required 46 | pass 47 | 48 | #elif (os.name == 'posix') and (platform.system() == 'Linux'): 49 | # Currently not supported due to having no ida to bring in the 50 | #dependencies for Linux 51 | 52 | else: 53 | # Doesn't support other systems 54 | print '- Unfortunately the current OS is not supported.' 55 | raise ExitException() 56 | 57 | # Copy plugin to IDA's plugin directory 58 | shutil.copy(first_path, ida_plugin_path) 59 | msg = ( '- FIRST\'s IDA Pro Integration has been installed. Plugin is\n' 60 | ' located at:\n {}') 61 | print msg.format(os.path.join(ida_plugin_path, 'first.py')) 62 | 63 | except ExitException: 64 | pass 65 | 66 | finally: 67 | print '...exiting...' 68 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | """A setuptools based setup module. 2 | 3 | See: 4 | https://packaging.python.org/en/latest/distributing.html 5 | https://github.com/pypa/sampleproject 6 | """ 7 | 8 | # Always prefer setuptools over distutils 9 | from setuptools import setup, find_packages 10 | # To use a consistent encoding 11 | from codecs import open 12 | from os import path 13 | 14 | here = path.abspath(path.dirname(__file__)) 15 | 16 | # Get the long description from the README file 17 | with open(path.join(here, 'README.rst'), encoding='utf-8') as f: 18 | long_description = f.read() 19 | 20 | setup( 21 | name='first-plugin-ida', 22 | 23 | # Versions should comply with PEP440. For a discussion on single-sourcing 24 | # the version across setup.py and the project code, see 25 | # https://packaging.python.org/en/latest/single_source_version.html 26 | version='0.1.1', 27 | 28 | description='FIRST Integration: IDA Pro', 29 | long_description=long_description, 30 | 31 | # The project's main homepage. 32 | url='https://github.com/vrtadmin/FIRST-plugin-ida', 33 | 34 | # Author details 35 | author='Angel M. Villegas', 36 | author_email='first_@googlegroups.com', 37 | 38 | # Choose your license 39 | license='GPLv2', 40 | 41 | # See https://pypi.python.org/pypi?%3Aaction=list_classifiers 42 | classifiers=[ 43 | # How mature is this project? Common values are 44 | # 3 - Alpha 45 | # 4 - Beta 46 | # 5 - Production/Stable 47 | 'Development Status :: 4 - Beta', 48 | 49 | # Indicate who your project is intended for 50 | 'Intended Audience :: Information Technology', 51 | 'Topic :: Software Development :: User Interfaces', 52 | 53 | # Pick your license as you wish (should match "license" above) 54 | 'License :: OSI Approved :: GNU General Public License v2 (GPLv2)', 55 | 56 | # Specify the Python versions you support here. In particular, ensure 57 | # that you indicate whether you support Python 2, Python 3 or both. 58 | 'Programming Language :: Python :: 2.7', 59 | ], 60 | 61 | # What does your project relate to? 62 | keywords='first 1st reverse engineering ida pro', 63 | 64 | # You can just specify the packages manually here if your project is 65 | # simple. Or you can use find_packages(). 66 | packages=find_packages(exclude=['contrib', 'docs', 'tests']), 67 | 68 | # Alternatively, if you want to distribute just a my_module.py, uncomment 69 | # this: 70 | # py_modules=["my_module"], 71 | 72 | # List run-time dependencies here. These will be installed by pip when 73 | # your project is installed. For an analysis of "install_requires" vs pip's 74 | # requirements files see: 75 | # https://packaging.python.org/en/latest/requirements.html 76 | install_requires=['requests'], 77 | 78 | # List additional groups of dependencies here (e.g. development 79 | # dependencies). You can install these using the following syntax, 80 | # for example: 81 | # $ pip install -e .[dev,test] 82 | extras_require={ 83 | #'dev': ['check-manifest'], 84 | #'test': ['coverage'], 85 | }, 86 | 87 | # If there are data files included in your packages that need to be 88 | # installed, specify them here. If using Python 2.6 or less, then these 89 | # have to be included in MANIFEST.in as well. 90 | package_data={ 91 | #'sample': ['package_data.dat'], 92 | }, 93 | 94 | # Although 'package_data' is the preferred approach, in some case you may 95 | # need to place data files outside of your packages. See: 96 | # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files # noqa 97 | # In this case, 'data_file' will be installed into '/my_data' 98 | data_files=[ 99 | #('my_data', ['data/data_file']) 100 | ], 101 | 102 | # To provide executable scripts, use entry points in preference to the 103 | # "scripts" keyword. Entry points provide cross-platform support and allow 104 | # pip to create the appropriate form of executable for the target platform. 105 | entry_points={ 106 | 'console_scripts': [ 107 | 'first-plugin-ida=first_plugin_ida:main', 108 | ], 109 | }, 110 | ) 111 | -------------------------------------------------------------------------------- /docs/checking.rst: -------------------------------------------------------------------------------- 1 | .. _ida-checking: 2 | 3 | ARCHIVED PROJECT 4 | ================ 5 | 6 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 7 | 8 | ======================== 9 | Checking for Annotations 10 | ======================== 11 | 12 | To check for a single or all functions in your IDB, you can use the right click menu in the IDA View window. Simply right click anywhere in the IDA View window and select **Check FIRST for this function** or **Query FIRST for all function matches**. 13 | 14 | .. figure:: _static/images/ida_view_right_click_popup.gif 15 | :align: center 16 | :alt: FIRST's IDA Integration Right Click Menu 17 | 18 | FIRST's IDA Integration Right Click Menu 19 | 20 | The dialog boxes associated with querying FIRST for one or all functions are similar in a lot of ways. Both use two colors to signify if the match is currently applied and what match is selected. 21 | 22 | .. list-table:: 23 | :header-rows: 1 24 | 25 | * - Color Property 26 | - Meaning 27 | * - Applied 28 | - The match is currently applied to the function it is a match for. This does not mean your local IDB is synced up with the latest version of the metadata associated with the match. Selecting it again will ensure the latest annoations are applied to your IDB 29 | * - Selected 30 | - The function has been selected to be added to FIRST. To select a function, just click on it in the list of function. To deselect a function, clikc on it once more. 31 | 32 | Query for Single Function 33 | ========================= 34 | To check FIRST for a single function, right click any where within the IDA View window of a valid function. 35 | 36 | .. note:: 37 | 38 | A valid function is a function that IDA Pro was able to interpret as a function. If you are viewing disassembly in Graph mode them anywhere in the window will is valid. However, if you are viewing disassembly in Text mode then the address corresponding to the instruction selected should be associated with a function (this is indicated by the black color instruction address' text). 39 | 40 | Once the popup menu is shown, select **Check FIRST for this function**. The Check Function dialog box will pop up and any matches (exact or similar) will be displayed in a tree structure. 41 | 42 | .. figure:: _static/images/check_single_function.gif 43 | :align: center 44 | :alt: Query FIRST for Single Function 45 | 46 | Query FIRST for Single Function 47 | 48 | 49 | Query for All Functions 50 | ======================= 51 | To query FIRST for all functions in the IDB, right click any where within the IDA View window. Once the popup menu is shown, select **Query FIRST for all function matches**. The Check all Functions dialog box will pop up with a list of matches for functions within the IDB. While results are being populated, you can go through an look at each match. 52 | 53 | The tree view is used to display the data in a meaniful way. The top most layer shows the address and current function name the matches correspond to. The next column displays the number of matches to that function. Expanding that node will show the matches and their details. Selecting to expand a match node will display the comment associated with that match. 54 | 55 | .. note:: 56 | 57 | Selecting **Show only "sub_" functions** and **Select Highest Ranked** in either order will cause only the function starting with **sub_** to be selected. 58 | 59 | FIRST will not query for all functions at once. Instead all functions are grouping in sets of 20 and each set is set to the server. This will allow results to be returned and the researcher to start looking over the results. As new matches are returned the data will be added. 60 | 61 | To help understand if the match makes sense, right click anywhere within the function tree node or its matches, and click **Go to Function**. This will focus the last used IDA View window on the function in question. 62 | 63 | After reviewing your selection, select the **Apply** button. If no errors occured the selected matches will be applied to your function(s) and the Output window will state how many functions were applied with FIRST annotations. 64 | 65 | .. important:: 66 | 67 | If multiple functions attempt to apply the same match, then only the function first applied with the annotations will change. IDA Pro will prompt you with each additional function that the metadata cannot be applied to. The Output window will display the addresses of the functions that metadata couldn't be applied to. 68 | 69 | .. danger:: 70 | 71 | Selecting to apply annotations to your functions will overwrite any annotations currently applied. There is no UNDO for this operation. Also, when applying a function metadata to your IDB's function, this could result in incorrect function prototypes (for similar and possibly exact matches). 72 | 73 | .. figure:: _static/images/check_all_functions.gif 74 | :align: center 75 | :alt: Query FIRST for All Functions 76 | 77 | Query FIRST for All Functions 78 | -------------------------------------------------------------------------------- /docs/adding.rst: -------------------------------------------------------------------------------- 1 | .. _ida-adding: 2 | 3 | ARCHIVED PROJECT 4 | ================ 5 | 6 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 7 | 8 | ================== 9 | Adding Annotations 10 | ================== 11 | To add your own annotations for a function or several functions to FIRST you can use the right click menu in the IDA View window. Simply right click anywhere in the IDA View window and select **Add this function to FIRST** or **Add multiple functions to FIRST**. 12 | 13 | .. figure:: _static/images/ida_view_right_click_popup.gif 14 | :align: center 15 | :alt: FIRST's IDA Integration Right Click Menu 16 | 17 | FIRST's IDA Integration Right Click Menu 18 | 19 | Adding a Single Function 20 | ======================== 21 | To add a single function, right click any where within the IDA View window of a valid function. 22 | 23 | .. note:: 24 | 25 | A valid function is a function that IDA Pro was able to interpret as a function. If you are viewing disassembly in Graph mode them anywhere in the window will is valid. However, if you are viewing disassembly in Text mode then the address corresponding to the instruction selected should be associated with a function (this is indicated by the black color instruction address' text). 26 | 27 | Once the popup menu is shown, select **Add this function to FIRST**. The Add function metadata dialog box will pop up with the annotations associated with the function. The annotations cannot be modified in this dialog box, it is only for review purposes. If the annotations need to be changed then close the dialog box and update the function in IDA and add the function once the function annotations are to your liking. After reviewing the annotations select the **Upload** button. If no errors occured your function annotations will be added to FIRST and the Output window will state how many functions were added to FIRST. 28 | 29 | .. figure:: _static/images/add_single_function.gif 30 | :align: center 31 | :alt: Add a Single Function to FIRST 32 | 33 | Add a Single Function to FIRST 34 | 35 | 36 | Adding Multiple Function at Once 37 | ================================ 38 | To add multiple functions, right click any where within the IDA View window. Once the popup menu is shown, select **Add multiple functions to FIRST**. The Mass Function Upload dialog box will pop up with a list of a majority, if not all, functions defined in IDA Pro. 39 | 40 | .. note:: 41 | 42 | FIRST skips any function that is a wrapper for a jmp instruction. 43 | 44 | .. code:: 45 | 46 | .text:100023C5 sub_100023C5 proc near 47 | .text:100023C5 jmp short loc_100023D6 48 | .text:100023C7 sub_100023C5 endp 49 | 50 | The dialog box uses a couple of different colors to signify various properties associated with a given function, its state or changes in its metadata. 51 | 52 | .. list-table:: 53 | :header-rows: 1 54 | 55 | * - Color Property 56 | - Meaning 57 | * - Changed 58 | - The function's metadata has changed. This will apply in a couple of situations; [1] if the function previous had metadata from FIRST applied to it but you changed it in some way; [2] You've uploaded your annotations to FIRST and then altered them in IDA without adding again, [3] not metadata is associated with the function and you added your annotations. These functions, most likely, should be added to FIRST. 59 | * - Unchanged 60 | - The function's metadata has not changed from the last metadata applied to it. This is reserved for functions that have metadata applied to it. If no metadata is applied to the function then it will likely show up as Default. 61 | * - Default 62 | - The function's metadata has not been altered from IDA Pro's auto analysis. This will apply to all functions with the **sub_** prefix and Library functions detected by IDA's FLIRT signatures. 63 | * - Selected 64 | - The function has been selected to be added to FIRST. To select a function, just click on it in the list of function. To deselect a function, clikc on it once more. 65 | 66 | The dialog box also provides a way to quickly filter out any function starting with **sub_** and to select all functions displayed in the list. Simply select the checkbox associated with the operation you wish and the function list will be updated to reflect it. 67 | 68 | .. note:: 69 | 70 | Selecting **Filter Out "sub_" functions** and **Select All** in either order will cause only the function not starting with **sub_** to be selected. 71 | 72 | After reviewing your selection, select the **Upload** button. If no errors occured your function(s) annotations will be added to FIRST and the Output window will state how many functions were added to FIRST. 73 | 74 | 75 | .. figure:: _static/images/add_multiple_functions.gif 76 | :align: center 77 | :alt: Add Multiple Functions to FIRST 78 | 79 | Add Multiple Functions to FIRST 80 | 81 | Data Collected and Sent to FIRST 82 | ================================ 83 | Through IDA Pro's IDA Python APIs FIRST will retrieve several bits of information for the function to send back to the server. The information will be used by the system to uniquely identify the function and supply Engines with enough information to execute their algorithms. The data sent sent can be found below 84 | 85 | .. list-table:: Data sent to FIRST server 86 | :header-rows: 1 87 | 88 | * - Data 89 | - Description 90 | * - Function Name 91 | - Reverser's created annotation. 92 | * - Function Prototype 93 | - Reverser's created annotation. 94 | * - Function Repeatable Comment 95 | - Reverser's created annotation. This is the repeatable function comment 96 | (key press: ;), not a function comment (key press: Shift + ;) 97 | * - Opcodes 98 | - All the opcodes assocaited with the function. The opcodes are retrieved 99 | in order of lowest address to highest address. This is based off of IDA's 100 | ability to determine function boundries by its basic blocks 101 | * - Architecture 102 | - The architecture the function is executed on (i.e. intel32, intel64, 103 | arm32, etc.) 104 | * - IAT Function Calls 105 | - The functions called from this function that are exports from other 106 | samples and in the samples IAT. 107 | * - Sample's MD5 108 | - The MD5 of the sample, IDA calculates this when the sample is initially 109 | loaded. The original sample is not required and the MD5 is retrieved 110 | through IDA's API. 111 | * - Sample's CRC32 112 | - The CRC32 of the sample, IDA calculates this when the sample is initially 113 | loaded. The original smaple is not required and the CRC32 is retrieved 114 | through IDA's API. 115 | -------------------------------------------------------------------------------- /docs/installing.rst: -------------------------------------------------------------------------------- 1 | .. _ida-installing: 2 | 3 | ARCHIVED PROJECT 4 | ================ 5 | 6 | THIS PROJECT HAS BEEN ARCHIVED AND ITS ISSUE QUEUE IS LOCKED. THE PROJECT WILL BE KEPT PUBLIC ONLY FOR REFERENCE PURPORSES. 7 | 8 | 9 | ================= 10 | Installing Plugin 11 | ================= 12 | 13 | Since FIRST is an IDA Python plugin it only works with a license version of Hex Ray's IDA Pro. Due to the integrations with IDA Pro there is a minimum version number. The FIRST plugin only works with IDA 6.9 (service pack 1), relased May 2016, and higher. 14 | 15 | .. important:: 16 | It is easier to install Python from Python.org with the latest 2.7 build instead of using the outdated version of Python bundled in with IDA Pro. 17 | 18 | .. attention:: 19 | There are many ways to install FIRST, the quickest way is to use :program:`pip` and run the setup script. The setup's location differs depending on the OS being used and other possible configurations. The defaults for Mac and Windows are below. 20 | 21 | **Mac** 22 | 23 | .. code-block:: console 24 | 25 | $ pip install first-plugin-ida 26 | $ /usr/local/bin/first-plugin-ida 27 | 28 | **Windows** 29 | 30 | .. code-block:: html 31 | 32 | > pip install first-plugin-ida 33 | > C:\Python27\Scripts\first-plugin-ida 34 | 35 | To use FIRST, you will need to download the plugin and save it to the Hex Rays IDA Pro plugin folder. Directions for this differ depending on the operating system and a basic guide can be found below. 36 | 37 | FIRST is available on PyPI, so to use it you can use :program:`pip`: 38 | 39 | .. code-block:: console 40 | 41 | $ pip install first-plugin-ida 42 | 43 | Alternatively, if you don't have setuptools installed, `download it from PyPi 44 | `_ and run 45 | 46 | .. code-block:: console 47 | 48 | $ python setup.py install 49 | 50 | To use the bleeding-edge version of FIRST's IDA Pro Integration, you can get the source from 51 | `GitHub `_ and install it as above: 52 | 53 | .. code-block:: console 54 | 55 | $ git clone git://github.com/vrtadmin/FIRST-plugin-ida 56 | $ python setup.py install 57 | 58 | Once first-plugin-ida is installed with pip, the post installation script needs to be executed. The script simply copies over the plugin and its files to the IDA Pro installation of your choosing. Depending on your system setup, configuration, and user privileges you may need to be admin or root to successfully use the script. 59 | 60 | +---------+-----------------------------------------+ 61 | | OS | Default Path | 62 | +=========+=========================================+ 63 | | Mac | /usr/local/bin/first-plugin-ida | 64 | +---------+-----------------------------------------+ 65 | | Windows | C:\\Python27\\Scripts\\first-plugin-ida | 66 | +---------+-----------------------------------------+ 67 | 68 | The script will ask you for the full path to the IDA Pro installation. Providing it will copy the plugin to IDA Pro and its dependencies. The default location for 69 | IDA Pro installations are outline below. 70 | 71 | +---------+--------------------------------------------------------------+ 72 | | OS | Default Path | 73 | +=========+==============================================================+ 74 | | Mac | Applications/IDA\\ Pro\\ 6.9/idaq.app/Contents/MacOS/plugins | 75 | +---------+--------------------------------------------------------------+ 76 | | Windows | C:\\Program Files (x86)\\IDA 6.9\\plugins | 77 | +---------+--------------------------------------------------------------+ 78 | 79 | Once the script completes without any errors you will be able to use FIRST in IDA Pro. 80 | 81 | Manual Installation 82 | =================== 83 | If you do not wish to use pip or the post installation script then FIRST can be installed manually. To install the plugin you will need to get the plugin's source from `GitHub`_. The source for the plugin includes every file in the FIRST-plugin-ida/first_plugin_ida folder except FIRST-plugin-ida/first_plugin_ida/__init__.py file. All other files need to be copied over to IDA Pro's plugins directory. Depending on the OS IDA is running on you may need to copy over other dependencies to IDA Pro's folders. 84 | 85 | Requirements 86 | ============ 87 | Additionally, FIRST requires one third party module to work and an optional module if Kerberos Authentication is used 88 | 89 | * [Required] Requests (https://pypi.python.org/pypi/requests) 90 | * [Optional] Requests-kerberos (https://pypi.python.org/pypi/requests-kerberos) 91 | 92 | Windows 93 | ======= 94 | Once you have a copy of the plug-in, installing the plug-in is as simple as copying the Python file into the plugins folder. For IDA 6.9, the default installation path can be found at: 95 | 96 | .. list-table:: 97 | :stub-columns: 1 98 | 99 | * - Default IDA Pro Path 100 | - C:\\Program Files (x86)\\IDA 6.9\\plugins 101 | * - Dependency Instructions 102 | - pip install requests 103 | 104 | 105 | Mac OS X 106 | ======== 107 | Installing on Mac OS X requires a little more work, once you've installed IDA Pro, copy the FIRST plugin to the /Contents/MacOS/plugins/ folder and the required dependencies to /Contents/MacOS/python/ 108 | 109 | .. list-table:: 110 | :stub-columns: 1 111 | 112 | * - Default IDA Pro Path 113 | - /Applications/IDA\\ Pro\\ 6.9/idaq.app/Contents/MacOS/plugins/ 114 | * - Dependency Instructions 115 | - pip install requests 116 | 117 | cp /usr/local/lib/python2.7/site-packages/requests* /Applications/IDA\ Pro\ 6.9/idaq.app/Contents/MacOS/python 118 | 119 | Linux 120 | ===== 121 | During the setup, IDA asks whether to install with the bundled Python interpreter or use the local Python interpreter from the local system. Bundled Python is nice, everything just works by default. However the downside is that you can't really add and upgrade Python libraries, and the FIRST plugin requires the requests plugin which is not by default in the bundle. 122 | 123 | If you installed with bundled Python, you can switch to use the local Python simply by renaming ``libpython2.7.so.1.0`` and ``python/lib/python27.zip``. For instance: 124 | 125 | .. code-block:: console 126 | 127 | $ cd $IDA_DIR 128 | $ mv libpython2.7.so.1.0{,.orig} 129 | $ mv python/lib/python27.zip{,.orig} 130 | 131 | You can revert back to bundle Python by reverting the renames. 132 | 133 | Unfortunately the downside of using local Python is that if you are running under x86_64, IDA being a 32-bit binary, it won't work out of the box. Fortunately, under recent Debian (e.g. stretch) and Ubuntu, you can install libs from other architectures. For instance, what worked for us: 134 | 135 | .. code-block:: console 136 | 137 | $ dpkg --add-architecture i386 138 | $ apt update 139 | $ apt install --no-install-recommends gtk2-engines-murrine:i386 gtk2-engines-pixbuf:i386 libc6-i686:i386 libcurl3:i386 libdbus-1-3:i386 libexpat1:i386 libffi6:i386 libfontconfig1:i386 libfreetype6:i386 libgcc1:i386 libglib2.0-0:i386 libgtk2.0-0:i386 libice6:i386 libpcre3:i386 libpng16-16:i386 libpython2.7:i386 libsm6:i386 libstdc++6:i386 libuuid1:i386 libx11-6:i386 libx11-xcb1:i386 libxau6:i386 libxcb1:i386 libxdmcp6:i386 libxext6:i386 libxi6:i386 libxrender1:i386 python-pyqt5:i386 xdg-utils zlib1g:i386 python-requests 140 | 141 | Tip: if your distro is different or too old, try a chroot (e.g. debootstrap & schroot), works pretty well. 142 | 143 | Copy the FIRST plugin (``first.py``) to your plugins directory (``~/.idapro/plugins``) and start IDA (32 or 64), it should all work! 144 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | BUILDDIR = _build 9 | 10 | # Internal variables. 11 | PAPEROPT_a4 = -D latex_paper_size=a4 12 | PAPEROPT_letter = -D latex_paper_size=letter 13 | ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . 14 | # the i18n builder cannot share the environment and doctrees with the others 15 | I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . 16 | 17 | .PHONY: help 18 | help: 19 | @echo "Please use \`make ' where is one of" 20 | @echo " html to make standalone HTML files" 21 | @echo " dirhtml to make HTML files named index.html in directories" 22 | @echo " singlehtml to make a single large HTML file" 23 | @echo " pickle to make pickle files" 24 | @echo " json to make JSON files" 25 | @echo " htmlhelp to make HTML files and a HTML help project" 26 | @echo " qthelp to make HTML files and a qthelp project" 27 | @echo " applehelp to make an Apple Help Book" 28 | @echo " devhelp to make HTML files and a Devhelp project" 29 | @echo " epub to make an epub" 30 | @echo " epub3 to make an epub3" 31 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 32 | @echo " latexpdf to make LaTeX files and run them through pdflatex" 33 | @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" 34 | @echo " text to make text files" 35 | @echo " man to make manual pages" 36 | @echo " texinfo to make Texinfo files" 37 | @echo " info to make Texinfo files and run them through makeinfo" 38 | @echo " gettext to make PO message catalogs" 39 | @echo " changes to make an overview of all changed/added/deprecated items" 40 | @echo " xml to make Docutils-native XML files" 41 | @echo " pseudoxml to make pseudoxml-XML files for display purposes" 42 | @echo " linkcheck to check all external links for integrity" 43 | @echo " doctest to run all doctests embedded in the documentation (if enabled)" 44 | @echo " coverage to run coverage check of the documentation (if enabled)" 45 | @echo " dummy to check syntax errors of document sources" 46 | 47 | .PHONY: clean 48 | clean: 49 | rm -rf $(BUILDDIR)/* 50 | 51 | .PHONY: html 52 | html: 53 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html 54 | @echo 55 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." 56 | 57 | .PHONY: dirhtml 58 | dirhtml: 59 | $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml 60 | @echo 61 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." 62 | 63 | .PHONY: singlehtml 64 | singlehtml: 65 | $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml 66 | @echo 67 | @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." 68 | 69 | .PHONY: pickle 70 | pickle: 71 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle 72 | @echo 73 | @echo "Build finished; now you can process the pickle files." 74 | 75 | .PHONY: json 76 | json: 77 | $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json 78 | @echo 79 | @echo "Build finished; now you can process the JSON files." 80 | 81 | .PHONY: htmlhelp 82 | htmlhelp: 83 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp 84 | @echo 85 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 86 | ".hhp project file in $(BUILDDIR)/htmlhelp." 87 | 88 | .PHONY: qthelp 89 | qthelp: 90 | $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp 91 | @echo 92 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \ 93 | ".qhcp project file in $(BUILDDIR)/qthelp, like this:" 94 | @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/FIRST.qhcp" 95 | @echo "To view the help file:" 96 | @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/FIRST.qhc" 97 | 98 | .PHONY: applehelp 99 | applehelp: 100 | $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp 101 | @echo 102 | @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." 103 | @echo "N.B. You won't be able to view it unless you put it in" \ 104 | "~/Library/Documentation/Help or install it in your application" \ 105 | "bundle." 106 | 107 | .PHONY: devhelp 108 | devhelp: 109 | $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp 110 | @echo 111 | @echo "Build finished." 112 | @echo "To view the help file:" 113 | @echo "# mkdir -p $$HOME/.local/share/devhelp/FIRST" 114 | @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/FIRST" 115 | @echo "# devhelp" 116 | 117 | .PHONY: epub 118 | epub: 119 | $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub 120 | @echo 121 | @echo "Build finished. The epub file is in $(BUILDDIR)/epub." 122 | 123 | .PHONY: epub3 124 | epub3: 125 | $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 126 | @echo 127 | @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." 128 | 129 | .PHONY: latex 130 | latex: 131 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 132 | @echo 133 | @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." 134 | @echo "Run \`make' in that directory to run these through (pdf)latex" \ 135 | "(use \`make latexpdf' here to do that automatically)." 136 | 137 | .PHONY: latexpdf 138 | latexpdf: 139 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 140 | @echo "Running LaTeX files through pdflatex..." 141 | $(MAKE) -C $(BUILDDIR)/latex all-pdf 142 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 143 | 144 | .PHONY: latexpdfja 145 | latexpdfja: 146 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 147 | @echo "Running LaTeX files through platex and dvipdfmx..." 148 | $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja 149 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 150 | 151 | .PHONY: text 152 | text: 153 | $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text 154 | @echo 155 | @echo "Build finished. The text files are in $(BUILDDIR)/text." 156 | 157 | .PHONY: man 158 | man: 159 | $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man 160 | @echo 161 | @echo "Build finished. The manual pages are in $(BUILDDIR)/man." 162 | 163 | .PHONY: texinfo 164 | texinfo: 165 | $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo 166 | @echo 167 | @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." 168 | @echo "Run \`make' in that directory to run these through makeinfo" \ 169 | "(use \`make info' here to do that automatically)." 170 | 171 | .PHONY: info 172 | info: 173 | $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo 174 | @echo "Running Texinfo files through makeinfo..." 175 | make -C $(BUILDDIR)/texinfo info 176 | @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." 177 | 178 | .PHONY: gettext 179 | gettext: 180 | $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale 181 | @echo 182 | @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." 183 | 184 | .PHONY: changes 185 | changes: 186 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes 187 | @echo 188 | @echo "The overview file is in $(BUILDDIR)/changes." 189 | 190 | .PHONY: linkcheck 191 | linkcheck: 192 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck 193 | @echo 194 | @echo "Link check complete; look for any errors in the above output " \ 195 | "or in $(BUILDDIR)/linkcheck/output.txt." 196 | 197 | .PHONY: doctest 198 | doctest: 199 | $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest 200 | @echo "Testing of doctests in the sources finished, look at the " \ 201 | "results in $(BUILDDIR)/doctest/output.txt." 202 | 203 | .PHONY: coverage 204 | coverage: 205 | $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage 206 | @echo "Testing of coverage in the sources finished, look at the " \ 207 | "results in $(BUILDDIR)/coverage/python.txt." 208 | 209 | .PHONY: xml 210 | xml: 211 | $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml 212 | @echo 213 | @echo "Build finished. The XML files are in $(BUILDDIR)/xml." 214 | 215 | .PHONY: pseudoxml 216 | pseudoxml: 217 | $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml 218 | @echo 219 | @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." 220 | 221 | .PHONY: dummy 222 | dummy: 223 | $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy 224 | @echo 225 | @echo "Build finished. Dummy builder generates no files." 226 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | REM Command file for Sphinx documentation 4 | 5 | if "%SPHINXBUILD%" == "" ( 6 | set SPHINXBUILD=sphinx-build 7 | ) 8 | set BUILDDIR=_build 9 | set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . 10 | set I18NSPHINXOPTS=%SPHINXOPTS% . 11 | if NOT "%PAPER%" == "" ( 12 | set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% 13 | set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% 14 | ) 15 | 16 | if "%1" == "" goto help 17 | 18 | if "%1" == "help" ( 19 | :help 20 | echo.Please use `make ^` where ^ is one of 21 | echo. html to make standalone HTML files 22 | echo. dirhtml to make HTML files named index.html in directories 23 | echo. singlehtml to make a single large HTML file 24 | echo. pickle to make pickle files 25 | echo. json to make JSON files 26 | echo. htmlhelp to make HTML files and a HTML help project 27 | echo. qthelp to make HTML files and a qthelp project 28 | echo. devhelp to make HTML files and a Devhelp project 29 | echo. epub to make an epub 30 | echo. epub3 to make an epub3 31 | echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter 32 | echo. text to make text files 33 | echo. man to make manual pages 34 | echo. texinfo to make Texinfo files 35 | echo. gettext to make PO message catalogs 36 | echo. changes to make an overview over all changed/added/deprecated items 37 | echo. xml to make Docutils-native XML files 38 | echo. pseudoxml to make pseudoxml-XML files for display purposes 39 | echo. linkcheck to check all external links for integrity 40 | echo. doctest to run all doctests embedded in the documentation if enabled 41 | echo. coverage to run coverage check of the documentation if enabled 42 | echo. dummy to check syntax errors of document sources 43 | goto end 44 | ) 45 | 46 | if "%1" == "clean" ( 47 | for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i 48 | del /q /s %BUILDDIR%\* 49 | goto end 50 | ) 51 | 52 | 53 | REM Check if sphinx-build is available and fallback to Python version if any 54 | %SPHINXBUILD% 1>NUL 2>NUL 55 | if errorlevel 9009 goto sphinx_python 56 | goto sphinx_ok 57 | 58 | :sphinx_python 59 | 60 | set SPHINXBUILD=python -m sphinx.__init__ 61 | %SPHINXBUILD% 2> nul 62 | if errorlevel 9009 ( 63 | echo. 64 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 65 | echo.installed, then set the SPHINXBUILD environment variable to point 66 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 67 | echo.may add the Sphinx directory to PATH. 68 | echo. 69 | echo.If you don't have Sphinx installed, grab it from 70 | echo.http://sphinx-doc.org/ 71 | exit /b 1 72 | ) 73 | 74 | :sphinx_ok 75 | 76 | 77 | if "%1" == "html" ( 78 | %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html 79 | if errorlevel 1 exit /b 1 80 | echo. 81 | echo.Build finished. The HTML pages are in %BUILDDIR%/html. 82 | goto end 83 | ) 84 | 85 | if "%1" == "dirhtml" ( 86 | %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml 87 | if errorlevel 1 exit /b 1 88 | echo. 89 | echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. 90 | goto end 91 | ) 92 | 93 | if "%1" == "singlehtml" ( 94 | %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml 95 | if errorlevel 1 exit /b 1 96 | echo. 97 | echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. 98 | goto end 99 | ) 100 | 101 | if "%1" == "pickle" ( 102 | %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle 103 | if errorlevel 1 exit /b 1 104 | echo. 105 | echo.Build finished; now you can process the pickle files. 106 | goto end 107 | ) 108 | 109 | if "%1" == "json" ( 110 | %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json 111 | if errorlevel 1 exit /b 1 112 | echo. 113 | echo.Build finished; now you can process the JSON files. 114 | goto end 115 | ) 116 | 117 | if "%1" == "htmlhelp" ( 118 | %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp 119 | if errorlevel 1 exit /b 1 120 | echo. 121 | echo.Build finished; now you can run HTML Help Workshop with the ^ 122 | .hhp project file in %BUILDDIR%/htmlhelp. 123 | goto end 124 | ) 125 | 126 | if "%1" == "qthelp" ( 127 | %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp 128 | if errorlevel 1 exit /b 1 129 | echo. 130 | echo.Build finished; now you can run "qcollectiongenerator" with the ^ 131 | .qhcp project file in %BUILDDIR%/qthelp, like this: 132 | echo.^> qcollectiongenerator %BUILDDIR%\qthelp\FIRST.qhcp 133 | echo.To view the help file: 134 | echo.^> assistant -collectionFile %BUILDDIR%\qthelp\FIRST.ghc 135 | goto end 136 | ) 137 | 138 | if "%1" == "devhelp" ( 139 | %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp 140 | if errorlevel 1 exit /b 1 141 | echo. 142 | echo.Build finished. 143 | goto end 144 | ) 145 | 146 | if "%1" == "epub" ( 147 | %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub 148 | if errorlevel 1 exit /b 1 149 | echo. 150 | echo.Build finished. The epub file is in %BUILDDIR%/epub. 151 | goto end 152 | ) 153 | 154 | if "%1" == "epub3" ( 155 | %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 156 | if errorlevel 1 exit /b 1 157 | echo. 158 | echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. 159 | goto end 160 | ) 161 | 162 | if "%1" == "latex" ( 163 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 164 | if errorlevel 1 exit /b 1 165 | echo. 166 | echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. 167 | goto end 168 | ) 169 | 170 | if "%1" == "latexpdf" ( 171 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 172 | cd %BUILDDIR%/latex 173 | make all-pdf 174 | cd %~dp0 175 | echo. 176 | echo.Build finished; the PDF files are in %BUILDDIR%/latex. 177 | goto end 178 | ) 179 | 180 | if "%1" == "latexpdfja" ( 181 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 182 | cd %BUILDDIR%/latex 183 | make all-pdf-ja 184 | cd %~dp0 185 | echo. 186 | echo.Build finished; the PDF files are in %BUILDDIR%/latex. 187 | goto end 188 | ) 189 | 190 | if "%1" == "text" ( 191 | %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text 192 | if errorlevel 1 exit /b 1 193 | echo. 194 | echo.Build finished. The text files are in %BUILDDIR%/text. 195 | goto end 196 | ) 197 | 198 | if "%1" == "man" ( 199 | %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man 200 | if errorlevel 1 exit /b 1 201 | echo. 202 | echo.Build finished. The manual pages are in %BUILDDIR%/man. 203 | goto end 204 | ) 205 | 206 | if "%1" == "texinfo" ( 207 | %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo 208 | if errorlevel 1 exit /b 1 209 | echo. 210 | echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. 211 | goto end 212 | ) 213 | 214 | if "%1" == "gettext" ( 215 | %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale 216 | if errorlevel 1 exit /b 1 217 | echo. 218 | echo.Build finished. The message catalogs are in %BUILDDIR%/locale. 219 | goto end 220 | ) 221 | 222 | if "%1" == "changes" ( 223 | %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes 224 | if errorlevel 1 exit /b 1 225 | echo. 226 | echo.The overview file is in %BUILDDIR%/changes. 227 | goto end 228 | ) 229 | 230 | if "%1" == "linkcheck" ( 231 | %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck 232 | if errorlevel 1 exit /b 1 233 | echo. 234 | echo.Link check complete; look for any errors in the above output ^ 235 | or in %BUILDDIR%/linkcheck/output.txt. 236 | goto end 237 | ) 238 | 239 | if "%1" == "doctest" ( 240 | %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest 241 | if errorlevel 1 exit /b 1 242 | echo. 243 | echo.Testing of doctests in the sources finished, look at the ^ 244 | results in %BUILDDIR%/doctest/output.txt. 245 | goto end 246 | ) 247 | 248 | if "%1" == "coverage" ( 249 | %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage 250 | if errorlevel 1 exit /b 1 251 | echo. 252 | echo.Testing of coverage in the sources finished, look at the ^ 253 | results in %BUILDDIR%/coverage/python.txt. 254 | goto end 255 | ) 256 | 257 | if "%1" == "xml" ( 258 | %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml 259 | if errorlevel 1 exit /b 1 260 | echo. 261 | echo.Build finished. The XML files are in %BUILDDIR%/xml. 262 | goto end 263 | ) 264 | 265 | if "%1" == "pseudoxml" ( 266 | %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml 267 | if errorlevel 1 exit /b 1 268 | echo. 269 | echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. 270 | goto end 271 | ) 272 | 273 | if "%1" == "dummy" ( 274 | %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy 275 | if errorlevel 1 exit /b 1 276 | echo. 277 | echo.Build finished. Dummy builder generates no files. 278 | goto end 279 | ) 280 | 281 | :end 282 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # FIRST documentation build configuration file, created by 4 | # sphinx-quickstart on Fri Aug 26 12:04:45 2016. 5 | # 6 | # This file is execfile()d with the current directory set to its 7 | # containing dir. 8 | # 9 | # Note that not all possible configuration values are present in this 10 | # autogenerated file. 11 | # 12 | # All configuration values have a default; values that are commented out 13 | # serve to show the default. 14 | 15 | # If extensions (or modules to document with autodoc) are in another directory, 16 | # add these directories to sys.path here. If the directory is relative to the 17 | # documentation root, use os.path.abspath to make it absolute, like shown here. 18 | # 19 | import os 20 | import sys 21 | import types 22 | sys.path.insert(0, os.path.abspath('..')) 23 | 24 | import sphinx.ext.autodoc 25 | 26 | # -- General configuration ------------------------------------------------ 27 | 28 | # If your documentation needs a minimal Sphinx version, state it here. 29 | # 30 | # needs_sphinx = '1.0' 31 | 32 | # Add any Sphinx extension module names here, as strings. They can be 33 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 34 | # ones. 35 | extensions = [ 36 | 'sphinx.ext.autodoc', 37 | 'sphinx.ext.todo', 38 | 'sphinx.ext.viewcode', 39 | 'sphinxcontrib.napoleon', 40 | ] 41 | 42 | # Autodoc settings 43 | autoclass_content = 'class' 44 | autodoc_mock_imports = ['requests', 'idc', 'idaapi', 'idautils', 'PyQt5', 45 | 'PyQt5.QtCore', 'requests_kerberos'] 46 | 47 | 48 | class MockHook(object): 49 | def hook(self): 50 | pass 51 | 52 | class _MyMockModule(sphinx.ext.autodoc.importer._MockModule): 53 | '''Class created to get around autodoc issues with plugin's dependencies''' 54 | def __getattr__(self, name): 55 | if name in ['IDP_Hooks', 'UI_Hooks']: 56 | return MockHook 57 | 58 | elif (name[0] == name[0].upper()) and (not name.startswith('Q')): 59 | # slight change from original _MockModule implementation 60 | mocktype = type(name, (), {}) 61 | mocktype.__module__ = __name__ 62 | return mocktype 63 | 64 | elif name in ['get_user_idadir']: 65 | return lambda:'str' 66 | 67 | else: 68 | return sphinx.ext.autodoc.importer._MockObject() 69 | 70 | sphinx.ext.autodoc.importer._MockModule = _MyMockModule 71 | 72 | 73 | # Add any paths that contain templates here, relative to this directory. 74 | templates_path = ['_templates'] 75 | 76 | # The suffix(es) of source filenames. 77 | # You can specify multiple suffix as a list of string: 78 | # 79 | # source_suffix = ['.rst', '.md'] 80 | source_suffix = '.rst' 81 | 82 | # The encoding of source files. 83 | # 84 | # source_encoding = 'utf-8-sig' 85 | 86 | # The master toctree document. 87 | master_doc = 'index' 88 | 89 | # General information about the project. 90 | project = u'FIRST IDA Pro Integration' 91 | copyright = u'2016, Angel M. Villegas' 92 | author = u'Angel M. Villegas' 93 | 94 | # The version info for the project you're documenting, acts as replacement for 95 | # |version| and |release|, also used in various other places throughout the 96 | # built documents. 97 | # 98 | # The short X.Y version. 99 | version = u'BETA' 100 | # The full version, including alpha/beta/rc tags. 101 | release = u'Closed BETA' 102 | 103 | # The language for content autogenerated by Sphinx. Refer to documentation 104 | # for a list of supported languages. 105 | # 106 | # This is also used if you do content translation via gettext catalogs. 107 | # Usually you set "language" from the command line for these cases. 108 | language = None 109 | 110 | # There are two options for replacing |today|: either, you set today to some 111 | # non-false value, then it is used: 112 | # 113 | # today = '' 114 | # 115 | # Else, today_fmt is used as the format for a strftime call. 116 | # 117 | # today_fmt = '%B %d, %Y' 118 | 119 | # List of patterns, relative to source directory, that match files and 120 | # directories to ignore when looking for source files. 121 | # This patterns also effect to html_static_path and html_extra_path 122 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 123 | 124 | # The reST default role (used for this markup: `text`) to use for all 125 | # documents. 126 | # 127 | # default_role = None 128 | 129 | # If true, '()' will be appended to :func: etc. cross-reference text. 130 | # 131 | # add_function_parentheses = True 132 | 133 | # If true, the current module name will be prepended to all description 134 | # unit titles (such as .. function::). 135 | # 136 | # add_module_names = True 137 | 138 | # If true, sectionauthor and moduleauthor directives will be shown in the 139 | # output. They are ignored by default. 140 | # 141 | # show_authors = False 142 | 143 | # The name of the Pygments (syntax highlighting) style to use. 144 | pygments_style = 'sphinx' 145 | 146 | # A list of ignored prefixes for module index sorting. 147 | # modindex_common_prefix = [] 148 | 149 | # If true, keep warnings as "system message" paragraphs in the built documents. 150 | # keep_warnings = False 151 | 152 | # If true, `todo` and `todoList` produce output, else they produce nothing. 153 | todo_include_todos = True 154 | 155 | 156 | # -- Options for HTML output ---------------------------------------------- 157 | 158 | # The theme to use for HTML and HTML Help pages. See the documentation for 159 | # a list of builtin themes. 160 | # 161 | html_theme = 'sphinx_rtd_theme' 162 | 163 | # Theme options are theme-specific and customize the look and feel of a theme 164 | # further. For a list of options available for each theme, see the 165 | # documentation. 166 | # 167 | # html_theme_options = {} 168 | 169 | # Add any paths that contain custom themes here, relative to this directory. 170 | # html_theme_path = [] 171 | 172 | # The name for this set of Sphinx documents. 173 | # " v documentation" by default. 174 | # 175 | # html_title = u'FIRST vClosed BETA' 176 | 177 | # A shorter title for the navigation bar. Default is the same as html_title. 178 | # 179 | # html_short_title = None 180 | 181 | # The name of an image file (relative to this directory) to place at the top 182 | # of the sidebar. 183 | # 184 | # html_logo = None 185 | 186 | # The name of an image file (relative to this directory) to use as a favicon of 187 | # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 188 | # pixels large. 189 | # 190 | # html_favicon = None 191 | 192 | # Add any paths that contain custom static files (such as style sheets) here, 193 | # relative to this directory. They are copied after the builtin static files, 194 | # so a file named "default.css" will overwrite the builtin "default.css". 195 | html_static_path = ['_static'] 196 | 197 | # Add any extra paths that contain custom files (such as robots.txt or 198 | # .htaccess) here, relative to this directory. These files are copied 199 | # directly to the root of the documentation. 200 | # 201 | # html_extra_path = [] 202 | 203 | # If not None, a 'Last updated on:' timestamp is inserted at every page 204 | # bottom, using the given strftime format. 205 | # The empty string is equivalent to '%b %d, %Y'. 206 | # 207 | # html_last_updated_fmt = None 208 | 209 | # If true, SmartyPants will be used to convert quotes and dashes to 210 | # typographically correct entities. 211 | # 212 | # html_use_smartypants = True 213 | 214 | # Custom sidebar templates, maps document names to template names. 215 | # 216 | # html_sidebars = {} 217 | 218 | # Additional templates that should be rendered to pages, maps page names to 219 | # template names. 220 | # 221 | # html_additional_pages = {} 222 | 223 | # If false, no module index is generated. 224 | # 225 | # html_domain_indices = True 226 | 227 | # If false, no index is generated. 228 | # 229 | # html_use_index = True 230 | 231 | # If true, the index is split into individual pages for each letter. 232 | # 233 | # html_split_index = False 234 | 235 | # If true, links to the reST sources are added to the pages. 236 | # 237 | # html_show_sourcelink = True 238 | 239 | # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. 240 | # 241 | # html_show_sphinx = True 242 | 243 | # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. 244 | # 245 | # html_show_copyright = True 246 | 247 | # If true, an OpenSearch description file will be output, and all pages will 248 | # contain a tag referring to it. The value of this option must be the 249 | # base URL from which the finished HTML is served. 250 | # 251 | # html_use_opensearch = '' 252 | 253 | # This is the file name suffix for HTML files (e.g. ".xhtml"). 254 | # html_file_suffix = None 255 | 256 | # Language to be used for generating the HTML full-text search index. 257 | # Sphinx supports the following languages: 258 | # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' 259 | # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' 260 | # 261 | # html_search_language = 'en' 262 | 263 | # A dictionary with options for the search language support, empty by default. 264 | # 'ja' uses this config value. 265 | # 'zh' user can custom change `jieba` dictionary path. 266 | # 267 | # html_search_options = {'type': 'default'} 268 | 269 | # The name of a javascript file (relative to the configuration directory) that 270 | # implements a search results scorer. If empty, the default will be used. 271 | # 272 | # html_search_scorer = 'scorer.js' 273 | 274 | # Output file base name for HTML help builder. 275 | htmlhelp_basename = 'FIRSTdoc' 276 | 277 | # -- Options for LaTeX output --------------------------------------------- 278 | 279 | latex_elements = { 280 | # The paper size ('letterpaper' or 'a4paper'). 281 | # 282 | # 'papersize': 'letterpaper', 283 | 284 | # The font size ('10pt', '11pt' or '12pt'). 285 | # 286 | # 'pointsize': '10pt', 287 | 288 | # Additional stuff for the LaTeX preamble. 289 | # 290 | # 'preamble': '', 291 | 292 | # Latex figure (float) alignment 293 | # 294 | # 'figure_align': 'htbp', 295 | } 296 | 297 | # Grouping the document tree into LaTeX files. List of tuples 298 | # (source start file, target name, title, 299 | # author, documentclass [howto, manual, or own class]). 300 | latex_documents = [ 301 | (master_doc, 'FIRST.tex', u'FIRST IDA Pro Integration', 302 | u'Angel M. Villegas', 'manual'), 303 | ] 304 | 305 | # The name of an image file (relative to this directory) to place at the top of 306 | # the title page. 307 | # 308 | # latex_logo = None 309 | 310 | # For "manual" documents, if this is true, then toplevel headings are parts, 311 | # not chapters. 312 | # 313 | # latex_use_parts = False 314 | 315 | # If true, show page references after internal links. 316 | # 317 | # latex_show_pagerefs = False 318 | 319 | # If true, show URL addresses after external links. 320 | # 321 | # latex_show_urls = False 322 | 323 | # Documents to append as an appendix to all manuals. 324 | # 325 | # latex_appendices = [] 326 | 327 | # It false, will not define \strong, \code, itleref, \crossref ... but only 328 | # \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added 329 | # packages. 330 | # 331 | # latex_keep_old_macro_names = True 332 | 333 | # If false, no module index is generated. 334 | # 335 | # latex_domain_indices = True 336 | 337 | 338 | # -- Options for manual page output --------------------------------------- 339 | 340 | # One entry per manual page. List of tuples 341 | # (source start file, name, description, authors, manual section). 342 | man_pages = [ 343 | (master_doc, 'first', u'FIRST IDA Pro Integration', 344 | [author], 1) 345 | ] 346 | 347 | # If true, show URL addresses after external links. 348 | # 349 | # man_show_urls = False 350 | 351 | 352 | # -- Options for Texinfo output ------------------------------------------- 353 | 354 | # Grouping the document tree into Texinfo files. List of tuples 355 | # (source start file, target name, title, author, 356 | # dir menu entry, description, category) 357 | texinfo_documents = [ 358 | (master_doc, 'FIRST', u'FIRST IDA Pro Integration', 359 | author, 'FIRST', 'One line description of project.', 360 | 'Miscellaneous'), 361 | ] 362 | 363 | # Documents to append as an appendix to all manuals. 364 | # 365 | # texinfo_appendices = [] 366 | 367 | # If false, no module index is generated. 368 | # 369 | # texinfo_domain_indices = True 370 | 371 | # How to display URL addresses: 'footnote', 'no', or 'inline'. 372 | # 373 | # texinfo_show_urls = 'footnote' 374 | 375 | # If true, do not generate a @detailmenu in the "Top" node's menu. 376 | # 377 | # texinfo_no_detailmenu = False 378 | 379 | 380 | # -- Options for Epub output ---------------------------------------------- 381 | 382 | # Bibliographic Dublin Core info. 383 | epub_title = project 384 | epub_author = author 385 | epub_publisher = author 386 | epub_copyright = copyright 387 | 388 | # The basename for the epub file. It defaults to the project name. 389 | # epub_basename = project 390 | 391 | # The HTML theme for the epub output. Since the default themes are not 392 | # optimized for small screen space, using the same theme for HTML and epub 393 | # output is usually not wise. This defaults to 'epub', a theme designed to save 394 | # visual space. 395 | # 396 | # epub_theme = 'epub' 397 | 398 | # The language of the text. It defaults to the language option 399 | # or 'en' if the language is not set. 400 | # 401 | # epub_language = '' 402 | 403 | # The scheme of the identifier. Typical schemes are ISBN or URL. 404 | # epub_scheme = '' 405 | 406 | # The unique identifier of the text. This can be a ISBN number 407 | # or the project homepage. 408 | # 409 | # epub_identifier = '' 410 | 411 | # A unique identification for the text. 412 | # 413 | # epub_uid = '' 414 | 415 | # A tuple containing the cover image and cover page html template filenames. 416 | # 417 | # epub_cover = () 418 | 419 | # A sequence of (type, uri, title) tuples for the guide element of content.opf. 420 | # 421 | # epub_guide = () 422 | 423 | # HTML files that should be inserted before the pages created by sphinx. 424 | # The format is a list of tuples containing the path and title. 425 | # 426 | # epub_pre_files = [] 427 | 428 | # HTML files that should be inserted after the pages created by sphinx. 429 | # The format is a list of tuples containing the path and title. 430 | # 431 | # epub_post_files = [] 432 | 433 | # A list of files that should not be packed into the epub file. 434 | epub_exclude_files = ['search.html'] 435 | 436 | # The depth of the table of contents in toc.ncx. 437 | # 438 | # epub_tocdepth = 3 439 | 440 | # Allow duplicate toc entries. 441 | # 442 | # epub_tocdup = True 443 | 444 | # Choose between 'default' and 'includehidden'. 445 | # 446 | # epub_tocscope = 'default' 447 | 448 | # Fix unsupported image types using the Pillow. 449 | # 450 | # epub_fix_images = False 451 | 452 | # Scale large images. 453 | # 454 | # epub_max_image_width = 0 455 | 456 | # How to display URL addresses: 'footnote', 'no', or 'inline'. 457 | # 458 | # epub_show_urls = 'inline' 459 | 460 | # If false, no index is generated. 461 | # 462 | # epub_use_index = True 463 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | --------------------------------------------------------------------------------