一个跟踪android应用程序中jni使用情况的工具

jnitrace的Python项目详细描述


jnitrace

一个基于frida的工具,用于跟踪android应用程序中jni api的使用。

android应用程序中包含的本机库经常使用jni api来 利用android运行时。追踪那些电话 手工逆向工程是一个缓慢而痛苦的过程。jnitrace工作 作为一种动态分析跟踪工具,类似于FRIDA TRACE或strace,但是 JNI

jnitrace output

安装:

使用jnitrace运行的最简单方法是使用pip安装:

pip安装jnitrace

依赖项:
  • ARM、ARM64、x86或x64 Android设备
  • Frida安装在Android设备上
  • FRIDA支架>;12
  • 使用python 3和pip的linux、mac或windows主机

运行:

在pip安装之后,很容易运行jnitrace:

jnitrace-l libnative-lib.so com.example.myapplication

jnitrace运行跟踪至少需要两个参数:

  • -l libnative lib.so-用于指定要跟踪的库。此参数可以多次使用,也可以用于跟踪所有库。例如,-l libnative-lib.so-l libanother lib.so-l*
  • com.example.myapplication-是要跟踪的Android包。此软件包必须已安装在设备上。

可选参数如下所示:

  • -m<;spawn attach>;-用于指定要使用的FRIDA附加机制。它可以是繁殖或附加。生成是默认和推荐的选项。
  • -b<;fuzzy acquisite none>;-用于控制回溯输出。默认情况下,jnitrace将运行 在精确模式下使用回溯程序。此选项可以更改为fuzzy模式或用于停止回溯 使用none选项。有关差异的解释,请参阅FRIDA文档。
  • -i<;regex>;-用于指定应跟踪的方法名。这有助于减少特别大的jni应用程序中的噪音。此选项可以多次提供。例如,-i get-i registernations将包括 只有在名称中包含get或registernates的JNI方法。
  • -e<;regex>;-用于指定跟踪中应忽略的方法名。这有助于减少特别大的jni应用程序中的噪音。此选项可以多次提供。例如,-e^find-e getenv将从 结果开始查找或包含getenv的所有jni方法名。
  • -i<;string>;-用于指定应跟踪的库的导出。这对于只有 希望跟踪少量方法。jnitrace认为导出的函数是任何可以直接调用的函数 从Java方面,也就是说,包括使用RealStnistic绑定的方法。此选项可以多次提供。例如, -i stringfromjni-i nativemethod([b)v可用于包括从库导出的名为java-com-nativetest-mainactivity\u stringfromjni和使用带有nativemethod([b)v签名的registernames绑定的方法
  • -e<;string>;用于指定不应跟踪的库的导出。这对于您所在的库很有用 有一组要忽略的繁忙本机呼叫。JNITRACE认为导出的函数是从Java端直接调用的任何函数,因此,包括MeMo。使用寄存器绑定的ds。此选项可以多次提供。例如,-e jni-onload-e nativemethod将从跟踪中排除jni-onload函数调用和任何方法 名称为nativemethod
  • -o path/output.json-用于指定输出路径,其中jnitrace将存储所有跟踪数据。信息以json格式存储,以便以后对跟踪数据进行后处理。
  • -p path/to/script.js-提供的路径用于在加载jnitrace脚本之前将frida脚本加载到目标进程中。这可用于在jnitrace启动之前击败anti-frida或反调试代码。
  • -路径/to/script.js-提供的路径用于在加载jnitrace之后将frida脚本加载到目标进程中。
  • --隐藏数据-用于减少控制台中显示的输出数量。此选项将隐藏显示为十六进制转储或字符串反引用的其他数据。
  • --ignore env-使用此选项将隐藏应用程序使用jnienv结构进行的所有调用。
  • --忽略vm-使用此选项将隐藏应用程序使用javavm结构进行的所有调用。

注意

记住,在运行jnitrace之前,frida服务器必须运行。如果 按照安装frida的说明,下面的命令将启动服务器以准备jnitrace:

adb shell/data/local/tmp/frida服务器

建筑:

从源代码构建jnitrace需要首先安装节点。 安装节点后,需要运行以下命令:

  • npm安装
  • NPM运行监视

npm run watch将在后台运行frida compile将源代码编译到输出 文件,build/jnitrace.jsjnitrace.py默认情况下从build/jnitrace.js加载,因此没有其他 运行更新需要更改。

输出:

jnitrace output

与frida trace一样,输出是基于api调用线程着色的。

在屏幕中线程id的正下方是jni api方法名。 方法名与jni.h头文件中的方法名完全匹配。

后续行包含由-指示的参数列表。后 -字符是参数类型,后跟参数值。为了 jFrm、JField和JavaCype将以卷曲形式显示 支撑。这取决于jnitrace已经看到了原始方法, 字段或类查找。对于任何传递缓冲区的方法,jnitrace将 从参数中提取缓冲区并将其显示为 参数值。

返回值以=的形式显示在列表底部,并且不会 请使用无效方法。

如果启用了回溯,FRIDA回溯将显示在 方法调用。请注意,根据Frida文档,模糊回溯是 不总是准确的,准确的回溯可能提供有限的结果。

详细信息:

这个项目的目标是创建一个可以跟踪jni api调用的工具。 适用于大多数Android应用程序。

不幸的是,在 jnienv结构重载应用程序。它会根据 其他不相关的库也使用 libart.so中的相同函数<·代码>< /P>

为了解决这个性能障碍,jnitrace创建一个影子jnienv 它可以提供给它想要追踪的图书馆。Jnienv包含一个系列 函数蹦床,通过一些自定义 Frida NativeCallbacks可跟踪这些功能的输入和输出。

通用的frida api在提供构建平台方面做得很好 这些功能蹦床用最少的努力。然而,这种简单的方法 不适用于所有jnienv api。跟踪所有 方法是在api中使用可变参数。不可能 提前为这些函数创建nativecallback,因为它是未知的 预先将调用的Java方法的所有不同组合。

解决方案是监视调用getmethodidgetstaticmethodid,用于从运行时中查找方法标识符。 一旦jnitrace看到jmethod查找,它就有一个已知的 方法签名的ID。稍后,当生成JNI Java方法调用时,初始化 nativecallback用于提取调用中的方法id。该方法 然后分析签名以提取方法参数。一旦jnitrace 提取方法中的参数,它可以动态创建 方法的NativeCallback。新的nativecallback被返回 一些特定于体系结构的外壳代码用于设置堆栈 并注册以允许该调用成功运行。那些乡巴佬 对于特定的方法进行缓存,以允许回调更有效地运行 如果一个方法被多次调用。

另一个简单的国家背景不足以 从方法调用中提取参数,用于使用 vau args指针作为最终参数。在这种情况下,jnitrace使用一些代码 从提供的指针中提取参数。这又是建筑 具体。

这些函数调用中跟踪的所有数据都被发送到python控制台 格式化并显示给用户的应用程序。

建议:

此工具的大多数测试都是在运行 棉花糖。如果在其他设备上运行时遇到任何问题,请提交 问题,但如果可能,建议尝试在类似的 模拟器。

问题:

对于运行jnitrace时遇到的任何问题,请在 github.请在提交的问题中包括以下信息:

  • 正在运行的设备
  • 您使用的Frida版本
  • 正在运行的应用程序
  • 任何显示的错误消息

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
IntelliJ中的java默认Maven项目结构不一致   java我希望链接(在帖子和页面上)在一些访问者加载时被自动点击   java如何使用单独的方法隐藏JButton并在新类中调用   java KStream leftJoin KStream具有相同的密钥   java图像在垂直滚动窗格视图端口中消失   java从指定的起始点开始以n的增量填充数组   java JLabel和JTextField不在swing表单中应用   java springboot mongo如果没有映像,请使用现有映像   类似C++映射的java容器   java如何在没有Valgrind错误的情况下调用JNI_CreateJavaVM?   java如何在安卓中运行后台服务   java onPostExecute不运行