首页
论坛
课程
招聘

[原创]修改ro属性的小工具新版本-170119

2017-1-19 16:23 21449

[原创]修改ro属性的小工具新版本-170119

2017-1-19 16:23
21449
这次修改主要考虑兼容Android 4.x-7.x 。
7.x中属性数据结构及selinux策略变化太大,老的方式不好适配。
索性改了个思路,直接ptrace init进程,对标红的ro.属性的判断逻辑进行修改,跳过,这样任意属性就都可以设置了。

system\core\init\property_service.c*
static int property_set** (const char* name, const char* value) {
    ......
    prop_info* pi = (prop_info*) __system_property_find(name);

    if(pi != 0) {
        /* ro.* properties may NEVER be modified once set */
        [COLOR="Red"]if(!strncmp(name, "ro.", 3)) return -1;[/COLOR]

        __system_property_update(pi, value, valuelen);
    } else {
        int rc = __system_property_add(name, namelen, value, valuelen);
        if (rc < 0) {
            return rc;
        }
    }
   ...


使用该工具修改ro.属性的前提:
1. adb shell 拥有root权限,或者 adb shell su 以后可以拥有root权限;
2. 1中获取的shell 其 selinux domain为permissive domain,如 u:r:su:s0 或者 其他可以ptrace init进程且有设置ro.xx目标属性selinux权限的domain。

用法:
adb push .\libs\armeabi-v7a\mprop /data/local/tmp/
adb shell "chmod 755 /data/local/tmp/mprop"

# 修改init进程中的ro属性判断逻辑
adb shell "/data/local/tmp/mprop"

# 之后就可以修改任意ro属性了,如
adb shell "setprop ro.debuggable 1"

# 恢复init默认逻辑,之后就无法再修改ro属性了
adb shell "/data/local/tmp/mprop -r"

[求职]想求职找工作,请来看雪招聘投递简历!

上传的附件:
最新回复 (37)
ckis 2017-1-19 16:35
2
0
支持一下

修改后 全局都生效吗?还是只在特定的范围内生效?
netsniffer 2017-1-19 16:59
3
0
全局生效
cqzhou 2017-1-20 10:28
4
0
这个不错哦
hnyzlst 2017-3-5 00:12
5
0
能不能给源码,我把它弄进busybox
少年好学 2017-4-3 13:36
6
0
感谢  分享!!!
少年好学 2017-4-3 13:57
7
0
运行好像失败了      !!  malloc  :  Out  of  memory
hongde 2017-5-11 17:08
8
0
感谢,这个厉害了
melonpi 2017-5-19 09:49
9
0
少年好学 运行好像失败了 !! malloc : Out of memory
同样,用不了。
netsniffer 2017-5-19 10:29
10
0
melonpi 同样,用不了。
什么手机?    adb  shell  getprop  ro.build.fingerprint    看一下版本,
再用  /data/local/tmp/mprop  -v  运行一下,看提示什么错误?
melonpi 2017-5-19 11:53
11
0
netsniffer 什么手机? adb shell getprop ro.build.fingerprint 看一下版本, 再用 /data/local/tmp/mprop -v 运行一下,看提示什么错误?
```
//fingerprint
Xiaomi/armani/armani:4.3/JLS36C/JHCCNBD22.0:user/release-keys

//执行  adb  shell  /data/local/tmp/mprop  -v
start  hacking  ...
target  mapped  area:  0xffffff5c-0xb6f7e429
!!  malloc  :  Out  of  memory
```
melonpi 2017-5-19 18:34
12
0
netsniffer 什么手机? adb shell getprop ro.build.fingerprint 看一下版本, 再用 /data/local/tmp/mprop -v 运行一下,看提示什么错误?
于是还有下文吗?
netsniffer 2017-5-22 09:32
13
0
把这个命令的输出贴一下
adb  shell  /proc/1/maps
Zn哥 2017-5-22 16:53
14
0




netsniffer

把这个命令的输出贴一下
adb shell /proc/1/maps

非常感谢楼主的方法

直接用楼主的命令也遇到out  of  memory的问题 改成以下以下 没有问题

adb shell su
chmod 755 /data/local/tmp/mprop
data/local/tmp/mprop
setprop ro.debuggable 1
/data/local/tmp/mprop -r
运行效果如下:

上传的附件:
暴强 2017-6-26 07:42
15
0
源码能发出来么?
testvul 2017-9-29 17:42
16
0
为什么运行报错?
shell@android:/data  #  ./mprop
[1]  +  Stopped  (signal)          ./mprop
聖blue 2017-9-29 19:49
17
0
支持下
wx_Winter 2017-11-3 11:16
18
0
我感觉没改成功,是我操作有问题么
无名侠 10 2017-11-8 21:51
19
1
支持一下!
小熊ppt 2017-11-10 16:44
20
0
wx_Winter 我感觉没改成功,是我操作有问题么
改完之后,用getprop  ro.debuggable命令可以查看debuggable的状态,显示为1,表示更改成功,不是在default.prop文件中看到的。另,发现重新开机后debuggable会失效,还要重新运行一下这个小工具。
邪梦 2017-11-17 17:34
21
0
支持一下,
iweizime 7 2017-11-24 20:24
22
0
支持,方便开源一下代码吗
李治彬 2018-1-23 16:37
23
0
有没有办法不重启就生效呢?
dryzh 2018-3-5 10:14
24
0
楼主,我想学习怎么ptrace  init进程的patch技术,能讲讲么?
roysue 3 2018-4-12 18:40
25
0
最好用的难道不是XDebuggable么?
heartbeast 2018-4-13 10:45
26
0
支持,方便开源一下代码吗,或者透露下“ptrace    init进程的patch技术”
lcweik 1 2018-4-13 16:53
27
0
heartbeast 支持,方便开源一下代码吗,或者透露下“ptrace init进程的patch技术”
我有一个不需要写代码的方法,直接  把init  pull出来,用16进制编译器,或者ida找到ro.\0的位置,再通过dd  命令去写/proc/1/mem,把内存里的ro.\0改成xx.\0,就成了。
zhangdesheng 2018-4-30 09:59
28
0
不错,支持一下
smartdon 1 2018-6-1 22:06
29
0
神器,支持
Jack飞 2018-6-7 17:41
30
0
为啥我的修改不了ro.product.model  呢?

------------------------
可以修改成功了,因为之前SELinux没有设置为Permissive权限所以没有注入成功
再次感谢楼主!
最后于 2018-6-7 17:53 被Jack飞编辑 ,原因:
netsniffer 2018-8-7 15:08
31
0
看到有兄台贴了mprop的逆向分析,好吧,其实没必要判断prop_info这个结构,楼上也有人写出了原理,其实就是改个字符串绕过验证流程,贴出源码以飨读者:
BTW:无论引用代码还是自己修改,请务必注明出处。

/**
 * Copyright (C) 2018 netsniffer
 * mprop v1.0, 2017/01/19
 * https://bbs.pediy.com/thread-215311.htm
 */

#include <unistd.h>
#include <ctype.h>
#include <stdio.h>
#include <errno.h>
#include <memory.h>
#include <string.h>
#include <sys/ptrace.h>
#include <sys/system_properties.h>

#define PROP_NAME_MAX   32
#define PROP_VALUE_MAX  92

static void dump_hex(const char* buf, int len)
{
    const uint8_t *data = (const uint8_t*)buf;
    int i;
    char ascii_buf[17];

    ascii_buf[16] = '\0';

    for (i = 0; i < len; i++) {
        int val = data[i];
        int off = i % 16;

        if (off == 0)
            printf("%08x  ", i);
        printf("%02x ", val);
        ascii_buf[off] = isprint(val) ? val : '.';
        if (off == 15)
            printf(" %-16s\n", ascii_buf);
    }

    i %= 16;
    if (i) {
        ascii_buf[i] = '\0';
        while (i++ < 16)
            printf("   ");
        printf(" %-16s\n", ascii_buf);
    }
}

#define ORI_INST  0x2e6f72
#define HACK_INST 0x2e6f73

int main(int argc, char **argv) 
{
    FILE *fp;
    int  m, rc;
    int  patch_count;
    unsigned long maps, mape, addr, mlen;
    unsigned long real_val, real_vaddr;

    char perms[5];
    char line[512];
    char *buffer, *ro;
    char* name = NULL, *value = NULL;

    uint32_t tmp;
    uint32_t dest_inst = ORI_INST;
    uint32_t mod_inst = HACK_INST;

    int restore = 0, verbose = 0;

    for (m = 1; m < argc; m++) {
        if (argv[m] == NULL)
            continue;

        if (argv[m][0] != '-') {
            break;
        } 

        if (argv[m][1] == 'r') {
            restore = 1;
            dest_inst = HACK_INST;
            mod_inst = ORI_INST;
        } else if (argv[m][1] == 'v') {
            verbose = 1;
        }
    }

    if (restore) {
        fprintf(stderr, "restore ...\n"); 
    }
    else {
        if (argc - m >= 2) {
            // fprintf(stderr, "Usage: %s [-r] [-v] [prop_name] [prop_value]\n"
            //                 "e.g.:  %s ro.debuggable 1\n", argv[0], argv[0]);
            name = argv[m];
            value = argv[m+1];
        } 
       
        fprintf(stderr, "start hacking ...\n"); 
    }
    
    fp = fopen("/proc/1/maps", "r");
    if (!fp) {
        perror("!! fopen ");
        return 1;
    }

    // 00008000-000cb000 r-xp 00000000 00:01 6999       /init
    memset(line, 0, sizeof(line));
    while (fgets(line, sizeof(line), fp)) {
        int main_exe = (strstr(line, "/init") != NULL) ? 1 : 0;
        if (main_exe) {
            rc = sscanf(line, "%lx-%lx %4s ", &maps, &mape, perms);
            if (rc < 3) {
                perror("!! sscanf ");
                return 1;
            }
            if (perms[0] == 'r' && perms[1] == '-' && perms[2] == 'x' && perms[3] == 'p') {
                break;    
            }
        }
    }
    fclose(fp);

    fprintf(stderr, "target mapped area: 0x%lx-0x%lx\n", maps, mape); 

    mlen = mape - maps;
    buffer = (char *) calloc(1, mlen + 16);
    if (!buffer) {
        perror("!! malloc ");
        return 1;
    }
    rc = ptrace(PTRACE_ATTACH, 1, 0, 0);
    if (rc < 0) {
        perror("!! ptrace ");
        return rc;
    }
    for (addr = maps; addr < mape; addr += 4) {
        tmp = ptrace(PTRACE_PEEKTEXT, 1, (void *) addr, 0);
        *((uint32_t*)(buffer + addr - maps)) = tmp;
    }
    
    if (verbose) {
        dump_hex(buffer, mlen);
    }
  
    for (m = 0; m < mlen; ++m) {
        if (dest_inst == *(uint32_t*)(buffer+m)) { // 72 6F 2E 00  == ro.\0
            break;
        }
    }

    if (m >= mlen) {
        fprintf(stderr, ">> inject position not found, may be already patched!\n");
    } 
    else {
        real_vaddr = maps + m;
        real_val = *(uint32_t*)(buffer+m);
        fprintf(stderr, ">> patching at: 0x%lx [0x%lx -> 0x%08x]\n", real_vaddr, real_val, mod_inst);
        
        tmp = mod_inst;
        rc = ptrace(PTRACE_POKETEXT, 1, (void *)real_vaddr, (void*)tmp);
        if (rc < 0) {
            perror("!! patching failed ");
        }

        tmp = ptrace(PTRACE_PEEKTEXT, 1, (void *)real_vaddr, 0);
        fprintf(stderr, ">> %s reread: [0x%lx] => 0x%08x\n", restore ? "restored!" : "patched!", real_vaddr, tmp);       
    }

    free(buffer);
    rc = ptrace(PTRACE_DETACH, 1, 0, 0);

    if (!restore && (name && value && name[0] != 0)) {
        char propbuf[PROP_VALUE_MAX];
        fprintf(stderr, "-- setprop: [%s] = [%s]\n", name, value);
        __system_property_set(name, value);
        usleep(400000);
        __system_property_get(name, propbuf);
        fprintf(stderr, "++ getprop: [%s] = [%s]\n", name, propbuf);
        
    }
    return rc;
}


ckczck 2018-9-21 11:32
32
0
神器,支持
柳梦没 2019-5-17 02:58
33
0
netsniffer 全局生效
感谢楼主的神器!这个只在native层的system_property_get函数里生效了,如何在java层生效,尤其是os.Build里,除了xposed还有什么方案么?
hailista 2019-5-23 18:50
34
0
试了几个不行 看看这个怎样
一只小猫猫 2019-7-24 19:11
35
0
支持下
熊猫吃鱼 2019-7-28 16:18
36
0
大神6666666666666666666666666 感谢您这个方案!!
HELVLIANG 2019-12-17 22:39
37
0
真是个好用的小工具,模拟器调试省了不少事~谢谢楼主分享。
wx_,_311 2020-2-7 12:07
38
0
真手机安卓9版本可以开启debug吗?
游客
登录 | 注册 方可回帖
返回