精华内容
下载资源
问答
  • 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

    展开全文
  • php获取用户mac地址

    千次阅读 2013-12-19 17:30:14
    获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = array(); // 返回带有MAC地址的字串数组 var $mac_addr; f...
    <?php 
    /** 
    获取网卡的MAC地址原码;目前支持WIN/LINUX系统 
    获取机器网卡的物理(MAC)地址 
    **/ 
       
    class GetMacAddr{ 
       
            var $return_array = array(); // 返回带有MAC地址的字串数组 
            var $mac_addr; 
       
            function GetMacAddr($os_type){ 
                 switch ( strtolower($os_type) ){ 
                          case "linux": 
                                    $this->forLinux(); 
                                    break; 
                          case "solaris": 
                                    break; 
                          case "unix": 
                                     break; 
                           case "aix": 
                                     break; 
                           default: 
                                     $this->forWindows(); 
                                     break; 
        
                  } 
        
                   
                  $temp_array = array(); 
                  foreach ( $this->return_array as $value ){ 
        
                            if (preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]".
                            	"[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]".
                            	"[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value,$temp_array ) ){ 
                                     $this->mac_addr = $temp_array[0]; 
                                     break; 
                           } 
        
                  } 
                  unset($temp_array); 
                  return $this->mac_addr; 
             } 
        
        
             function forWindows(){ 
                  @exec("ipconfig /all", $this->return_array); 
                  if ( $this->return_array ) 
                           return $this->return_array; 
                  else{ 
                           $ipconfig = $_SERVER["WINDIR"]."\system32\ipconfig.exe"; 
                           if ( is_file($ipconfig) ) 
                              @exec($ipconfig." /all", $this->return_array); 
                           else 
                              @exec($_SERVER["WINDIR"]."\system\ipconfig.exe /all", $this->return_array); 
                           return $this->return_array; 
                  } 
             } 
        
        
        
             function forLinux(){ 
                  @exec("ifconfig -a", $this->return_array); 
                  return $this->return_array; 
             } 
        
    } 
    //方法使用 
    $mac = new GetMacAddr(PHP_OS); 
    echo $mac->mac_addr; 
    ?>

     

    展开全文
  • java实现获取用户MAC地址方法大全

    千次阅读 2017-03-28 19:20:40
    方法一:将本机地址与局域网内其他... * 根据IP地址获取mac地址 * @param ipAddress 127.0.0.1 * @return * @throws SocketException * @throws UnknownHostException */ public static String getLocalMac(Stri


    方法一:将本机地址与局域网内其他机器区分开来

    /**
       * 根据IP地址获取mac地址
       * @param ipAddress 127.0.0.1
       * @return
       * @throws SocketException
       * @throws UnknownHostException
       */
      public static String getLocalMac(String ipAddress) throws SocketException,
          UnknownHostException {
        // TODO Auto-generated method stub
        String str = "";
        String macAddress = "";
        final String LOOPBACK_ADDRESS = "127.0.0.1";
        // 如果为127.0.0.1,则获取本地MAC地址。
        if (LOOPBACK_ADDRESS.equals(ipAddress)) {
          InetAddress inetAddress = InetAddress.getLocalHost();
          // 貌似此方法需要JDK1.6。
          byte[] mac = NetworkInterface.getByInetAddress(inetAddress)
              .getHardwareAddress();
          // 下面代码是把mac地址拼装成String
          StringBuilder sb = new StringBuilder();
          for (int i = 0; i < mac.length; i++) {
            if (i != 0) {
              sb.append("-");
            }
            // mac[i] & 0xFF 是为了把byte转化为正整数
            String s = Integer.toHexString(mac[i] & 0xFF);
            sb.append(s.length() == 1 ? 0 + s : s);
          }
          // 把字符串所有小写字母改为大写成为正规的mac地址并返回
          macAddress = sb.toString().trim().toUpperCase();
          return macAddress;
        } else {
          // 获取非本地IP的MAC地址
          try {
            System.out.println(ipAddress);
            Process p = Runtime.getRuntime()
                .exec("nbtstat -A " + ipAddress);
            System.out.println("===process=="+p);
            InputStreamReader ir = new InputStreamReader(p.getInputStream());
              
            BufferedReader br = new BufferedReader(ir);
            
            while ((str = br.readLine()) != null) {
              if(str.indexOf("MAC")>1){
                macAddress = str.substring(str.indexOf("MAC")+9, str.length());
                macAddress = macAddress.trim();
                System.out.println("macAddress:" + macAddress);
                break;
              }
            }
            p.destroy();
            br.close();
            ir.close();
          } catch (IOException ex) {
          }
          return macAddress;
        }
      }
    

    我们再来看下方法二:

    package com.alpha.test;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.LineNumberReader;
     
    public class GetMac {
     
        /**
         * java获取客户端网卡的MAC地址
         * 
         * @param args
         */
        public static void main(String[] args) {
            GetMac get = new GetMac();
            System.out.println("1="+get.getMAC());
            System.out.println("2="+get.getMAC("127.0.0.1"));
        }
     
        // 1.获取客户端ip地址( 这个必须从客户端传到后台):
        // jsp页面下,很简单,request.getRemoteAddr() ;
        // 因为系统的VIew层是用JSF来实现的,因此页面上没法直接获得类似request,在bean里做了个强制转换
     
        // public String getMyIP() {
        // try {
        // FacesContext fc = FacesContext.getCurrentInstance();
        // HttpServletRequest request = (HttpServletRequest) fc
        // .getExternalContext().getRequest();
        // return request.getRemoteAddr();
        // } catch (Exception e) {
        // e.printStackTrace();
        // }
        // return "";
        // }
     
        // 2.获取客户端mac地址
        // 调用window的命令,在后台Bean里实现 通过ip来获取mac地址。方法如下:
     
        // 运行速度【快】
        public String getMAC() {
            String mac = null;
            try {
                Process pro = Runtime.getRuntime().exec("cmd.exe /c ipconfig/all");
     
                InputStream is = pro.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String message = br.readLine();
     
                int index = -1;
                while (message != null) {
                    if ((index = message.indexOf("Physical Address")) > 0) {
                        mac = message.substring(index + 36).trim();
                        break;
                    }
                    message = br.readLine();
                }
                System.out.println(mac);
                br.close();
                pro.destroy();
            } catch (IOException e) {
                System.out.println("Can't get mac address!");
                return null;
            }
            return mac;
        }
     
        // 运行速度【慢】
        public String getMAC(String ip) {
            String str = null;
            String macAddress = null;
            try {
                Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);
                InputStreamReader ir = new InputStreamReader(p.getInputStream());
                LineNumberReader input = new LineNumberReader(ir);
                for (; true;) {
                    str = input.readLine();
                    if (str != null) {
                        if (str.indexOf("MAC Address") > 1) {
                            macAddress = str
                                    .substring(str.indexOf("MAC Address") + 14);
                            break;
                        }
                    }
                }
            } catch (IOException e) {
                e.printStackTrace(System.out);
                return null;
            }
            return macAddress;
        }
    }
    

    方法三,更精简一些:

    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.LineNumberReader;
     
    public class MACAddress {
     String ip;
     String mac;
     public MACAddress (String ip){
      this.ip = ip;
     }
     public MACAddress (){
      this.ip = "0.0.0.0";
     }
     public String getMac(){
      try {
      Process p = Runtime.getRuntime().exec("arp -n");
       InputStreamReader ir = new InputStreamReader(p.getInputStream());
       LineNumberReader input = new LineNumberReader(ir);
       p.waitFor();
       boolean flag = true;
       String ipStr = "(" + this.ip + ")";
       while(flag) {
        String str = input.readLine();
        if (str != null) {
         if (str.indexOf(ipStr) > 1) {
          int temp = str.indexOf("at");
          this.mac = str.substring(
          temp + 3, temp + 20);
          break;
         }
        } else
        flag = false;
       }
      } catch (IOException | InterruptedException e) {
       e.printStackTrace(System.out);
      }
      return this.mac;
     }
     public void setIp(String ip){
      this.ip = ip;
     }
     
    }
    

    最后要放大招了,小伙伴们看仔细哦

    首先要说的是:本方法可以支持外网机器的mac地址获取。 

    以前弄了一个只能访问局域网。 有防火墙就访问不了, 但是这个不用担心了。
    测试了百度的ip,已经可以获得mac地址

    java通过ip获取mac地址-封ip封mac地址

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
     
    /**
    * 获取MAC地址
    * @author
    * 2011-12
    */
    public class GetMacAddress {
       public static String callCmd(String[] cmd) { 
         String result = ""; 
         String line = ""; 
         try { 
           Process proc = Runtime.getRuntime().exec(cmd); 
           InputStreamReader is = new InputStreamReader(proc.getInputStream()); 
           BufferedReader br = new BufferedReader (is); 
           while ((line = br.readLine ()) != null) { 
           result += line; 
           } 
         } 
         catch(Exception e) { 
           e.printStackTrace(); 
         } 
         return result; 
       }
        
       /** 
       * 
       * @param cmd 第一个命令 
       * @param another 第二个命令 
       * @return  第二个命令的执行结果 
       */
       public static String callCmd(String[] cmd,String[] another) { 
         String result = ""; 
         String line = ""; 
         try { 
           Runtime rt = Runtime.getRuntime(); 
           Process proc = rt.exec(cmd); 
           proc.waitFor(); //已经执行完第一个命令,准备执行第二个命令 
           proc = rt.exec(another); 
           InputStreamReader is = new InputStreamReader(proc.getInputStream()); 
           BufferedReader br = new BufferedReader (is); 
           while ((line = br.readLine ()) != null) { 
             result += line; 
           } 
         } 
         catch(Exception e) { 
           e.printStackTrace(); 
         } 
         return result; 
       }
        
        
        
       /** 
       * 
       * @param ip 目标ip,一般在局域网内 
       * @param sourceString 命令处理的结果字符串 
       * @param macSeparator mac分隔符号 
       * @return mac地址,用上面的分隔符号表示 
       */
       public static String filterMacAddress(final String ip, final String sourceString,final String macSeparator) { 
         String result = ""; 
         String regExp = "((([0-9,A-F,a-f]{1,2}" + macSeparator + "){1,5})[0-9,A-F,a-f]{1,2})"; 
         Pattern pattern = Pattern.compile(regExp); 
         Matcher matcher = pattern.matcher(sourceString); 
         while(matcher.find()){ 
           result = matcher.group(1); 
           if(sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher.group(1))) { 
             break; //如果有多个IP,只匹配本IP对应的Mac. 
           } 
         }
       
         return result; 
       }
        
        
        
       /** 
       * 
       * @param ip 目标ip 
       * @return  Mac Address 
       * 
       */
       public static String getMacInWindows(final String ip){ 
         String result = ""; 
         String[] cmd = { 
             "cmd", 
             "/c", 
             "ping " + ip 
             }; 
         String[] another = { 
             "cmd", 
             "/c", 
             "arp -a"
             }; 
       
         String cmdResult = callCmd(cmd,another); 
         result = filterMacAddress(ip,cmdResult,"-"); 
       
         return result; 
       } 
     
       /** 
       * @param ip 目标ip 
       * @return  Mac Address 
       * 
       */
       public static String getMacInLinux(final String ip){ 
         String result = ""; 
         String[] cmd = { 
             "/bin/sh", 
             "-c", 
             "ping " + ip + " -c 2 && arp -a"
             }; 
         String cmdResult = callCmd(cmd); 
         result = filterMacAddress(ip,cmdResult,":"); 
       
         return result; 
       } 
        
       /**
       * 获取MAC地址 
       * @return 返回MAC地址
       */
       public static String getMacAddress(String ip){
         String macAddress = "";
         macAddress = getMacInWindows(ip).trim();
         if(macAddress==null||"".equals(macAddress)){
           macAddress = getMacInLinux(ip).trim();
         }
         return macAddress;
       }
     
       //做个测试
       public static void main(String[] args) {      
         System.out.println(getMacAddress("220.181.111.148"));
       }
       
    }
    



    展开全文
  • 获取访问用户MAC信息

    千次阅读 2009-06-15 10:14:00
    最近公司要获取登陆用的mac地址信息,找了很久最终还是没有找到;只找到了获得本机信息和同一域内mac地址信息。当使用代理服务器时,获取的是代理服务器信息,虽然失败了,但是网上找到一些信息还是有点用途的1.用...

    最近公司要获取登陆用的mac地址信息,找了很久最终还是没有找到;只找到了获得本机信息和同一域内mac地址信息。当使用代理服务器时,获取的是代理服务器信息,虽然失败了,但是网上找到一些信息还是有点用途的

    1.用代码获取本机的相关信息,包括操作系统的登录用户名,PC类型,物理内存,计算机名称

    添加Computer类,类代码如下:

     

    2.获取登陆用户的mac地址信息,可惜的是只能在局域网中,并且不能使用代理服务器,使用代理后获取的是代理服务器信息

    展开全文
  • PHP 获取访问者的mac地址

    千次阅读 2019-03-18 15:36:25
    $result = array(); $macAddr = array(); @exec("ipconfig /all", $result);//执行Command(cmd)命令 ...//多个网卡时,会返回第一个网卡的mac地址,一般够用。 break; } } print_r($macAddr);exit;  
  • Java获取客户端ip mac地址

    千次阅读 2013-11-16 10:06:04
    Java获取客户端ip mac地址
  • 获取远程网卡MAC地址

    千次阅读 2004-11-02 17:25:00
    我一开始以为是获取本机MAC地址,说了几种方法给他。由于他还需要获取服务器(本机)相关信息,如硬盘序列号、CPU信息等。于是介绍了个WMI方法给他:using System.Management;string strMac = string.Em
  • js获取客户端MAC地址

    万次阅读 2018-12-05 17:18:58
    最近遇到一个需求,医院要求呼叫中心账号必须对应MAC地址,也就是说该MAC...那么首先问题一:如何才能通过页面访问得到本地MAC地址 问题二:每台电脑上都有多个MAC地址,那么应该选用哪一个MAC地址 MAC地址是每台...
  • 最近刚完成的一个模块中,需要获取系统客户端的IP地址与物理地址(MAC地址)。 获取的本机IP与MAC是服务器的,而非客户端的 通过JAVA获取,本机的IP地址与MAC地址,使用如下代码即可完成: package ...
  • 获取用户物理地址(即MAC地址) *" pageEncoding="UTF-8"%> String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()...
  • Android 6.0获取MAC地址

    千次阅读 2016-08-16 17:09:18
    众所周知,Android 6.0系统,做出许多重大的变化,例如获取获取蓝牙MAC地址,如果使用‘BluetoothAdapter.getAddress()’将返回的是02:00:00:00:00:00 常量,不是真实的蓝牙MAC地址。  看看官方是怎么描述的。为了...
  • ASPNET获取IP地址 MAC地址

    千次阅读 2009-04-15 00:12:00
    在ASP.NET中专用属性:获取服务器电脑名:Page.Server.ManchineName获取用户信息:Page.User获取客户端电脑名:Page.Request.UserHostName获取客户端电脑IP:Page.Request.UserHostAddress2. 在网络编程中的通用...
  • 经过网上查询找到一个经过验证...//获取用户电脑MAC地址并生成唯一机器识别码 class GetMacAddr { var $return_array = array(); // 返回带有MAC地址的字串数组 var $mac_addr; function GetMacAddr($os_t...
  • Android中获取Mac地址

    千次阅读 2015-03-07 11:14:16
    每一个连接网络的主机都会有一个Mac地址(又称为物理地址)和IP地址,Mac地址是与主机相关的,一台主机就会...如何获取安卓手机的Mac地址: 1.需要添加访问Wifi的权限: 2.获取Mac的方法: private String getM
  • java获取客户端IP地址和MAC地址

    万次阅读 2014-06-12 15:45:18
    最近项目中要获得客户端的mac地址。服务端是移植的centos系统,arm架构的盒子。客户端是手机和移动设备。(其它场景应该也是类似的) 首先要获得ip地址: 根据客户端的http请求,利用request.getRemoteAddr()获取...
  • Android中获取手机 IMEI Mac地址 IP地址

    千次阅读 2019-07-15 11:03:11
    获取手机IMEI 手机在生产时,每部手机均有一个唯一的标识(ID),国际上采用国际移动设备身份码(IMEI, International Mobile Equipment Identity)。IMEI是由15位数字组成的"电子串号",它与每台手机一一对应,而且该...
  • android6.0获取蓝牙mac地址

    千次阅读 2016-09-13 17:30:20
    android6.0获取蓝牙mac地址
  • 我们在利用C#开发桌面程序(Winform)程序的时候,经常需要获取一些跟系统相关的信息,例如用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存等。 首先需要引入命名空间: using System....
  • java获取登陆用户ip和mac地址的方法

    千次阅读 2016-03-11 09:38:28
    * 通过HttpServletRequest返回IP地址 * @param request HttpServletRequest * @return ip String * @throws Exception */ public String getIpAddr(HttpServletRequest request) throws Exception { String i
  • java获取客户端IP地址以及mac地址

    万次阅读 2014-02-02 08:31:14
    java获取客户端IP地址以及mac地址 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了...
  • php获取客户端mac地址的实例分享

    千次阅读 2013-07-08 22:44:40
    php获取客户度mac地址的方法,实例分享。...* 获取客户端Mac地址 * edit by www.jbxue.com * at 2013-7-8 */ class MacAddr { public $returnArray = array(); public $macAddr; function __contruct($
  • PHP获取服务器端唯一值MAC地址

    千次阅读 2014-01-06 23:38:50
    获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址。 /** 获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_...
  • 获取客户端IP和MAC地址

    千次阅读 2018-04-26 10:52:44
    小编是菜鸟,这两天拿到一个需求,登录时判断ip地址是否允许登录,这几天做下来小编遇见了好多坑,... 2、java可以直接获取请求,但是.net是要在iss上部署,如果直接在后端获取获取的是部署机器上的ip地址,只能在...
  • 前台、后台获取MAC地址的方法

    千次阅读 2015-01-16 18:16:22
    前台获取:(限IE) try { var macAddress = ''; var ipAddress = ''; var computerName = ''; var wmi = GetObject('winmgmts:{impersonationLevel=impersonate}'); e = new Enumerator(wmi.ExecQuery('...
  • PHP获取客户端的网卡mac物理地址

    万次阅读 2017-09-18 21:30:21
    获取客户端的mac地址是非常有用的一个功能,因为它是客户端的不可变的唯一标识,更换IP或者清除本地记录都是没用的。 Ruesin.com 所以获取mac地址经常会用到购买软件时的一机一激活码,网站注册每台机器只能注册...
  • public partial class 测试 : System.Web.UI.Page { [DllImport("Iphlpapi.dll")...我在本机,用公司局域网的电脑测试是正确的,但是放到服务器上,就不对,所有MAC地址都是00-00-00-00-00-00 请问这个问题如何解决
  • 用UDP协议来发送查询mac指令然后返回值中解析mac 这个方法,调试到黑体字地方就卡主了.一种127.0.0.1解析不了 我知道, 可是真实IP地址也解析不了 例如:59.56.127.226 这个就解析不了。 而192.168.19.14 类似这样就...
  • 但是,从企业信息安全角度出发,应该建立企业信息有限度的开放机制,保证用户在规定的权限范围内的获取相应的信息。常规的安全检查方法就是设立用户身份验证机制,即在Web服务器上进行口令和IP地址过滤。可是,企业...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,805
精华内容 35,922
关键字:

获取访问用户的mac地址