ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android netlink&svc 获取 Mac方法深入分析

2022-03-18 18:33:04  阅读:186  来源: 互联网

标签:Netlink syscall netlink svc 网卡 Mac 内核 recv


前言

今天主要介绍的是通过内核通讯的方式获取设备网卡mac指纹,主要通过netlink的方式和内核通讯去获取mac网卡地址 。

这种方式可以直接绕过android的权限。

在不给app授权的时候也可以直接获取到网卡信息。因为很难进行mock,所以很多大厂app也都是采用这种办法去获取。

netlink简介:

Netlink是linux提供的用于内核和用户态进程之间的通信方式。

  • 但是注意虽然Netlink主要用于用户空间内核空间的通信,但是也能用于用户空间的两个进程通信
  • 只是进程间通信有其他很多方式,一般不用Netlink。除非需要用到Netlink的广播特性时。
  • NetLink机制是一种特殊的socket,它是Linux特有的,由于传送的消息是暂存在socket接收缓存中,并不为接受者立即处理,所以netlink是一种异步通信机制。系统调用和ioctl是同步通信机制。

一般来说用户空间和内核空间的通信方式有三种:

proc

ioctl

Netlink

而前两种都是单向的,但是Netlink可以实现双工通信

Netlink协议基于BSD socket和AF_NETLINK地址簇(address family)。

使用32位的端口号寻址(以前称为PID),每个Netlink协议(或称作总线,man手册中则称之为netlink family),通常与一个或者一组内核服务/组件相关联,如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等。

netlink特点:

1,支持全双工、异步通信

2,用户空间可以使用标准的BSD socket接口(但netlink并没有屏蔽掉协议包的构造与解析过程,推荐使用libnl等第三方库)

3,在内核空间使用专用的内核API接口

4,支持多播(因此支持“总线”式通信,可实现消息订阅)

5,在内核端可用于进程上下文与中断上下文

netlink特点:

1,支持全双工、异步通信

2,用户空间可以使用标准的BSD socket接口(但netlink并没有屏蔽掉协议包的构造与解析过程,推荐使用libnl等第三方库)

3,在内核空间使用专用的内核API接口

4,支持多播(因此支持“总线”式通信,可实现消息订阅)

5,在内核端可用于进程上下文与中断上下文

如何通过netlink获取网卡信息?

android 是如何通过netlink获取网卡地址的?

不管是ip命令行还是Java的network接口,最终都是调用到ifaddrs.cpp -> getifaddrs

getifaddrs方法介绍

NetlinkConnection这个结构体是一个netlink的封装类

重点看一下ReadResponses的实现过程

使用流程:

通过遍历拿到我们需要的内容,输出即可。

SVC内联安全封装:

在接受消息的时候android源码是采用recv去接受的消息

通过循环的方式去判断结束位置。

但是recv这种函数很容易被hook,inlinehook recv ,recvfrom ,recvmsg

在方法执行完毕以后直接就可以处理参数二的返回值。

在不直接使用系统提供的recv 以后,有两种方式可以选择。

  • 方法1:

直接调用syscall函数,通过syscall函数进行切入到recv 。

这种方式可以更好的兼容32和64位,但是可能被直接hook syscall这个函数入口 。

因为和设备指纹相关的函数,是重点函数,侧重安全。所以重点采用方法2

将syscall 汇编代码嵌入到指定方法内部。

  • 方法2:我们直接把recv换成svc内联汇编代码如下

相当于自己实现syscall (代码摘抄自libc syscall)

使用的话也很简单,导入函数头就好。

32位:

64位:

将代码替换成如下:

很不幸,报错了,安卓8内核上使用了seccomop 过滤掉了svc 直接调用 recv

报错的原因一句话

seccomp prevented call to disallowed arm system call 291

secomp简介:

seccomp是Linux的一种安全机制,android 8.1以上使用了seccomp

主要功能是限制直接通过syscall去调用某些系统函数

seccomp的过滤模式有两种(strict&filter)

第一种strict只支持如下四种,如果一旦使用了其他的syscall 则会收到SIGKILL信号

read()

write()

exit()

rt_sigreturn

通过下面方式进行设置。

strict

filter(BPF)

Seccomp-bpf

bpf是一种过滤模式,只有在linux高版本会存在该功能

当某进程调用了svc 首先会进入我们自己写的bpf规则

通过我们自己的写的规则,进行判断该函数是否被运行调用。

常用的就是ptrace+seccomp去修改svc的参数内容&返回值结果。

回到正文,不过还好,

在android底层 recv的实现是recvfom代码如下

我们将svc调用号切换到recvform

程序完美运行起来,网卡获取成功。

标签:Netlink,syscall,netlink,svc,网卡,Mac,内核,recv
来源: https://blog.csdn.net/HBohan/article/details/123581696

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有