V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zinwalin
V2EX  ›  Android

[Android10 定制] 系统级 app 无法正确执行二进制文件

  •  
  •   zinwalin · 2022-07-06 21:02:54 +08:00 · 9920 次点击
    这是一个创建于 902 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自家的 System App(比如 Home Launcher)里面通过 Runtime.getRuntime().exec("$command\n")来调用这个二进制文件时,无法正常执行(没有写入文件的实际操作),但是在 adb shell 下是可以正常执行的。

    SELinux 的权限问题已经解决,执行时无报错了。

    备注: 此二进制文件的功能是把一个文件写入覆盖到某个分区,从某个文件拷贝数据,然后写入到此分区所在的设备块上。

    13 条回复    2022-07-14 19:11:07 +08:00
    codehz
        1
    codehz  
       2022-07-06 21:58:13 +08:00
    (虽然正常思路是做一个特权系统服务,然后通过 binder 向应用提供功能(
    因为即使是特权应用也是拿不到 shell 级别的权限的(
    非得野路子的话,就把系统 root 了吧,放个自定义 su ,自动给特定 uid 开 shell
    zinwalin
        2
    zinwalin  
    OP
       2022-07-06 22:47:20 +08:00
    @codehz 公司卖的平板,正式版本是去年 su 的,安全考虑,我试着把相应类型的 device 加入相关的.te 文件里。
    scys
        3
    scys  
       2022-07-07 01:10:39 +08:00
    SELinux 是关闭,还是你写了规则?
    如果规则的话,看看有没有给与执行权限,并且路径必须准确。
    而这个二进制的需求,你都已经是 System 权限了,为啥不用 Java 实现?
    yuedashi
        4
    yuedashi  
       2022-07-07 08:08:18 +08:00
    虽然你说没 selinux 权限报错了,我还是建议先 adb shell setenforce 0 .
    zinwalin
        5
    zinwalin  
    OP
       2022-07-07 09:26:33 +08:00
    @scys 二进制有可执行的权限,shell 下可以执行,二进制代码涉及到打开 /dev/block/mmcblk0p1 设备,但是失败了。
    zinwalin
        6
    zinwalin  
    OP
       2022-07-07 09:26:59 +08:00
    @yuedashi 已经加上了,还是一样。selinux 是 permissive.
    zinwalin
        7
    zinwalin  
    OP
       2022-07-07 09:37:20 +08:00
    @yuedashi

    我在 system_app.te 里加了这三行

    allow system_app system_file:file { open read execute_no_trans }; // 解决二进制文件 execute_no_trans 问题
    allow system_app sdcard_block_device:chr_file rwx_file_perms;
    allow system_app sdcard_block_device:chr_file { open read write ioctl };
    zinwalin
        8
    zinwalin  
    OP
       2022-07-07 09:37:27 +08:00
    @scys


    我在 system_app.te 里加了这三行

    allow system_app system_file:file { open read execute_no_trans }; // 解决二进制文件 execute_no_trans 问题
    allow system_app sdcard_block_device:chr_file rwx_file_perms;
    allow system_app sdcard_block_device:chr_file { open read write ioctl };
    tsann
        9
    tsann  
       2022-07-14 08:53:53 +08:00   ❤️ 1
    可以让 init 来执行这个二进制文件,随着 Android 系统权限的收紧在 App 里执行特殊权限的命令越来越麻烦

    1.在 init.target.rc 里定义一个 service ,比如:
    service write_xxx system/bin/write_xxx

    再定义一个触发条件:
    on property:sys.write_start=1
    start write_xxx
    setprop sys.write_start 0

    2. 在 App 或系统服务代码里执行
    SystemProperties.set ("splash.write_start","1"); 就会触发 start write_xxx 的执行
    tsann
        10
    tsann  
       2022-07-14 08:54:35 +08:00
    然后等待 sys.write_start 是否为 0 ,来判断 write_xxx 是否完成
    zinwalin
        11
    zinwalin  
    OP
       2022-07-14 10:43:54 +08:00
    @ican147 太强了。 顺便问一下,sys.write_start 需要在其它地方先声明吗?
    tsann
        12
    tsann  
       2022-07-14 14:27:09 +08:00
    sys.write_start 不用其它地方声明,但可能要调试一下,在 system/core/init/里可能有对这个 action 做限制,像 Android9 里有个 kExportedActionableProperties 数组用来定义可以触发 action 的 Properties
    zinwalin
        13
    zinwalin  
    OP
       2022-07-14 19:11:07 +08:00
    @ican147 感谢分享,很有用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 08:32 · PVG 16:32 · LAX 00:32 · JFK 03:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.