You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android targetSdkVersion>28执行二进制文件提示Permission denied问题

问题:targetSdkVersion>28时执行二进制文件触发Permission denied(错误码126)

背景

  • 开发的SSH隧道流量转发应用,在targetSdkVersion ≤28时运行正常,当targetSdkVersion >28时,执行二进制文件会触发Permission denied或错误码126,怀疑是W^X violation导致。
  • 二进制文件已嵌入APK(存放路径:app/src/main/assets/bin),应用安装后将文件复制到/data/data/package_name/myfiles/bin目录,并通过代码设置755权限。

权限设置代码

String BASE = "/data/data/*package_name*/myfiles";
String BASE_BIN = "/bin"
Util.runChainFireCommand("chmod 755 " + BASE + BASE_BIN + "/busybox;" +
     "chmod 755 " + BASE + BASE_BIN + "/korkscrew;" +
     "chmod 755 " + BASE + BASE_BIN + "/redsocks;" +
     "chmod 755 " + BASE + BASE_BIN + "/iptables;" +
     "chmod 755 " + BASE + BASE_BIN + "/ssh;" +
     "chmod 755 " + BASE + BASE_BIN + "/sshpass;" +
     "chmod 755 " + BASE + BASE_BIN + "/tun2socks;" +
     "chmod 755 " + BASE + BASE_BIN + "/pdnsd",true);

命令执行代码

public static int runChainFireCommand(String command, boolean root, boolean fork, boolean ask4retval) {

    final int[] retval = new int[1];
    if(fork)
    {
        final String myCommand = command;
        final boolean myRoot = root;
        final boolean myAsk4retval = ask4retval;
        Thread t = new Thread(){
            @Override
            public void run(){
                if(myRoot) {
                    Shell.run("su", new String[]{myCommand}, new String[]{}, true);
                    retval[0] = 0;
                }
                else {
                    if(myAsk4retval) {
                        try {
                            retval[0] = Integer.parseInt(Shell.run("sh", new String[]{myCommand + "; echo $?"}, new String[]{}, false).get(0));
                        } catch (Exception e) {
                            retval[0] = 0;
                        }
                    } else {
                        Shell.run("sh", new String[]{myCommand}, new String[]{}, false);
                        retval[0] = 0;
                    }
                }
            }
        };
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    else {
        if(root) {
            Shell.run("su", new String[]{command}, new String[]{}, false);
            retval[0] = 0;
        }
        else {
            if(ask4retval) {
                try {
                    retval[0] = Integer.parseInt((Shell.run("sh", new String[]{command + "; echo $?"}, new String[]{}, false)).get(0));
                } catch (Exception e) {
                    retval[0] = 0;
                }
            } else {
                Shell.run("sh", new String[]{command + "; echo $?"}, new String[]{}, false);
                retval[0] = 0;
            }
        }
    }
    return retval[0];
}

ssh_return_val = runChainFireCommand(
                        ((key_switch && !enc_ssh_key) ? "" : BASE + BASE_BIN + "/sshpass -p \"" + password_text + "\" ")
                                + BASE + BASE_BIN + "/ssh " + server_text + " -p " + port_number + " -l " + user_text
                                + " -NT -g -D " + Util.localSocksPort + (dns_switch?" -L 127.0.0.1:8163:"+dns_server+":53":""
                                + forward_string
                                + (key_switch ? " -i \"" + BASE + "/id_rsa\"" : "")
                                + (compress ? " -C" : "")
                                + " -o \"ProxyCommand " + BASE + BASE_BIN + "/korkscrew"
                                + (iptables_switch ? "" : " --ancillaryfile " + BASE + "/sshfd_file")
                                + (proxy ? " --proxyhost " + proxy_host
                                + " --proxyport " + proxy_port + " --desthost %h --destport %p"
                                + " --headerfile " + BASE + "/header_file" + "\""
                                : " --directconnection --desthost %h --destport %p\"")
                                + " -o \"KeepAlive yes\" -o \"ServerAliveInterval 15\""
                                + " -o \"StrictHostKeyChecking=no\" -o \"GlobalKnownHostsFile=/dev/null\"", false, true);

二进制文件权限状态

文件权限已设置为-rwxr-xr-x(755),符合可执行要求。

Logcat错误日志

[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/package_name/myfiles/bin/sshpass: Permission denied
[libsuperuser][O][SH-] 126
[libsuperuser][C][SH%] END
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/package_name/myfiles/bin/busybox: Permission denied
[libsuperuser][C][SH+] /data/data/package_name/myfiles/bin/busybox killall -9 korkscrew;/data/data/package_name/myfiles/bin/busybox killall -9 ssh /data/data/package_name/myfiles/bin/busybox killall -9 tun2socks/data/data/package_name/myfiles/bin/busybox killall pdnsd
[libsuperuser][C][SH%] END
[libsuperuser][C][SH%] START
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/package_name/myfiles/bin/busybox: Permission denied
[libsuperuser][C][SH+] /data/data/package_name/myfiles/bin/busybox killall pdnsd; echo $?
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/package_name/myfiles/bin/busybox: Permission denied
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/package_name/myfiles/bin/busybox: Permission denied
[libsuperuser][C][SH%] END
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/package_name/myfiles/bin/busybox: Permission denied
[libsuperuser][O][SH-] 126

求助内容

已按建议将二进制文件嵌入APK以避免W^X violation,但仍出现权限拒绝错误,求可行的解决办法。

内容的提问来源于stack exchange,提问作者Beam config

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:00:57