我有一个应用程序,可以创建用于流量转发的 ssh 连接隧道。但它在 targetSdkVersion 28 及更低版本上完美运行。但在 targetSdkVersion>28 上运行(执行)以下命令时(运行二进制文件时),它会引发错误 126 或权限被拒绝。
我不知道 api 版本 29 到底发生了什么变化(权限或 /data/data/ 或其他)。错误不清楚。
protected static String BASE = "/data/data/com.staf621.ki4a/ki4a";
protected static String BASE_BIN = "/bin";
ssh_return_val = Util.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);
}
日志猫:
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/sshpass: Permission denied
[libsuperuser][O][SH-] 126
[libsuperuser][C][SH%] END
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][C][SH+] /data/data/com.staf621.ki4a/ki4a/bin/busybox killall -9 korkscrew;/data/data/com.staf621.ki4a/ki4a/bin/busybox killall -9 ssh;/data/data/com.staf621.ki4a/ki4a/bin/busybox killall -9 tun2socks/data/data/com.staf621.ki4a/ki4a/bin/busybox killall pdnsd
[libsuperuser][C][SH%] END
[libsuperuser][C][SH%] START
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][C][SH+] /data/data/com.staf621.ki4a/ki4a/bin/busybox killall pdnsd; echo $?
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][C][SH%] END
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][O][SH-] 126
我附上了 /data/data/packagename/ 文件的图像以及二进制文件的内容和权限。 看图
在 targetSdkVersion<=28, it works perfectly, but on targetSdkVersion>28 上,运行二进制文件时捕获错误 126 和权限被拒绝
targetSdkVersion 28 是 Android 10 之前的最后一个版本。 https://developer.android.com/about/versions/10/behavior-changes-10#execute-permission 是之后发生的变化:
https://github.com/termux/termux-packages/wiki/Termux-and-Android-10从可写应用程序主目录执行文件属于 W^X 违规。应用程序应仅加载嵌入应用程序 APK 文件中的二进制代码。
针对 Android 10 的不受信任应用程序无法直接调用应用程序主目录中的文件。
此外,面向 Android 10 的应用程序无法在内存中修改使用execve()
打开的文件中的可执行代码,并希望这些更改写入磁盘,因为该库无法通过可写映射
文件描述符。这包括任何具有文本重定位的共享对象 (dlopen()
) 文件。 这正是您想要做的。这与 Termux 遇到的问题完全相同,导致他们无法向 Play 商店发布任何更新;有关更多信息,请参阅PROT_EXEC