在android上执行二进制文件时权限被拒绝 targetSdkVersion>28

问题描述 投票:0回答:1

我有一个应用程序,可以创建用于流量转发的 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 和权限被拒绝

java android android-studio
1个回答
0
投票

targetSdkVersion 28 是 Android 10 之前的最后一个版本。 https://developer.android.com/about/versions/10/behavior-changes-10#execute-permission 是之后发生的变化:

从可写应用程序主目录执行文件属于 W^X 违规。应用程序应仅加载嵌入应用程序 APK 文件中的二进制代码。

针对 Android 10 的不受信任应用程序无法直接调用应用程序主目录中的文件。

此外,面向 Android 10 的应用程序无法在内存中修改使用 

execve()

打开的文件中的可执行代码,并希望这些更改写入磁盘,因为该库无法通过可写映射

dlopen()
文件描述符。这包括任何具有文本重定位的共享对象 (
PROT_EXEC
) 文件。

这正是您想要做的。这与 Termux 遇到的问题完全相同,导致他们无法向 Play 商店发布任何更新;有关更多信息,请参阅
https://github.com/termux/termux-packages/wiki/Termux-and-Android-10

https://github.com/termux-play-store

© www.soinside.com 2019 - 2024. All rights reserved.