首页
社区
课程
招聘
[原创]Android svc获取设备信息
发表于: 2020-12-25 19:05 19277

[原创]Android svc获取设备信息

2020-12-25 19:05
19277

现在市面上改机的软件很多,大部分都是通过Hook的方式去修改Java层的一些参数和变量,或者直接反射的方式去set成伪造数据。
如果通过正常的获取设备信息的API去获取的时候就很容易是假的

这时候我们可以通过读取文件的方式去获取设备信息,还需要加CRC对底层函数进行判断,很是麻烦
因为底层的IO函数一旦被Hook,比如openat函数,就算读取文件的方式去可能获取的设备也可能是被mock的。

通过syscall 直接调用svc指令的方式让Linux切换到内核态,执行完毕以后去直接拿返回结果即可
(systcall是Linux内核的入口,切换到内核态以后,无法被Hook)

实现也很简单,提供两种方式:

方式1:
直接调用syscall

方式2
通过内联汇编的方式调用Svc

重点看一下raw_syscall

内联汇编代码主要分32和64

cmake里添加

编译即可

比如获取网卡设备信息

<br/>
<br/>
<br/>

答案是否定的

目前主流的两种方法

<br>
<br>
帖子根据个人经验梳理,如有不足,及时告知。

 
std::string FileUtils::getFileText(char *path,int BuffSize) {
 
  char buffer[BuffSize];
  memset(buffer, 0, BuffSize);
  std::string str;
  //int fd = open(path, O_RDONLY);
  long fd = syscall(__NR_open, path, O_RDONLY);
 
  //失败 -1;成功:>0 读出的字节数  =0文件读完了
  while (syscall(__NR_read,fd, buffer, 1) != 0) {
      //LOG(ERROR) << "读取文件内容  " <<buffer;
      str.append(buffer);
  }
  syscall(__NR_close,fd);
  return str;
}
std::string FileUtils::getFileText(char *path,int BuffSize) {
 
  char buffer[BuffSize];
  memset(buffer, 0, BuffSize);
  std::string str;
  //int fd = open(path, O_RDONLY);
  long fd = syscall(__NR_open, path, O_RDONLY);
 
  //失败 -1;成功:>0 读出的字节数  =0文件读完了
  while (syscall(__NR_read,fd, buffer, 1) != 0) {
      //LOG(ERROR) << "读取文件内容  " <<buffer;
      str.append(buffer);
  }
  syscall(__NR_close,fd);
  return str;
}
std::string FileUtils::getRawFileText(char *path,int BuffSize) {
 
    char buffer[BuffSize];
    memset(buffer, 0, BuffSize);
    std::string str;
    //int fd = open(path, O_RDONLY);
    long fd = raw_syscall(__NR_open, path, O_RDONLY);
 
    //失败 -1;成功:>0 读出的字节数  =0文件读完了
    while (read(fd, buffer, 1) != 0) {
        //LOG(ERROR) << "读取文件内容  " <<buffer;
        str.append(buffer);
    }
    syscall(__NR_close,fd);
    return str;
}
std::string FileUtils::getRawFileText(char *path,int BuffSize) {
 
    char buffer[BuffSize];
    memset(buffer, 0, BuffSize);
    std::string str;
    //int fd = open(path, O_RDONLY);
    long fd = raw_syscall(__NR_open, path, O_RDONLY);
 
    //失败 -1;成功:>0 读出的字节数  =0文件读完了
    while (read(fd, buffer, 1) != 0) {
        //LOG(ERROR) << "读取文件内容  " <<buffer;
        str.append(buffer);
    }
    syscall(__NR_close,fd);
    return str;
}
 
    .text
    .global raw_syscall
    .type raw_syscall,%function
 
