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
相关产品推荐
相关产品推荐

