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

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

2020-12-25 19:05
19907

前言:

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

 

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

这时候有没有一种相对稳定的方式去获取最真实的设备信息呢?

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

方案:

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

  • 1,直接调用libc.so里面的syscall
  • 2,内联汇编,将Libc.so syscall里面的代码抠出来
    本质区别不大

实现:

  • 方式1:
    直接调用syscall

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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;
    }
  • 方式2
    通过内联汇编的方式调用Svc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
}

重点看一下raw_syscall

 

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

  • 32位实现

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

最后于 2020-12-25 23:05 被珍惜Any编辑 ,原因: 格式修改
收藏
免费 9
支持
分享
赞赏记录
参与人
雪币
留言
时间
codeoooo
为你点赞~
2023-7-25 20:43
0xEA
为你点赞~
2023-4-15 13:59
LivedForward
为你点赞~
2022-11-2 17:05
PLEBFE
为你点赞~
2022-7-30 09:27
cyxvc
为你点赞~
2021-3-29 11:40
magicxss
为你点赞~
2021-3-24 11:25
0x指纹
为你点赞~
2020-12-29 09:37
北冥鱼丶
为你点赞~
2020-12-28 10:45
珍惜Any
为你点赞~
2020-12-25 19:12
最新回复 (36)
雪    币: 256
活跃值: (44)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大佬nb
2020-12-25 19:13
1
雪    币: 5
活跃值: (121)
能力值: ( 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
雪    币: 4674
活跃值: (14523)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
6
sudami 嘿嘿
2020-12-25 21:24
0
雪    币: 4674
活跃值: (14523)
能力值: ( 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
活跃值: (1106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
标题起的太奇怪了,什么穿透,我以为是虚拟机穿透,就是调用个syscall。。。
2020-12-25 22:43
0
雪    币: 4674
活跃值: (14523)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
11
iceway 标题起的太奇怪了,什么穿透,我以为是虚拟机穿透,就是调用个syscall。。。
2020-12-25 23:05
0
雪    币: 1144
活跃值: (1451)
能力值: ( 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
雪    币: 2419
活跃值: (2345)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
14
这招在iOS上其实挺好用的;Android上的话,有些黑产用自编译内核,在内核层进行的过滤,这招就有局限了。
2020-12-28 10:43
0
雪    币: 4674
活跃值: (14523)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
15
莫灰灰 这招在iOS上其实挺好用的;Android上的话,有些黑产用自编译内核,在内核层进行的过滤,这招就有局限了。
确实
2020-12-28 14:25
0
雪    币: 1329
活跃值: (4704)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
16
这种方式兼容性是个大问题。会有各种莫名奇妙的Crash。
2020-12-28 16:29
0
雪    币: 0
活跃值: (718)
能力值: ( 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
雪    币: 4674
活跃值: (14523)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
20
327135569 除了刷内核, 写LKM, ptrace, 另外拿ida扫一下 svc, swi 啥的通通 hook 掉也是个办法.
确实是一种办法如果可以ptrace上去,也可以进行拦截的。
2021-3-24 10:36
0
雪    币: 1109
活跃值: (3626)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
能介绍一下 GS虚拟机 是怎么拦截 syscall 的吗?gVisor 是 Ptrace 或 kvm,Android上kvm行不通,但这虚拟机的进程里也是 TracerPid:0
2021-3-25 15:41
0
雪    币: 4674
活跃值: (14523)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册