{ "info": { "author": "chame1eon", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Debuggers" ], "description": "# jnitrace\n\n_A Frida based tool to trace use of the JNI API in Android apps._\n\nNative libraries contained within Android Apps often make use of the JNI API to\nutilize the Android Runtime. Tracking those calls through\nmanual reverse engineering can be a slow and painful process. `jnitrace` works\nas a dynamic analysis tracing tool similar to frida-trace or strace but for\nthe JNI.\n\n![JNITrace Output](https://i.ibb.co/ZJ04cBB/jnitrace-1.png)\n\n## Installation:\n\nThe easiest way to get running with `jnitrace` is to install using pip:\n\n`pip install jnitrace`\n\n###### Dependencies:\n* arm, arm64, x86, or x64 Android device\n* Frida installed on the Android device\n* Frida support > 12\n* Linux, Mac, or Windows Host with Python 3 and pip\n\n## Running:\n\nAfter a pip install it is easy to run `jnitrace`:\n\n`jnitrace -l libnative-lib.so com.example.myapplication`\n\n`jnitrace` requires a minimum of two parameters to run a trace:\n* `-l libnative-lib.so` - is used to specify the libraries to trace. This argument can be used multiple times or `*` can be used to track all libraries. For example, `-l libnative-lib.so -l libanother-lib.so` or `-l *`.\n* `com.example.myapplication` - is the Android package to trace. This package must already be installed on the device.\n\nOptional arguments are listed below:\n* `-m ` - is used to specify the Frida attach mechanism to use. It can either be spawn or attach. Spawn is the default and recommended option.\n* `-b ` - is used to control backtrace output. By default `jnitrace` will run the\nbacktracer in `accurate` mode. This option can be changed to `fuzzy` mode or used to stop the backtrace\nby using the `none` option. See the Frida docs for an explanation on the differences.\n* `-i ` - is used to specify the method names that should be traced. This can be helpful for reducing the noise in particularly large JNI apps. The option can be supplied multiple times. For example, `-i Get -i RegisterNatives` would include\nonly JNI methods that contain Get or RegisterNatives in their name.\n* `-e ` - is used to specify the method names that should be ignored in the trace. This can be helpful for reducing the noise in particularly large JNI apps. The option can be supplied multiple times. For example, `-e ^Find -e GetEnv` would exclude from\nthe results all JNI method names that begin Find or contain GetEnv.\n* `-I ` - is used to specify the exports from a library that should be traced. This is useful for libraries where you only\nwant to trace a small number of methods. The functions jnitrace considers exported are any functions that are directly callable\nfrom the Java side, as such, that includes methods bound using RegisterNatives. The option can be supplied multiple times. For example,\n`-I stringFromJNI -I nativeMethod([B)V` could be used to include an export from the library called `Java_com_nativetest_MainActivity_stringFromJNI` and a method bound using RegisterNames with the signature of `nativeMethod([B)V`.\n* `-E ` is used to specify the exports from a library that should not be traced. This is useful for libraries where you\nhave a group of busy native calls that you want to ignore. The functions jnitrace considers exported are any functions that are directly callable from the Java side, as such, that includes methods bound using RegisterNatives. The option can be supplied multiple times. For example, `-E JNI_OnLoad -E nativeMethod` would exclude from the trace the `JNI_OnLoad` function call and any methods\nwith the name `nativeMethod`.\n* `-o path/output.json` - is used to specify an output path where `jnitrace` will store all traced data. The information is stored in JSON format to allow later post-processing of the trace data.\n* `-p path/to/script.js` - the path provided is used to load a Frida script into the target process before the `jnitrace` script has loaded. This can be used for defeating anti-frida or anti-debugging code before `jnitrace` starts.\n* `-a path/to/script.js` - the path provided is used to load Frida script into the target process after `jnitrace` has been loaded.\n* `--hide-data` - used to reduce the quantity of output displayed in the console. This option will hide additional data that is displayed as hexdumps or as string de-references.\n* `--ignore-env` - using this option will hide all calls the app is making using the JNIEnv struct.\n* `--ignore-vm` - using this option will hide all calls the app is making using the JavaVM struct.\n\n***Note***\n\nRemember frida-server must be running before running `jnitrace`. If the default\ninstructions for installing frida have been followed, the following command will start the server ready for `jnitrace`:\n\n`adb shell /data/local/tmp/frida-server`\n\n\n## Building:\n\nBuilding `jnitrace` from source requires that `node` first be installed.\nAfter installing `node`, the following commands need to be run:\n\n* `npm install`\n* `npm run watch`\n\n`npm run watch` will run `frida-compile` in the background compiling the source to the output\nfile, `build/jnitrace.js`. `jnitrace.py` loads from `build/jnitrace.js` by default, so no other\nchanges are required to run the updates.\n\n## Output:\n![JNITrace Output](https://i.ibb.co/WfDq1cy/jnitrace-2.png)\n\nLike frida-trace, output is colored based on the API call thread.\n\nImmediately below the thread ID in the display is the JNI API method name.\nMethod names match exactly with those seen in the `jni.h` header file.\n\nSubsequent lines contain a list of arguments indicated by a `|-`. After the\n`|-` characters are the argument type followed by the argument value. For\njmethods, jfields and jclasses the Java type will be displayed in curly\nbraces. This is dependent on `jnitrace` having seen the original method,\nfield, or class lookup. For any methods passing buffers, `jnitrace` will\nextract the buffers from the arguments and display it as a hexdump below the\nargument value.\n\nReturn values are displayed at the bottom of the list as `|=` and will not\nbe present for void methods.\n\nIf the backtrace is enabled, a Frida backtrace will be displayed below the\nmethod call. Please be aware, as per the Frida docs, the fuzzy backtrace is\nnot always accurate and the accurate backtrace may provide limited results.\n\n## Details:\nThe goal of this project was to create a tool that could trace JNI API calls\nefficiently for most Android applications.\n\nUnfortunately, the simplest approach of attaching to all function pointers in\nthe JNIEnv structure overloads the application. It causes a crash based on the\nsheer number of function calls made by other unrelated libraries also using\nthe same functions in `libart.so`.\n\nTo deal with that performance barrier, `jnitrace` creates a shadow JNIEnv that\nit can supply to libraries it wants to track. That JNIEnv contains a series\nof function trampolines that bounce the JNI API calls through some custom\nFrida NativeCallbacks to track the input and output of those functions.\n\nThe generic Frida API does a great job of providing a platform to build\nthose function trampolines with minimal effort. However, that simple approach\ndoes not work for all of the JNIEnv API. The key problem with tracing all of\nthe methods is the use of variadic arguments in the API. It is not possible to\ncreate the NativeCallback for these functions ahead of time, as it is not known\nbeforehand all the different combinations of Java methods that will be called.\n\nThe solution is to monitor the process for calls to `GetMethodID` or\n`GetStaticMethodID`, used to look up method identifiers from the runtime.\nOnce `jnitrace` sees a `jmethodID` lookup it has a known mapping of\nID to method signature. Later, when a JNI Java method call is made, an initial\nNativeCallback is used to extract the method ID in the call. That method\nsignature is then parsed to extract the method arguments. Once `jnitrace` has\nextracted the arguments in the method, it can dynamically create a\nNativeCallback for that method. That new NativeCallback is returned and a\nlittle bit of architecture specific shellcode deals with setting up the stack\nand registers to allow that call to run successfully. Those NativeCallbacks\nfor specific methods are cached to allow the callback to run more efficiently\nif a method if called multiple times.\n\nThe other place where a simple NativeCallback is not sufficient for\nextracting the arguments from a method call, is for calls using a\nva_args pointer as the final argument. In this case `jnitrace` uses some code\nto extract the arguments from the pointer provided. Again this is architecture\nspecific.\n\nAll data traced in these function calls is sent to the python console\napplication that formats and displays it to the user.\n\n## Recommendations:\nMost testing of this tool has been done on an Android x86_64 emulator running\nMarshmallow. Any issues experienced running on another device, please file an\nissue, but also, if possible, it is recommended to try running on a similar\nemulator.\n\n## Issues:\nFor any issues experienced running `jnitrace` please create an issue on\nGitHub. Please include the following information in the filed issue:\n* Device you were running on\n* Version of Frida you were using\n* Application you were running against\n* Any displayed error messages", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/chame1eon/jnitrace", "keywords": "frida jni sre android tracing", "license": "", "maintainer": "", "maintainer_email": "", "name": "jnitrace", "package_url": "https://pypi.org/project/jnitrace/", "platform": "", "project_url": "https://pypi.org/project/jnitrace/", "project_urls": { "Bug Reports": "https://github.com/chame1eon/jnitrace/issues", "Homepage": "https://github.com/chame1eon/jnitrace" }, "release_url": "https://pypi.org/project/jnitrace/2.2.2/", "requires_dist": null, "requires_python": ">=3.0, <4", "summary": "A tool for tracing use of the JNI in Android apps", "version": "2.2.2" }, "last_serial": 5987419, "releases": { "1.0.3": [ { "comment_text": "", "digests": { "md5": "084be84367eb5de22f2d16e60345fd8b", "sha256": "6a7ddf4b708f7d0134cec55e5bc4b90db5244bb5345d33dc26606589ae1fda20" }, "downloads": -1, "filename": "jnitrace-1.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "084be84367eb5de22f2d16e60345fd8b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.0, <4", "size": 30357, "upload_time": "2019-07-23T21:01:15", "url": "https://files.pythonhosted.org/packages/74/01/9bbf66f276398c46fbd691c655b6e8cb939e31daaefe0962525568b51b62/jnitrace-1.0.3-py3-none-any.whl" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "63d575e0dd662b1a0173a800b2040572", "sha256": "1663f49e137497be7f330b406fb9417920635780360de70a3ac5204b1015ab77" }, "downloads": -1, "filename": "jnitrace-1.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "63d575e0dd662b1a0173a800b2040572", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.0, <4", "size": 30959, "upload_time": "2019-07-26T20:28:50", "url": "https://files.pythonhosted.org/packages/01/67/a0bcc65a46ddd43da9528b844b13ff769fe246e89f18d31ba3f498d4f36a/jnitrace-1.1.3-py3-none-any.whl" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "feefb1632639ff318e16939ec8d238ae", "sha256": "59f8c3a70883c6f1bc18c46f7e5021028f0ee9bb63a371a7fb7ec2b5d54e59ee" }, "downloads": -1, "filename": "jnitrace-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "feefb1632639ff318e16939ec8d238ae", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.0, <4", "size": 32527, "upload_time": "2019-07-27T19:17:15", "url": "https://files.pythonhosted.org/packages/8e/db/2fd5dda7f59136bed0db878af3a3afb06b677ee0619f55ec390aa0c04891/jnitrace-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4e641a57d6791e6ff88fbbc68385f813", "sha256": "1f149014356cc49e6eb67916a842df3fa11a4bd6d0854d52af5bbcb2c84d989f" }, "downloads": -1, "filename": "jnitrace-1.2.0.tar.gz", "has_sig": false, "md5_digest": "4e641a57d6791e6ff88fbbc68385f813", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 34714, "upload_time": "2019-07-27T19:17:16", "url": "https://files.pythonhosted.org/packages/b1/eb/0e4023100a71bebfc5c1b9939a867f2c3821293ac83007cd1044fa5bd5c7/jnitrace-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "fea61a873044105cb943cf5464b3a1c3", "sha256": "0859fd0ba003086dc6e5995c38dc0d3f8ec849d7ece37960f42795887d6c9260" }, "downloads": -1, "filename": "jnitrace-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fea61a873044105cb943cf5464b3a1c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.0, <4", "size": 32460, "upload_time": "2019-07-27T19:24:30", "url": "https://files.pythonhosted.org/packages/48/2c/3d7d86cb61933e19dc49a18514bae493be09295dccb0b785214e9702c2be/jnitrace-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "060ae29a8b4326aeffcec853f09f54ed", "sha256": "bbfa952dc1a78e232fdd7b8631f5fd3a8f845312aa64a8cb84a8b9eb71d5ce9a" }, "downloads": -1, "filename": "jnitrace-1.2.1.tar.gz", "has_sig": false, "md5_digest": "060ae29a8b4326aeffcec853f09f54ed", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 34651, "upload_time": "2019-07-27T19:24:32", "url": "https://files.pythonhosted.org/packages/94/96/9122bc82c85664c0a944656400658f30c062849eebe82015562697ed9c2f/jnitrace-1.2.1.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "d3f353f31c4bd56198e31d7a17c50be1", "sha256": "a82b232c7c6ce9ab2049956cac2dc5ac3b17db432412425cfd85170115827992" }, "downloads": -1, "filename": "jnitrace-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d3f353f31c4bd56198e31d7a17c50be1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.0, <4", "size": 33235, "upload_time": "2019-07-28T11:48:17", "url": "https://files.pythonhosted.org/packages/d5/26/58de7819403a813dbe911c7848619b8081049c1762b0a19972b8abf71a03/jnitrace-1.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "16e2bd7b5498781b7d0ef4423ee4605b", "sha256": "e15b4053f66b4c24e02aea953f141fcea425c17a5c942f591c808e7ae9509691" }, "downloads": -1, "filename": "jnitrace-1.3.0.tar.gz", "has_sig": false, "md5_digest": "16e2bd7b5498781b7d0ef4423ee4605b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 34883, "upload_time": "2019-07-28T16:43:27", "url": "https://files.pythonhosted.org/packages/6e/7c/22e6e80577e08a397432e0ca65910d9e2c10c6dab0d121988069cdea7da7/jnitrace-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "9e5c910510ac93a99a132f8ebe818b9a", "sha256": "bc07b42c62e7c648c3a48753edc73eb5b49cbbb7a1faacbe5174002f78ed1429" }, "downloads": -1, "filename": "jnitrace-1.3.1.tar.gz", "has_sig": false, "md5_digest": "9e5c910510ac93a99a132f8ebe818b9a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 34878, "upload_time": "2019-07-28T17:00:22", "url": "https://files.pythonhosted.org/packages/6e/2c/f9eba201a0e41fed11ac7372eeb42ac93859345282c355fcca49f111c63a/jnitrace-1.3.1.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "d78bed5d1d0dad5796e78f81fc792c95", "sha256": "7de2090af517c7abc662c4cc7b12c1d5bc2651578e9d9544f0f508ad392e3e93" }, "downloads": -1, "filename": "jnitrace-1.3.2.tar.gz", "has_sig": false, "md5_digest": "d78bed5d1d0dad5796e78f81fc792c95", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 32351, "upload_time": "2019-07-30T18:26:10", "url": "https://files.pythonhosted.org/packages/db/4b/61eabc611e43cf738a3f2e4f0343c93c33dbc30ae6f688ab372798d89ba4/jnitrace-1.3.2.tar.gz" } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "163e6bce35354f74364d0cbd81986ac1", "sha256": "cd143d3d0bc7de2fa59ba62d9892224ee6f1bafef98dc1898dfc794478147ee4" }, "downloads": -1, "filename": "jnitrace-1.3.3.tar.gz", "has_sig": false, "md5_digest": "163e6bce35354f74364d0cbd81986ac1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 32442, "upload_time": "2019-07-30T20:53:27", "url": "https://files.pythonhosted.org/packages/f5/1d/193310662e023792b900cfa99fd52cbf91ea141182c000ea744be34df581/jnitrace-1.3.3.tar.gz" } ], "1.3.4": [ { "comment_text": "", "digests": { "md5": "d48fbe2f0f0e138d6e5c6e97cc69e7fe", "sha256": "81b946681d044a526c6c380e5cb263286a2e2454b7e11b929c51a0c2771aace4" }, "downloads": -1, "filename": "jnitrace-1.3.4.tar.gz", "has_sig": false, "md5_digest": "d48fbe2f0f0e138d6e5c6e97cc69e7fe", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 33033, "upload_time": "2019-07-31T20:24:05", "url": "https://files.pythonhosted.org/packages/90/ae/10f9ae22c61914f3edc317fab564c7844a14c31c1342043a95cdb25cca7c/jnitrace-1.3.4.tar.gz" } ], "1.3.5": [ { "comment_text": "", "digests": { "md5": "132e0e43d2ea6fbe0b6b4b49a635f7b6", "sha256": "b8d6dd1b68b88dc77a2f30791efca7f40803f3a4048605dc8c4f338d4af09c3f" }, "downloads": -1, "filename": "jnitrace-1.3.5.tar.gz", "has_sig": false, "md5_digest": "132e0e43d2ea6fbe0b6b4b49a635f7b6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 32959, "upload_time": "2019-08-03T05:22:56", "url": "https://files.pythonhosted.org/packages/16/fa/c7b137928f7114a2eef0860440e5e6ed92f2ea9b5400e35fe31e96561c9e/jnitrace-1.3.5.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "eac5d4f47ec5484ebcf833fdd8fd348e", "sha256": "61f19e030f24deca484899ad84c90247b46034875a8f5a828a22f1de44bd8e8f" }, "downloads": -1, "filename": "jnitrace-2.0.0.tar.gz", "has_sig": false, "md5_digest": "eac5d4f47ec5484ebcf833fdd8fd348e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 39344, "upload_time": "2019-08-11T20:43:22", "url": "https://files.pythonhosted.org/packages/91/9f/63a224f337464fb100f7bae749142b741c24da7fdad368eab1fb8352951a/jnitrace-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "27a44714558c0f5f0baa6130dbeda8a1", "sha256": "1d9d65ea319c8a264c3d05cff3b7c43926eaa259cdc9ded3af7d4ef67eab7306" }, "downloads": -1, "filename": "jnitrace-2.0.1.tar.gz", "has_sig": false, "md5_digest": "27a44714558c0f5f0baa6130dbeda8a1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 39589, "upload_time": "2019-08-12T17:35:07", "url": "https://files.pythonhosted.org/packages/36/2c/e2d837c89844c9dd3d1b787bb44ba5fbca3bf066bc7e0879103ce1263a2d/jnitrace-2.0.1.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "03e1f3b9cc345d380b76d98c0d24f032", "sha256": "2c2e3e66fef3a17db1b9dcc32db04288c525a73a8ada38f5247989e9849ab873" }, "downloads": -1, "filename": "jnitrace-2.1.0.tar.gz", "has_sig": false, "md5_digest": "03e1f3b9cc345d380b76d98c0d24f032", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 42490, "upload_time": "2019-08-14T20:53:35", "url": "https://files.pythonhosted.org/packages/1a/cc/291d46cb3a4930324d2472b078d68a87393ee2d0bb265d5a6f8ba32eda9e/jnitrace-2.1.0.tar.gz" } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "3e60ed4d74884743a3edfabdcc469dce", "sha256": "3ee16819821c2664d2a26b2d3b80211e62af1d5db3df9d6128b3a82961c58aff" }, "downloads": -1, "filename": "jnitrace-2.2.0.tar.gz", "has_sig": false, "md5_digest": "3e60ed4d74884743a3edfabdcc469dce", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 42760, "upload_time": "2019-08-15T16:51:38", "url": "https://files.pythonhosted.org/packages/3b/49/2ac48613bf5f342e85ba15416fc210b5711d84172322a77b497c1997d9a9/jnitrace-2.2.0.tar.gz" } ], "2.2.1": [ { "comment_text": "", "digests": { "md5": "13d52ef9af4387f33766dffbee2dadf8", "sha256": "3d4d5d5efaa7790210ece3fdf10af24b56bcf81c3d17c068b7823093eab9ccf6" }, "downloads": -1, "filename": "jnitrace-2.2.1.tar.gz", "has_sig": false, "md5_digest": "13d52ef9af4387f33766dffbee2dadf8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 61608, "upload_time": "2019-08-30T20:33:41", "url": "https://files.pythonhosted.org/packages/ad/ae/b2f0b3f50e5d9624d35e9ea8cfd8a07a4efec78deb5bfaacb6045eb0ccd9/jnitrace-2.2.1.tar.gz" } ], "2.2.2": [ { "comment_text": "", "digests": { "md5": "59027997200ae586fc6cfab6bfc519e0", "sha256": "e5337d7f0aa2f8e0b2aed6b0793e0ccfda15614cd916af15938336f914bc4475" }, "downloads": -1, "filename": "jnitrace-2.2.2.tar.gz", "has_sig": false, "md5_digest": "59027997200ae586fc6cfab6bfc519e0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 61628, "upload_time": "2019-10-17T03:58:07", "url": "https://files.pythonhosted.org/packages/1a/aa/f79bfdd56fc7ffd9759fa9caa28d3a448233a48c783c90240e3160b3bc68/jnitrace-2.2.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "59027997200ae586fc6cfab6bfc519e0", "sha256": "e5337d7f0aa2f8e0b2aed6b0793e0ccfda15614cd916af15938336f914bc4475" }, "downloads": -1, "filename": "jnitrace-2.2.2.tar.gz", "has_sig": false, "md5_digest": "59027997200ae586fc6cfab6bfc519e0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0, <4", "size": 61628, "upload_time": "2019-10-17T03:58:07", "url": "https://files.pythonhosted.org/packages/1a/aa/f79bfdd56fc7ffd9759fa9caa28d3a448233a48c783c90240e3160b3bc68/jnitrace-2.2.2.tar.gz" } ] }