Android:从应用程序执行二进制文件

2024-01-20

正如标题所示,我想从我的 android 应用程序执行一个二进制文件。我使用 NDK 创建了一个二进制文件,并可以使用 adb shell 运行它。然后我尝试使用 Runtime exec 运行它,但权限被拒绝。我尝试了不同的目录并更改文件权限。

我研究了这个问题,发现很多堆栈溢出问题/答案大多已经过时。不同版本的 Android 安全性似乎发生了很大变化。

我发现了什么:操作系统阻止应用程序执行自己编写的代码。这就是所谓的写入异或执行 https://en.wikipedia.org/wiki/W%5EX并且有道理。 .apk 和 .dex 文件除外。这应该意味着我想要的东西是不可能的。

我还发现一些应用程序能够执行此类二进制文件,例如Android离线C编译器 https://play.google.com/store/apps/details?id=com.kvassyu.coding.c,它编译并执行 C 代码。另一个可以执行二进制文件的著名应用程序是终端模拟器Termux https://github.com/termux/termux-app。另外,有趣的是,在执行二进制文件时,它们都具有与 adb shell 相同的性能。因此,我假设他们在 shell 上运行二进制文件。

我最终想知道的是这些应用程序如何执行这些二进制文件以及我是否可以实现相同的目标。

我进一步研究了这两个应用程序的代码,它们使用本机代码创建一个执行 shell 命令的进程。相反,我总是使用 Runtime 对象,它可以从 Java 访问。此外,他们还使用本机代码来更改文件权限。这让我想知道使用本机代码是否可以为开发人员提供更多关于这些限制的自由。

我的问题:尝试执行二进制文件时使用 Java 还是本机代码有什么区别吗?如果不是,他们可以执行二进制文件的原因是什么?这可以用 Java 实现吗?

以下是 Termux 的本机代码,它创建一个执行 shell 命令的子进程:


static int create_subprocess(JNIEnv *env, const char *cmd, char *const argv[], char *const envp[], int masterFd)
{
    // same size as Android 1.6 libc/unistd/ptsname_r.c
    char devname[64];
    pid_t pid;

    fcntl(masterFd, F_SETFD, FD_CLOEXEC);

    // grantpt is unnecessary, because we already assume devpts by using /dev/ptmx
    if(unlockpt(masterFd)){
        throwIOException(env, errno, "trouble with /dev/ptmx");
        return -1;
    }
    memset(devname, 0, sizeof(devname));
    // Early (Android 1.6) bionic versions of ptsname_r had a bug where they returned the buffer
    // instead of 0 on success.  A compatible way of telling whether ptsname_r
    // succeeded is to zero out errno and check it after the call
    errno = 0;
    int ptsResult = ptsname_r(masterFd, devname, sizeof(devname));
    if (ptsResult && errno) {
        throwIOException(env, errno, "ptsname_r returned error");
        return -1;
    }

    pid = fork();
    if(pid < 0) {
        throwIOException(env, errno, "fork failed");
        return -1;
    }

    if(pid == 0){
        int pts;

        setsid();

        pts = open(devname, O_RDWR);
        if(pts < 0) exit(-1);

        ioctl(pts, TIOCSCTTY, 0);

        dup2(pts, 0);
        dup2(pts, 1);
        dup2(pts, 2);

        closeNonstandardFileDescriptors();

        if (envp) {
            for (; *envp; ++envp) {
                putenv(*envp);
            }
        }

        execv(cmd, argv);
        exit(-1);
    } else {
        return (int) pid;
    }
}

如果我遗漏了一些东西并且还有其他一些执行二进制文件的技巧,我也想听听。

非常感谢任何帮助和/或见解!

P.S.:可能也很重要,我不想将二进制文件包含在 .apk 中,而是在应用程序运行时下载或写入它。此外,二进制文件并不复杂。我目前只是尝试执行“Hello world”二进制文件。


我发现了差异,它与本机代码无关......

这些应用程序使用targetSdkVersion 28或更低,仍然允许执行二进制文件。这意味着可以使用以下命令执行二进制文件Runtime对象以及此 SDK 版本中的本机代码。

这些应用程序仍然可以安装在较新的 Android 版本上。

所以我通过设置解决了我的问题targetSdkVersion to 28.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:从应用程序执行二进制文件 的相关文章

  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • Android相机意图:如何获取全尺寸照片?

    我正在使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • Android构建apk:控制MANIFEST.MF

    Android 构建 APK 假设一个 apk 包含一个库 jar 例如 foo jar 该库具有 META INF MANIFEST MF 这对于它的运行很重要 但在APK中有一个包含签名数据的MANIFEST MF 并且lib jar
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • SharedFlow 和 StateFlow 的主要区别

    两者有什么区别共享流 and 状态流 以及如何使用这些MVI建筑学 使用简单更好吗Flow或者这些作为状态和事件 Flow 是冷的 意味着它仅在收集数据时才发出数据 另外Flow不能保存数据 可以把它看成是水在里面流动的管道 Flow中的数
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它

