免Root实现静默安装和点击任意位置

免Root实现静默安装与任意位置点击的原理与实践
本文介绍了如何在Android设备上,无需root权限,通过USB调试实现静默安装和模拟任意位置点击。核心原理是通过在shell中运行具有权限的Java程序,利用`app_process`来执行dex文件。详细步骤包括创建Java程序,编译成dex,使用`app_process`执行,以及建立socket服务进行命令交互,最终在无root环境下执行需要shell权限的命令。

 *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

0 前言

最近有了个需求:免 root 实现任意位置点击和静默安装。

这个做过的小伙伴应该都知道正常情况下是不可能实现的。无障碍只能实现对已知控件的点击,并不能指定坐标。但是确实有人另辟蹊径做出来了,譬如做游戏手柄的飞智,他们是用一个激活器,手机开 usb 调试,然后插在激活器上并授权,飞智游戏厅就被「激活」了,然后可以实现任意位置点击。如果不了解的可以去他们官网了解下,在这里不多赘述了。无独有偶,黑域也使用了类似的手段,也可以用电脑的usb调试激活。我们知道,任意位置坐标xy点击是可以在 pc 上通过 shell 命令「input tap x y」来实现的,也不需要 root 权限。但是在应用内通过「Runtime.getRuntime().exec」执行这个 shell 命令却提示「permission denied」也就是权限不足。但是飞智或者黑域却好像使用了某种魔法,提升了自己的权限。

那么问题来了:如何用 usb 调试给 app 提权?

1 原理揭晓

「如何用 usb 调试给 app 提权」这个问题乍一看确实没问题,但是知乎有个回答是「先问是不是,再问为什么」我觉得说的很好。我被这个问题给困扰了很久,最后发现我问错了。

先放出结论「并不是给 app 提权,而是运行了一个有 shell 权限的新程序」

刚才的问题先放一边,我来问大家个新问题,怎样让 app 获取 root 权限?这个问题答案已经有不少了,网上一查便可知其实是获取「Runtime.getRuntime().exec」的流,在里面用su提权,然后就可以执行需要 root 权限的 shell 命令,比如挂载 system 读写,访问 data 分区,用 shell 命令静默安装,等等。

话说回来,是不是和我们今天的主题有点像,如何使 app 获取 shell 权限?嗯,其实差不多,思路也类似,因为本来 root 啦, shell 啦,根本就不是 Android 应用层的名词呀,他们本来就是 Linux 里的名词,只不过是 Android 框架运行于 Linux 层之上, 我们可以调用 shell 命令,也可以在shell 里调用 su 来使shell 获取 root 权限,来绕过 Android 层做一些被限制的事。然而在 app 里调用 shell 命令,其进程还是 app 的,权限还是受限。所以就不能在 app 里运行 shell 命令,那么问题来了,不在 app 里运行在哪运行?答案是在 pc 上运行。当然不可能是 pc 一直连着手机啦,而是 pc 上在 shell 里运行独立的一个 java 程序,这个程序因为是在 shell 里启动的,所以具有 shell 权限。

我们想一下,这个 Java 程序在 shell 里运行,建立本地 socket 服务器,和 app 通信,远程执行 app 下发的代码。因为即使拔掉了数据线,这个 Java 程序也不会停止,只要不重启他就一直活着,执行我们的命令,这不就是看起来 app 有了 shell 权限?现在真相大白,飞智和黑域用 usb 调试激活的那一下,其实是启动那个 Java 程序,飞智是执行模拟按键,黑域是监听系统事件,你想干啥就任你开发了。

「注:黑域和飞智由于进程管理的需要,其实是先用 shell 启动一个 so ,然后再用 so 做跳板启动 Java 程序,而且 so 也充当守护进程,当 Java 意外停止可以重新启动,读着有兴趣可以自行研究,在此不多做说明」

2 好耶!是 app_process

### 如何在非默认路径下安装 CUDA 为了实现 CUDA 在非默认路径下的安装,可以按照以下方法操作: #### Windows 平台上的自定义路径安装 当需要在 Windows 上更改 CUDA 的安装路径时,可以在安装过程中手动指定目标文件夹的位置。启动 CUDA 安装程序后,在安装向导界面中会出现选项让用户选择安装路径[^1]。通过这种方式,可以选择任意磁盘或目录作为安装的目标。 完成安装之后,如果计划使用 cuDNN,则需下载对应的版本并将解压后的三个文件夹(bin、include lib)复制到所选的自定义 CUDA 路径下。例如,假设选择了 `D:\CustomCUDA` 作为新的安装位置,则应将这些文件夹放入该目录内。 最后一步是更新环境变量 PATH 来反映新设置的 CUDA 地址。具体做法是在系统的高级属性里编辑 Path 变量,加入类似于这样的条目:`D:\CustomCUDA\bin;D:\CustomCUDA\libnvvp`。 #### Linux 平台上的自定义路径安装 对于 Linux 用户来说,可以通过运行带有特定参数的脚本来控制安装地点。比如采用.run 文件形式分发的 NVIDIA CUDA 工具包支持命令行模式安装,并允许调整一些关键配置项如 toolkit root directory 等][^[^23]。 以下是针对 .run 文件的一个典型例子: ```bash sudo ./cuda_<version>_linux.run --toolkitpath /usr/local/cuda-custom --silent ``` 这里 `/usr/local/cuda-custom` 就是我们设定的新家目录而不是标准建议使用的 `/usr/local/cuda-<version>` 或者其他预设值之一[^3]。注意这里的 silent 参数表示静默方式执行;如果不希望如此则去掉它以便观察过程中的提示信息。 另外需要注意的是,如果你不是以超级用户身份登录系统而又要改变全局可用资源的话可能还需要额外处理权限问题以及通知其他依赖此服务的应用知晓这个变动情况。 ### 验证安装是否成功 无论在哪种操作系统上完成了上述步骤以后都推荐再次确认整个流程无误。这通常涉及调用几个简单的测试工具来检查硬件兼容性软件功能正常运作状况。Windows 下可参照之前提到过的 deviceQuery.exe bandwidthTest.exe 实施初步检测; 对于 Unix-like OS 则可以直接尝试编译一个小样例项目看看能否顺利链接至 GPU 加速库函数[^2]: ```cpp // test.cu #include <stdio.h> int main() { int nDevices; cudaGetDeviceCount(&nDevices); for (int i = 0; i < nDevices; ++i) { cudaDeviceProp prop; cudaGetDeviceProperties(&prop, i); printf("Device Number: %d\n", i); printf(" Device name: %s\n", prop.name); printf(" Memory Clock Rate (KHz): %d\n", prop.memoryClockRate); } } ``` 接着利用 NVCC 编译器构建二进制文件并立即运行之: ```bash $ nvcc -o test test.cu $ ./test ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值