raw_syscall:
        MOV             R12, SP
        STMFD           SP!, {R4-R7}
        MOV             R7, R0
        MOV             R0, R1
        MOV             R1, R2
        MOV             R2, R3
        LDMIA           R12, {R3-R6}
        SVC             0
        LDMFD           SP!, {R4-R7}
        mov             pc, lr
    .text
    .global raw_syscall

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-12-25 23:05 被珍惜Any编辑 ,原因: 格式修改
收藏
免费 9
支持
分享
最新回复 (36)
雪    币: 256
活跃值: (44)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大佬nb
2020-12-25 19:13
1
雪    币: 5
活跃值: (116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大佬nb
2020-12-25 19:16
0
雪    币: 259
活跃值: (3623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
你这个>=Android10估计也会歇菜吧
2020-12-25 20:28
1
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5

嘿嘿

2020-12-25 21:20
0
雪    币: 3368
活跃值: (14038)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
6
sudami 嘿嘿
2020-12-25 21:24
0
雪    币: 3368
活跃值: (14038)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
7
蟑螂一号 你这个>=Android10估计也会歇菜吧
不会呦
2020-12-25 21:25
0
雪    币: 477
活跃值: (1412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
虽然是老手段了,但还是支持一下
2020-12-25 21:39
0
雪    币: 477
活跃值: (1412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
穿透还以为可以越权获取呢,可以就nb了
2020-12-25 21:40
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
标题起的太奇怪了,什么穿透,我以为是虚拟机穿透,就是调用个syscall。。。
2020-12-25 22:43
0
雪    币: 3368
活跃值: (14038)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
11
iceway 标题起的太奇怪了,什么穿透,我以为是虚拟机穿透,就是调用个syscall。。。
2020-12-25 23:05
0
雪    币: 1144
活跃值: (1274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这不是很常规的做法吗
2020-12-26 01:41
0
雪    币: 57
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
https://bbs.pediy.com/thread-264142.htm 大佬 这个可以搞吗
2020-12-26 23:09
0
雪    币: 2314
活跃值: (2205)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
14
这招在iOS上其实挺好用的;Android上的话,有些黑产用自编译内核,在内核层进行的过滤,这招就有局限了。
2020-12-28 10:43
0
雪    币: 3368
活跃值: (14038)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
15
莫灰灰 这招在iOS上其实挺好用的;Android上的话,有些黑产用自编译内核,在内核层进行的过滤,这招就有局限了。
确实
2020-12-28 14:25
0
雪    币: 1307
活跃值: (4146)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
16
这种方式兼容性是个大问题。会有各种莫名奇妙的Crash。
2020-12-28 16:29
0
雪    币: 0
活跃值: (633)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
以前测试arm64的时候,发现华为,小米,google 的系统调用号不一样,不知道这块怎么兼容
2020-12-29 16:07
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
Qira 以前测试arm64的时候,发现华为,小米,google 的系统调用号不一样,不知道这块怎么兼容
采集全 调用号
2021-1-13 16:16
0
雪    币: 262
活跃值: (357)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
除了刷内核, 写LKM, ptrace, 另外拿ida扫一下 svc, swi 啥的通通 hook 掉也是个办法.
2021-3-23 22:43
0
雪    币: 3368
活跃值: (14038)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
20
327135569 除了刷内核, 写LKM, ptrace, 另外拿ida扫一下 svc, swi 啥的通通 hook 掉也是个办法.
确实是一种办法如果可以ptrace上去,也可以进行拦截的。
2021-3-24 10:36
0
雪    币: 1110
活跃值: (3274)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
能介绍一下 GS虚拟机 是怎么拦截 syscall 的吗?gVisor 是 Ptrace 或 kvm,Android上kvm行不通,但这虚拟机的进程里也是 TracerPid:0
2021-3-25 15:41
0
雪    币: 3368
活跃值: (14038)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
22
Amun 能介绍一下 GS虚拟机 是怎么拦截 syscall 的吗?gVisor 是 Ptrace 或 kvm,Android上kvm行不通,但这虚拟机的进程里也是 TracerPid:0
就是ptrace
2021-3-27 15:10
0
雪    币: 1892
活跃值: (1618)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23

已删除

最后于 2022-11-22 17:32 被LivedForward编辑 ,原因:
2022-11-2 16:55
0
雪    币: 1892
活跃值: (1618)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
24

已删除

最后于 2022-11-22 17:32 被LivedForward编辑 ,原因:
2022-11-2 16:55
1
雪    币: 1892
活跃值: (1618)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25

已删除

最后于 2022-11-22 17:33 被LivedForward编辑 ,原因:
2022-11-2 16:59
1
游客
登录 | 注册 方可回帖
返回
//