随机推荐

  • asp.net mvc 中数据库上下文类的用途是什么

    我是 MVC 新手 并且已经完成了一些教程来掌握它的窍门 但在其中一些教程中我遇到了一个带有 DbContext 类的示例asp net mvc5 与 EF6 教程 https www asp net mvc overview gettin
  • 使用 i18n 进行 Vuelidate:在区域设置消息中找不到密钥

    因此 在我的 i18n validators js 文件中 我想将带有翻译消息的验证器导出为我选择的语言 并在我的 vue 组件中使用它们来验证表单 My code import as VuelidateValidators from ht
  • C# 读取xml文件

    我正在尝试拉
  • 如何绑定内联匿名函数?

    我在尝试着bind ie bind this 内联匿名回调函数object如何做呢 简化示例 var object property function this id abc this binds to the object aFuncti
  • D3:使用 d3.max 获取包含对象?

    我有以下数据 一个对象数组 var data x 0 y0 0 y 100 x 1 y0 0 y 150 x 2 y0 50 y 100 x 3 y0 50 y 150 我想找到之间差异最大的对象y and y0 使用 D3 我可以这样做以
  • Netbeans 中的拆分窗口

    我正在尝试拆分我的窗口 以便我可以在 1 个屏幕上拥有 2 个不同的类或其他内容 但它只会拆分同一类 文件 其他内容的窗口 我已经使用 netbeans 多年了 但仍然无法做到这一点 这可能吗 您没有具体提及您正在使用哪个版本的 NetBe
  • SQL Server SMO - 备份 - 如何确定失败/成功?

    如果使用 SMO 执行备份 成功完成后 我测试 SqlError 是否为 null 认为备份已完成且没有错误 但是 正如您所看到的 它实际上返回了 0 类编号 3014 的错误 这意味着成功 所以问题是 问 如何确定备份是否成功完成 以及如
  • 与 jasperReports 完全混淆

    在开始工作前两天 我才刚刚接触 jasper 我下载了 jasperReports 和 iReports 并在我的 salesforce 帐户中安装了 iReports 并安装了 jasper4salesforce 但没有找到任何 jasp
  • jQuery - 内联调用函数

    我正在尝试将一个变量传递给内联 jQuery 函数 即 使用onMouseOver function 在实际链接内 这是图像映射中的区域标记 仅当我将其放在之前时才会调用该函数 document ready function 行 但这样做会
  • 大文件上传(WebException:连接意外关闭)

    UPDATED 看帖子 3 https stackoverflow com questions 1060966 big files uploading webexception the connection was closed unexp
  • android manifestPlaceholders - 如何使用布尔值

    我创建的清单占位符如下所示 manifestPlaceholders appDrawerName Staging canExport true 我正在尝试使用它来设置活动的以下导出属性
  • Forge Viewer 在多模型上下文中选择

    我们的扩展目前利用viewer select 和模型中的dbId 列表 我们的客户希望在同一查看器中看到辅助模型 我们让他们能够在加载第一个模型后加载参考模型 然而 我们遇到了多个模型的问题 观众从其中一个模型中进行选择以外当我们调用vie
  • 有没有办法在Delphi中仅跟踪项目源?

    我正在使用 Delphi 2010 我想知道是否有一种方法可以跟踪项目中的代码 而无需跟踪对包含的 VCL 的调用 For example you put in a breakpoint and then use Shift F7 to t
  • CanCan - 访问被拒绝 - 如何让 CanCan 在 LOG 中指定 为什么?

    我正在努力实现 CanCan 由于某种原因 当我尝试获取有关模型权限的具体信息时 CanCan 不断给出 访问被拒绝 的信息 我不明白为什么 有没有办法让 CanCan 具体说明 也许是在日志中或在开发过程中了解为什么访问被拒绝 比如 没有
  • 非静态模板成员:可能吗?

    是否可以在类中创建非静态模板字段 如果没有 如何解决 此类字段应根据需要在编译时创建 Example 我有很多B 类 如B1 B2 B3 在实际情况中 它们有更有意义的名称 我想创建一个类D具有非静态模板函数add
  • R - 绘制六边形镶嵌

    我想生成一些正方形图 其中有六边形数组 如图所示here http gwydir demon co uk jo tess bighex htm 我想绘制规则 几何规则 和异常六边形镶嵌 所以我认为 sp 包中的工具不起作用 下面是我使用 o
  • 如何将 LinqPAD 中的数据导出为 JSON?

    我想创建一个 JSON 文件作为简单 Web 原型设计练习的一部分 LinqPAD 非常适合以我需要的形式从数据库访问数据 但是我无法轻松地将其作为 JSON 获取 我并不真正关心模式是什么 因为我可以调整我的 JavaScript 以处理
  • 如何在 C# 中检查 Microsoft Edge Chromium 是否安装

    C 中检测 Microsoft Edge Chromium 是否已安装并且同时不检测 Edge 仍在系统中而 Chromium 应覆盖 旧 Edge 的最佳方法是什么 最好使用 Windows 注册表 For 检测旧边缘 https sta
  • 使用 jest 和 vue-test-utils 进行 Vue 测试无法解析通过 app.component() 引入的组件

    我目前正在尝试向我的 Vue 3 Vite 应用程序引入测试 我为此使用 jest 和 vue test utils 这工作正常 除了当我尝试安装包含我的基本组件的组件时 我在 app mount app 之前用 app component
  • Android:从应用程序执行二进制文件

    正如标题所示 我想从我的 android 应用程序执行一个二进制文件 我使用 NDK 创建了一个二进制文件 并可以使用 adb shell 运行它 然后我尝试使用 Runtime exec 运行它 但权限被拒绝 我尝试了不同的目录并更改文件