mac地址 订阅
MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址 [1]  。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址 [2]  。 展开全文
MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址 [1]  。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址 [2]  。
信息
别    称
MAC位址、硬件地址
特    点
唯一性
作    用
用来定义网络设备的位置
所属领域
计算机技术
中文名
MAC地址
外文名
Media Access Control Address
MAC地址简介
MAC地址也叫物理地址、硬件地址,由网络设备制造商生产时烧录在网卡(Network lnterface Card)的EPROM(一种闪存芯片,通常可以通过程序擦写)。IP地址与MAC地址在计算机里都是以二进制表示的,IP地址是32位的,而MAC地址则是48位的 [3]  。MAC地址的长度为48位(6个字节),通常表示为12个16进制数,如:00-16-EA-AE-3C-40就是一个MAC地址,其中前6位16进制数00-16-EA代表网络硬件制造商的编号,它由IEEE(电气与电子工程师协会)分配,而后6位16进制数AE-3C-40代表该制造商所制造的某个网络产品(如网卡)的系列号。只要不更改自己的MAC地址,MAC地址在世界是惟一的。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性 [3]  。
收起全文
精华内容
下载资源
问答
  • MAC地址

    千次阅读 多人点赞 2021-01-17 10:12:41
    一、什么是MAC地址 1、 MAC地址就是在媒体接入层上使用的地址,也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。MAC地址与网络无关,即无论将带有这个地址的硬件(如网卡、集线器、路由器等...

    一、什么是MAC地址
    1、 MAC地址就是在媒体接入层上使用的地址,也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。MAC地址与网络无关,即无论将带有这个地址的硬件(如网卡、集线器、路由器等))接入到网络的何处,都是相同的MAC地址

    2、MAC地址通常表示为12个16进制数,每2个16进制数之间用冒号隔开,如08:00:20:0A:8C:6D就是一个MAC地址,其中的前16位16进制数08:00:20代表网络硬件制造商的编号,由IEEE分配,后6位16进制数0A:8C:6D代表该制造商的某个网络产品(如网卡)的系列号

    3、每个网络制造商必须确保它制造的每个以太网设备都具有相同的前3三个字节以及不同的后3个字节。这样,就可以保证世界上每个以太网设备都具有唯一的MAC地址。

    二、如何查看MAC地址
    按系统键+R,输入CMD打开命令提示符窗口,输入ipconfig /all指令,其中的物理地址即是MAC地址

    展开全文
  • MAC地址硬改 刷新工具全集

    热门讨论 2015-04-29 20:01:13
    MAC地址硬改 刷新工具全集,共14个工具,适应不同网卡
  • 动态MAC地址和静态MAC地址

    千次阅读 2020-06-02 22:09:14
    MAC地址表是交换机进行数据帧转发时所使用的一个非常关键的数据表。每一台 交换机都会维护自己的MAC地址表,掌握MAC地址表的相关配置及管理是非常有必 要的。 1.查看MAC地址表 在华为交换机上,使用display mac-...

    MAC地址表项

    MAC地址表是交换机进行数据帧转发时所使用的一个非常关键的数据表。

    查看MAC地址表

    如下图所示的网络拓扑中:

    在这里插入图片描述
    通过命令查看SW1的MAC地址表项信息:
    在这里插入图片描述

    • 从SW1的MAC地址表可以看出,其GE0/0/1接口连接着一台加入VLAN10的设备,该设备的MAC地址为5489-985b-17af(上图中的PC),
    • SW1的GE0/0/2接口连接着一台加入VLAN20的设备(上图中的Server),该设备MAC地址为5489-987e-10d0。
    • 从上图所示的网络拓扑中,SW1与SW2之间还部署了链路聚合技术(Link Aggregation ),即SW1与SW2之间存在多个互联接口被聚合成一个逻辑接口(Eth-trunk 1)。
    • SW1的Eth-trunkl接口连接着一台加入VLAN200的设备,且该设备的MAC地址为4clf-ccab-ea87,这是SW2的MAC地址。
    • 当这些设备之间需要相互通信时,数据帧在到达SW1后,SW1便可通过查询MAC地址表进行数据帧转发。

    动态MAC表项

    • 如上图所示的网络拓扑中,初始时,交换机的MAC地址表是空的(比如SW1),随着网络中的各台设备陆续开始发送数据(一般通过泛洪实现),交换机也在各个接口上学习MAC地址,并持续维护自己的MAC地址表。
    • 当网络稳定后(数据转发不再依靠泛洪,而是通过Mac地址表寻址实现),SW1的MAC地址表中看到PC、Server和SW2的MAC地址,并且这些MAC地址表项都是动态的(类型为dynamic )。

    动态MAC表项的老化机制

    • 一个动态的MAC地址表项被加载到交换机的MAC地址表后,其老化计时器也就随即启动,并开始倒计时,当该计时器计数到0时,这个MAC表项将被删除。
    • 在交换机每收到一个数据帧时,MAC地址表中与该数据帧的源MAC地址对应的表项也会被刷新,该表项的老化计时器将被复位并重新开始倒计时。
    • 交换机缺省的动态MAC地址表项老化时间为300s(HW),在系统视图下执行mac-address aging-time命令(HW)可修改动态MAC表项的老化时间。但是在实际的网络中不建议随意修改该老化时间。

    动态MAC地址学习数量

    问题背景

    • 交换机MAC地址表的容量是有限的,
    • 如果网络中存在MAC地址泛洪攻击时,交换机的MAC地址表可能会瞬间被大量垃圾MAC地址表项填满,在很短的时间内,MAC
      地址表项资源可能就会被耗尽,因此当交换机收到合法的数据帧时,就无法再进行MAC地址学习了,数据帧的转发必将产生问题。

    解决方法

    • 可以在交换机特定端口上限制MAC地址学习数量,解决上述问题。
    • 当交换机某个端口MAC地址数量达到所设的上限时,该端口将不再学习MAC地址。(网络发生Mac地址泛洪时,一般指的的某个端口或许某些端口收到大量未知单播、组播或者广播报文,如果在受到Mac地址攻击的端口上配置限制MAC地址学习数量,可以避免该端口无限制的学习Mac地址,减少Mac地址表项资源的浪费,为交换机的其他端口学习合法数据帧的Mac地址表项预留了资源)
    • 在特定接口的配置视图下,执行mac-limit maximum max-num命令(HW),可限制该接口的MAC地址学习数量。
    • 在特定接口的配置视图下,执行mac-limit action { discard | forward}命令(HW),可配置当MAC地址数量达到限制后,交换机对数据帧执行的操作:
      (1)当指定的action为discard时,在MAC地址表项数量达到限制后,若该接口收到的数据帧的源MAC地址为新的MAC地址时,丢弃这些帧。此行为是缺省动作。
      (2)当指定的action为forward时,在MAC地址表项数量达到限制后,若该接口收到的数据帧的源MAC地址为新的MAC地址时,转发这些帧,但是不记录MAC地址表项。
    • 在特定接口的配置视图下,执行mac-limit alarm { disable | enable}命令(HW),可配置当MAC地址数量达到限制后是否进行告警:
      (1)如果指定关键字是enable,则当MAC地址数量达到限制后进行告警,该行为是缺省动作。
      (2)如果指定关键字是disable,则不告警。

    静态MAC表项

    问题背景——MAC地址漂移

    • 交换机可以动态的学习MAC地址,但是在某种场景下是不可靠的。
    • 在上图所示的网络拓扑中:
      (1)若SW1的GE0/0/3接口连接一台PC,该PC以Server的MAC地址为源进行数据帧伪造,然后持续不断地向交换机发送这些非法的数据帧,
      (2)那么在SW1的MAC地址表中,关于该MAC地址的表项将会不断地在GEO/0/3及GEO/0/2之间来回出现,这种现象被称为“MAC地址漂移”。
      (3)当交换机将这个MAC地址关联到GE0/0/3接口时,所有发往Server的数据帧将无法准确地到达目的地,与Server相关的业务势必会受到影响。

    解决方法

    • 通过为SW1配置静态MAC表项可以规避上述问题。

    • SW1的配置如下:[SWl]mac-address staric 5489-987e-10d0 Gigabiet 0/0/2 vlan 20,通过该命令可以配置一条静态Mac地址表项。

    • 配置成功之后,可以通过命令查看Mac地址表项信息:
      在这里插入图片描述

    • 静态的Mac表项是永远不会被老化的,

    • 并且其优先级比动态表项更高,这意味着当SW1再从GE0/0/3接口收到以Server的MAC地址为源的数据帧时,SW1会将这些数据帧丢弃。因此,通过设置静态MAC表项,可以确保与交换机固定连接的可信任节点的安全通信

    展开全文
  • MAC地址,也就是网卡,对于单网卡来说是唯一的(64位)十六进值的物理地址,它是在出前厂就已经分配好了的。 每一个物理设备都有一个唯一对应的MAC地址MAC地址绑定IP地址,是网络管理常用的一种方式。 一、查看mac ...

    MAC地址,也就是网卡,对于单网卡来说是唯一的(64位)十六进值的物理地址,它是在出前厂就已经分配好了的。 每一个物理设备都有一个唯一对应的MAC地址,MAC地址绑定IP地址,是网络管理常用的一种方式。

    一、查看mac

    点击开始——运行——输入CMD确定——出现DOS窗口输入 ipconfig -all 就可以看到你电脑上所有的网卡信息,包括MAC地址。

    二、MAC地址用处

    一、MAC地址的用途 MAC地址在网卡中是固定的,每张网卡的MAC地址都不一样。网卡在制作过程中,厂家会在它的EPROM里面烧录上一组数字,这组数字,每张网卡都各不相同,这就是网卡的MAC(物理)地址。 由于MAC地址的唯一性,因此它主要用来识别网络中用户的身份。例如ADSL上网时,电信用它来记费,确认是你上的网;在校园网中,MAC地址也可以用来识别用户。对于校园网的正式用户,其MAC地址会登记在服务器端,假如你是非法用户,服务器中就没有你的网卡MAC地址,这样当你试图连上网时,服务器就会立刻认出你、阻止你连上网络。
    二、MAC地址是可以修改的 有些场合,例如冒充网络中的正式用户,就需要修改你的网卡MAC.要修改MAC地址,你可以通过硬件的方法实现,即利用网卡厂家提供的修改程序来烧录网卡的EEPROM,这样做虽然可行,但是风险很大、操作也复杂,即使你很有经验,也难免在操作中出现错误。 其实你完全没必要用烧录方法、修改网卡中的MAC地址。要知道Windows安装的时候,会自动从网卡中读入MAC地址,把它存放在注册表中以备后用。当数据在网络中传输时,从网卡发出的数据包中要求有一个源MAC地址,这个MAC地址就是从注册表中读取的(并非从网卡中读取的),因此只要你修改了注册表中的MAC地址,就相当于改了网卡EEPROM中的MAC地址,两者实际效果是完全相同的!

    三、修改

    1、使用软件修改 本方法适用于所有类型的网卡。在不同的Windows下,要用不同的软件修改MAC.
    2、在网卡属性中修改 如果你的网卡采用了RealTek公司的RTL8139芯片,就可以在网卡属性中修改MAC,这样注册表中的MAC地址也会一同改变,方法如下:在Win2003/XP/2000中,点击菜单“开始”/设置/控制面板,双击“系统”,点击“硬件”/设备管理器,在设备管理器中展开“网络适配器”,右击要修改MAC地址的网卡,选择“属性”;点击“高级”选项卡,在“属性”下,选择点击Network Address项目,在右侧“值”的下方,输入你要指定的MAC地址值(例如020202020202),注意要连续输入12个数字或字母(中间不要输入-);重新启动电脑后,修改即可生效。至于Win98下的MAC修改方法,与以上方法类似。 如果修改之后,在Win2003/XP/2000 下,你又想把注册表中的MAC地址恢复成原样,可以选择“Network Address”项,将右边的值选择为“不存在”,再重新启动即可;在Win98下是选择“没有显示”。
    3、在注册表中修改 对于非RTL8139芯片的网卡,你可以直接修改注册表中的MAC,注意:修改注册表前,要先备份注册表。 (1)Win2003/XP/2000 点击“开始”/运行,输入regedit打开注册表,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000、0001、0002等主键下,查找DriverDesc的内容,了解网卡使用了哪个主键(例如0001),如果主键下有params项,则该主键也是网卡所使用的; 例如网卡使用了0001主键,因此我们就选中它,在其右边建一个字符串项(名为NetworkAddress),双击该串,输入你指定的MAC地址值(注意应该是12位的连续数字或字母,其间没有-号);在0001下的NDI\params中添加一项子键(名为NetworkAddress),选择该子键,在其右边添加名为default的字符串,键值为修改后的MAC地址,与上面的数值相同;修改后重启生效。 (2)Win98 点击“开始”/运行,键入winipcfg选择你要修改的网卡,并记录下MAC地址值;然后点击“开始”/运行,输入regedit打开注册表,定位到HKEY_LOCAL_MACHINE\System\Current ControlSet\Services\Class\Net,下面有“0000”、“0001”、“0002”等子键;从“0000”子键开始点击,依次查找子键下的“DriverDesc”键内容,直到找到刚才记录的MAC地址为止; 例如网卡使用了0001主键,因此我们就选中它,在其右边新建一个串,名称为networkaddress,再双击该串,输入新的MAC地址值(注意应该是12位的连续数字或字母,其间没有-号);最后重启电脑使修改生效。

    一、直接修改

    打开网络连接,在“本地连接”的小电脑图标,右键打开“属性”。

    点击上图的配置,在下图选择“Network Address”,然后在右侧的“值”中输入12个十六进制的数字(注意,mac地址每一位从0-F都是合法的,如00-50-8D-11-2F-9B,前3个字节表示制造商,后三个字节表示编号),单击“确定”保存设置,之后停用网络,在启用网络便可(或者重启电脑)。

    二、修改注册表

    如果网卡不支持直接修改,就可以通过注册表来完成。

    1 、在 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass{4D36E972-E325-11CE-BFC1-08002BE10318},之后就会看到0000 、 0001 、 0002 等主键下,查找 DriverDesc ,内容为你要修改的网卡的描述,如“ NVIDIA nforce Networking Controller”。

    2 、在其下,添加一个字符串,命名为 NetworkAddress ,其值设为你要的 MAC 地址(注意地址还是连续写)。如: 00E0DDE0E0E0 。

    3 、然后到其下 Ndiparams 中添加一项名为 NetworkAddress 的主键,在该主键下添加名为 default 的字符串,其值是你要设的 MAC 地址,要连续写,如: 000000000000 。(实际上这只是设置在后面提到的高级属性中的“初始值”,实际使用的 MAC 地址还是取决于在第 2 点中提到的 NetworkAddress 参数,这个参数一旦设置后,以后高级属性中的值就是 NetworkAddress 给出的值而非 default 给出的了。)

    4 、在 NetworkAddress 的主键下继续添加名为 ParamDesc 的字符串,其作用为指定 NetworkAddress 主键的描述,其值可自己命名,如“ Network Address ”,这样在网卡的高级属性中就会出现 Network Address 选项,就是你刚在注册表中加的新项 NetworkAddress ,以后只要在此修改 MAC 地址就可以了。继续添加名为 Optional 的字符串,其值设为“ 1 ”,则以后当你在网卡的高级属性中选择 Network Address 项时,右边会出现“不存在”选项。

    5 、重新启动你的计算机,打开网络邻居的属性,双击相应网卡项会发现有一个 Network Address 的高级设置项,可以用来直接修改 MAC 地址或恢复原来的地址。

    四、注意事项

    1 可以修改 利用MAC地址修改器
    2 MAC 地址是全球唯一的没错 这是指在出厂的时候唯一 经过认为修改 可能会造成MAC 地址相同
    3 如果说到冲突 在同一个局域网内 有两块MAC 相同的地址 会造成通信问题,流量会分不清到底需要和哪块网卡会话.
    4在公网上 如果有两块相同地址的网卡,如果都是被绑定同一个软件上, 那么也会造成 3 中的现象.不过这个可能性很小.
    5 修改过的网卡 除非你记下原先的MAC 地址 否则不能恢复

    原文:游戏封网卡mac地址后修改

              易语言api hook GetAdaptersAddresses 劫持网卡物理地址

    展开全文
  • 蓝牙地址,Wifi mac地址 生成器

    热门讨论 2013-05-14 16:22:41
    蓝牙地址,WIFI mac地址 生成器 可以生成所需要的蓝牙地址和wifi 地址
  • Android 违规获取用户隐私(获取MAC地址)整改

    千次阅读 热门讨论 2020-12-31 10:13:23
    前几天,收到公司App违规收取用户隐私的邮件,说是存在收集设备MAC地址的行为。 这就让我很方了,上次已经整改过一次违规获取用户隐私的问题了,这次又来。。 因为上次整改的时候,已将所有的第三方库移到用户同意了...

    前几天,收到公司App违规收取用户隐私的邮件,说是存在收集设备MAC地址的行为。
    这就让我很方了,上次已经整改过一次违规获取用户隐私的问题了,这次又来。。
    因为上次整改的时候,已将所有的第三方库移到用户同意了隐私协议后,才去初始化的,自己的代码又不会去获取这些数据,理应不会再出现获取,所以就很奇怪,不知道哪里出了问题。

    后来想到,既然是去获取了MAC地址,必定要调用系统的API,那么我只要去HOOK系统的方法,就可以知道在什么时候,去获取了MAC地址了。

    由于各个系统版本获取MAC地址的方式不同,所以特意拿了个Android5.1的手机进行测试。

    	/**
         * Android 6.0 之前(不包括6.0)获取mac地址
         * 必须的权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
         *
         * @param context * @return
         */
        private String getMacDefault(Context context) {
            String mac = "0";
            if (context == null) {
                return mac;
            }
            WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            WifiInfo info = null;
            try {
                info = wifi.getConnectionInfo();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            if (info == null) {
                return null;
            }
            mac = info.getMacAddress();
    
            return mac;
        }
    

    可以看到,我们在Android6.0以前是通过WifiManager.getConnectionInfo()的方式来获取相关数据的。
    我们来看下这个方法。

    	IWifiManager mService;
    	public WifiInfo getConnectionInfo() {
    	       try {
    	           return mService.getConnectionInfo(mContext.getOpPackageName());
    	       } catch (RemoteException e) {
    	           throw e.rethrowFromSystemServer();
    	       }
    	   }
    

    可以看到,这里调用的是IWifiManager.getConnectionInfo(),IWifiManager是一个接口

    	interface IWifiManager{
    		WifiInfo getConnectionInfo(String callingPackage);
    		...
    	}
    

    那么这个IWifiManager是什么时候被赋值的呢?我们回到context.getSystemService(Context.WIFI_SERVICE);
    我们知道,context的实现类其实是ContextImpl.java,我们直接来看ContextImpl.getSystemService()

    	@Override
        public Object getSystemService(String name) {
            return SystemServiceRegistry.getSystemService(this, name);
        }
    

    我们可以看到,这里调用了SystemServiceRegistry.getSystemService(this, name);
    我们再来看这个类

    	public static Object getSystemService(ContextImpl ctx, String name) {
            ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
            return fetcher != null ? fetcher.getService(ctx) : null;
        }
    

    这里的SYSTEM_SERVICE_FETCHERS是一个Map<String, ServiceFetcher<?>>,从这我们可以知道,通过SYSTEM_SERVICE_FETCHERS获取到一个ServiceFetcher,然后再调用ServiceFetcher.getSErvice(ctx),从而得到Service。
    那么SYSTEM_SERVICE_FETCHERS是从哪里开始赋值的呢?
    我们可以在SystemServiceRegistry找到一端静态代码块

    	static{
    		...
    		registerService(Context.WIFI_SERVICE, WifiManager.class,
                    new CachedServiceFetcher<WifiManager>() {
                @Override
                public WifiManager createService(ContextImpl ctx) throws ServiceNotFoundException {
                    IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_SERVICE);
                    IWifiManager service = IWifiManager.Stub.asInterface(b);
                    return new WifiManager(ctx.getOuterContext(), service,
                            ConnectivityThread.getInstanceLooper());
                }});
            ...
    	}
    

    其中,就有注册我们需要的WIFI_SERVICE,并实现了createService方法,方法内使用了AIDL,进行了跨进程的访问。
    我们来看下CachedServiceFetcher,这是个抽象类

    	static abstract class CachedServiceFetcher<T> implements ServiceFetcher<T> {
            private final int mCacheIndex;
    
            CachedServiceFetcher() {
                // Note this class must be instantiated only by the static initializer of the
                // outer class (SystemServiceRegistry), which already does the synchronization,
                // so bare access to sServiceCacheSize is okay here.
                mCacheIndex = sServiceCacheSize++;
            }
    
            @Override
            @SuppressWarnings("unchecked")
            public final T getService(ContextImpl ctx) {
                final Object[] cache = ctx.mServiceCache;
                final int[] gates = ctx.mServiceInitializationStateArray;
    
                for (;;) {
                    boolean doInitialize = false;
                    synchronized (cache) {
                        // Return it if we already have a cached instance.
                        T service = (T) cache[mCacheIndex];
                        if (service != null || gates[mCacheIndex] == ContextImpl.STATE_NOT_FOUND) {
                        	//如果缓存不为null,直接返回service
                            return service;
                        }
    
                        // If we get here, there's no cached instance.
    
                        // Grr... if gate is STATE_READY, then this means we initialized the service
                        // once but someone cleared it.
                        // We start over from STATE_UNINITIALIZED.
                        if (gates[mCacheIndex] == ContextImpl.STATE_READY) {
                            gates[mCacheIndex] = ContextImpl.STATE_UNINITIALIZED;
                        }
    
                        // It's possible for multiple threads to get here at the same time, so
                        // use the "gate" to make sure only the first thread will call createService().
    
                        // At this point, the gate must be either UNINITIALIZED or INITIALIZING.
                        if (gates[mCacheIndex] == ContextImpl.STATE_UNINITIALIZED) {
                            doInitialize = true;
                            gates[mCacheIndex] = ContextImpl.STATE_INITIALIZING;
                        }
                    }
    
                    if (doInitialize) {
                        // Only the first thread gets here.
    
                        T service = null;
                        @ServiceInitializationState int newState = ContextImpl.STATE_NOT_FOUND;
                        try {
                            // This thread is the first one to get here. Instantiate the service
                            // *without* the cache lock held.
                            //第一次调用,回去调用createService,也就是registerService时候去实现的那个方法
                            service = createService(ctx);
                            newState = ContextImpl.STATE_READY;
    
                        } catch (ServiceNotFoundException e) {
                            onServiceNotFound(e);
    
                        } finally {
                            synchronized (cache) {
                                cache[mCacheIndex] = service;
                                gates[mCacheIndex] = newState;
                                cache.notifyAll();
                            }
                        }
                        return service;
                    }
                    // The other threads will wait for the first thread to call notifyAll(),
                    // and go back to the top and retry.
                    synchronized (cache) {
                        while (gates[mCacheIndex] < ContextImpl.STATE_READY) {
                            try {
                                cache.wait();
                            } catch (InterruptedException e) {
                                Log.w(TAG, "getService() interrupted");
                                Thread.currentThread().interrupt();
                                return null;
                            }
                        }
                    }
                }
            }
    
            public abstract T createService(ContextImpl ctx) throws ServiceNotFoundException;
        }
    

    我们可以看下ContextImpl中的mServiceCache

        final Object[] mServiceCache = SystemServiceRegistry.createServiceCache();
    

    这个mServiceCache的也是从SystemServiceRegistry中获取的,而且只返回了一个简单的数组。

        public static Object[] createServiceCache() {
            return new Object[sServiceCacheSize];
        }
    

    可以看到,getService的时候,优先会去拿缓存,而缓存的规则是根据ContextImpl来的,由于ApplicationActivityServiceContextImpl不是同一个,所以获取到的WifiManager不是同一个。
    看到这里,我们就知道WifiManager的创建过程了。所以我们分别对ApplicationActivityService获取的WifiManager,分别替换其IWifiManager,就可以达到Hook的目的了。

    附上代码

    public class HookUtils {
        private static WifiInfo cacheWifiInfo = null;
    
        public static void hookMacAddress(String tag, Context context) {
            try {
                Class<?> iWifiManager = Class.forName("android.net.wifi.IWifiManager");
                Field serviceField = WifiManager.class.getDeclaredField("mService");
                serviceField.setAccessible(true);
    
                WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                // real mService
                Object realIwm = serviceField.get(wifi);
                // replace mService  with Proxy.newProxyInstance
                serviceField.set(wifi, Proxy.newProxyInstance(iWifiManager.getClassLoader(),
                        new Class[]{iWifiManager},
                        new InvocationHandler(tag, "getConnectionInfo", realIwm)));
                Log.i(tag, "wifiManager hook success");
            } catch (Exception e) {
                Log.e(tag, "printStackTrace:" + e.getMessage());
                e.printStackTrace();
            }
        }
    
        public static class InvocationHandler implements java.lang.reflect.InvocationHandler {
    
            private final String tag;
            private final String methodName;
            private Object real;
    
            public InvocationHandler(String tag, String methodName, Object real) {
                this.real = real;
                this.methodName = methodName;
                this.tag = tag;
            }
    
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Log.d(tag, "method invoke " + method.getName());
                if (methodName.equals(method.getName())) {
                    if (cacheWifiInfo != null) {
                        Log.d(tag, "cacheWifiInfo:" + cacheWifiInfo);
                        return cacheWifiInfo;
                    }
                    WifiInfo wifiInfo = null;
                    try {
                        Class cls = WifiInfo.class;
                        wifiInfo = (WifiInfo) cls.newInstance();
                        Field mMacAddressField = cls.getDeclaredField("mMacAddress");
                        mMacAddressField.setAccessible(true);
                        mMacAddressField.set(wifiInfo, "");
                        cacheWifiInfo = wifiInfo;
                        Log.d(tag, "wifiInfo:" + wifiInfo);
                    } catch (Exception e) {
                        Log.e(tag, "WifiInfo error:" + e.getMessage());
                    }
                    return wifiInfo;
                } else {
                    return method.invoke(real, args);
                }
            }
        }
    }
    

    然后进行Hook

         HookUtils.hookMacAddress("Z-Application",getApplicationContext());
         HookUtils.hookMacAddress("Z-Activity",MainActivity.this);
         HookUtils.hookMacAddress("Z-Service",MyService.this);
    

    最后,运行程序,可以看到,当获取Mac地址的时候,会打印相关日志。

    method invoke getConnectionInfo
    

    至此,我们就Hook成功了。
    然后,我们就可以在App出现这个日志的时候,定位到是哪个功能调用了Mac地址。
    我们这最终定位到是点击了隐私协议,通过腾讯X5 WebView显示H5页面的时候,调用了Mac地址。
    最终,通过Hook MAC地址方法,当获取MAC地址的时候,进行全局的拦截,返回一个空的MAC地址,使其无法获取到真正的MAC地址。

    参考 Hook之WifiManager

    展开全文
  • SW转发与MAC地址

    千次阅读 多人点赞 2020-07-16 12:18:26
    文章目录一、MAC地址表二、拓扑三、基础配置与分析四、SW的数据转发五、MAC地址表安全5.1 攻击原理5.2 防御措施 一、MAC地址表 1、作用: MAC表记录了相连设备的MAC地址、接口号以及所属的VLAN ID之间的对应关系。在...
  • 1、MAC地址表项实验配置步骤

    千次阅读 多人点赞 2021-02-11 13:26:05
    1、查看动态MAC地址表项 2、配置静态MAC地址表项 3、配置黑洞MAC地址表项 静态表项和黑洞表项都优于动态表项 静态表项和黑洞表项重启后不会消失,动态表项重启之后会消失 实验摘要重点命令: <Huawei>dis mac-...
  • MAC地址欺骗和MAC地址泛红攻击,是很古老的二层攻击手法,现在也很少用在网络攻击实战中,但对于其攻击原理却很值得学习,本文通过eNSP抓包的实践方式,充分学习了这两种攻击的手段,使我们对二层网络攻击有了更深刻...
  • android jni获取 Mac地址

    热门讨论 2012-07-04 11:51:55
    在jni中获取android 设备的mac地址
  • MAC地址详解

    千次阅读 2021-04-18 22:59:47
    1,MAC地址作用?是什么? MAC地址就像身份证一样,用来证明身份的, 长度为48bit,由12位的16进制数表示。 2,MAC地址分类 1,物理MAC地址:全球唯一的硬件地址,这种MAC地址标识了唯一的以太网的一 的一个终端。 2...
  • 配置了MAC地址防漂移的功能后,可以保证一个MAC地址的表项仅可在一个正确的接口上学习到,防止仿冒合法主机的MAC地址的入侵而改变该MAC地址原来正确的MAC地址表项。当然我们也可以通过把接口的学习功能关闭,让接口...
  • TMAC更改MAC地址v6.0.7

    热门讨论 2015-12-13 17:37:16
    你的Windows10操作系统不能更改网卡MAC地址吗?来用TMAC吧!
  • 基于MAC地址划分VLAN

    万次阅读 2020-05-08 20:25:08
    1、当MAC地址为00-00-00-00-00-01的PC接入交换机时,将其划分为VLAN 10,且可以和VLAN 10的服务器通信 2、当MAC地址为00-00-00-00-00-02的PC接入交换机时,将其划分为VLAN 20,且可以和VLAN 20的服务器通信 SW1 <...
  • MAC地址的组成 mac地址都是由IEEE的注册管理机构RA分配给厂商,分配时只分配前三个字节,后三个字节由各厂商自行分配 mac地址由IEEE组织统一管理,所有合法的mac地址都可以通过IEEE官网查询到厂商 IEEE组织会定期...
  • MAC地址漂移和应对(一)

    千次阅读 2020-06-12 21:33:00
    对于一个园区网络来说,交换机是一个非常重要且常见的设备。...学习到,这种现象被称为MAC地址迁移,少数的几次MAC地址迁移往往并不被认为是MAC地址漂移,例如运行了VRRP ( Virtual Router Redundancy Proto
  • Windows/Linux获取Mac地址和CPU序列号实现

    千次阅读 多人点赞 2020-09-29 19:53:44
    UUID(Universally Unique Identifier)即通用唯一标识符,是指在一台机器上生成的数字,保证在全球范围的唯一...一般可通过获取设备的MAC地址+设备的CPU序列号作为设备的唯一标识符。 MAC地址(Media Access Control Ad
  • MAC地址随机化介绍

    千次阅读 2020-10-19 10:20:46
    但同时也会导致基于MAC地址跨网络认证的大范围WIFI技术对设备失效(IOS14设备,安卓设备同一个SSID保持虚拟MAC地址不变不受影响);找到一篇关于伪MAC地址的破解预印本[A Study of MAC Address Randomization in ...
  • 1. MAC地址是什么? MAC地址(Media Access Control,介质访问控制)是烧录在网卡(Network Interface Card,NIC)里的,也叫硬件地址,是由48bit位,也即6字节的16进制数组成的。 例如:F0FE6B4F4001 其二进制格式...
  • 计算机网络MAC地址的作用

    千次阅读 多人点赞 2019-05-27 13:32:57
    谈起MAC地址,不得不说一下IP地址。IP地址工作在TCP/IP参考模型的第三层网络层。IP地址专注于网络层,将数据包从一个网络转发到另外一个网络;而MAC地址专注于数据链路层,将一个数据帧从一个节点传送到相同链路的另...
  • 从IEEE购买合法MAC地址教程

    千次阅读 2021-01-29 22:44:06
    为了确保模块不与其他厂家的模块mac地址冲突,需要采购合法的mac地址。采购mac地址最容易想到的办法是通过代理,但根据实际购买过程来说,其实很简单。 2、购买流程 首先需要注册一个IEEE账号,网址:...
  • MAC地址

    千次阅读 2021-03-13 10:29:52
    MAC地址MAC地址表记录了相连设备的MAC地址、接口号以及所属的VLAN ID之间的对应关系,是VLAN内数据转发的决策表,是决定交换机转发行为的标准,交换机就是根据这张表负责将数据帧传输到指定的主机上的。   ...
  • 1.在线MAC地址查询: 这个在线工具可以根据MAC地址查询网卡厂商信息。工具链接:http://www.atoolbox.net/Tool.php?Id=808 2. 在线MAC地址生成器: 这个在线工具可随机生成指定组MAC地址。工具链接:...
  • Python 验证Mac地址

    千次阅读 2021-06-11 17:52:17
    Python 验证Mac地址 import re def validate_mac(mac): """ 验证Mac地址 :param mac: Mac地址 :return: Ture or False """ # 以'-'作为分隔符 if mac.find('-') != -1: pattern = re.compile(r"^\s*([0...
  • nmap获取mac地址Nmap is a very useful tool. It is used by penetration testers mainly but from an operation perspective, it is used by system administrators too. Nmap has a lot of different features. ...
  • cisco交换机通过ip地址查看mac地址

    万次阅读 2018-04-19 15:34:49
    1、查看MAC地址表show mac address-table 通过这条命令就可看到存储在当前交换机中的MAC地址表,里边记录了交换机目前学习到的所有主机MAC地址与交换机端口的映射关系,二层数据正是通过查找这种映射关系发送到目的...
  • 修改MAC地址(修改路由器地址)

    热门讨论 2011-01-08 10:49:40
    修改MAC地址
  • 数据帧在转发时,会涉及到源ip目标ip,源MAC地址目标MAC地址的使用,那么到底什么是这些个玩意儿,又咋用呢? 一、别怕,类比着看 数据的转发就好比是你寄个快递一样 寄个快递你得填上寄到哪吧,这个地址就是目标ip...
  • 配置静态MAC地址

    千次阅读 2020-08-17 11:57:05
    MAC地址表项是交换机通过报文的源MAC地址学习过程而自动生成的,而通过用户手动配置也可以生成静态的MAC地址表项。 手动配置静态MAC,一般是为了防止假冒身份的非法用户骗取数据,由网络管理员手动在MAC地址表中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 427,493
精华内容 170,997
关键字:

mac地址