• Android之查看Wifi密码


    在Android手机中,连接了Wifi之后,密码一般就看不到了,那有没有什么办法可以查看到这些密码呢?办法一般有两种,一种是通过查看wifi的配置文件,一种是使用命令。对于第一种,网上已经有很多了,大致就是先root,然后使用一些手机助手或者手机文件查看之类的工具(如ES、Root Exploere等)来查看wifi配置文件(位置是进入data/misc/wifi,目录里有个wpa_supplicant.conf或者其他文件名以.conf结尾的文件)。

    但是用这一种方法,有时会遇到一些问题,比如当手机的root不够彻底时,会引发遇想不到的问题。比如小米手机,当我们使用root工具去root后,看似root成功了,却会引起一些问题,比如授权出问题了、wifi不可用了、手机无法连接到电脑了等。

    那如果不用这种方式,还有什么方式呢?这就是今天的主题,查看wifi密码的第二种方式:命令。

    先来看看效果图:


    从图中,我们可以看到,通过依次输入命令后,拿到了wifi的用户名(test)和密码(12345)。现在来看这几个命令。

    1、adb connect 192.168.1.6。这是使用adb来连接手机。如果adb没有配置到环境变量中,请先定位到adb所在的目录,然后执行该命令或者将其所在目录加入环境变量中。

    2、adb shell。这是启动手机的命令终端。

    3、cat /data/misc/wifi/*.conf。获取/data/misc/wifi文件夹下所有conf文件后缀的信息。

    那在代码上要如何去实现呢?下面是实现的代码。

    WifiManage.java

    package com.example.wifipassword;
    
    import java.io.BufferedReader;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class WifiManage {
    
    	public List<WifiInfo> Read() throws Exception {
    		List<WifiInfo> wifiInfos=new ArrayList<WifiInfo>();
    	
    		Process process = null;
    		DataOutputStream dataOutputStream = null;
    		DataInputStream dataInputStream = null;
    		StringBuffer wifiConf = new StringBuffer();
    		try {
    			process = Runtime.getRuntime().exec("su");
    			dataOutputStream = new DataOutputStream(process.getOutputStream());
    			dataInputStream = new DataInputStream(process.getInputStream());
    			dataOutputStream
    					.writeBytes("cat /data/misc/wifi/*.conf
    ");
    			dataOutputStream.writeBytes("exit
    ");
    			dataOutputStream.flush();
    			InputStreamReader inputStreamReader = new InputStreamReader(
    					dataInputStream, "UTF-8");
    			BufferedReader bufferedReader = new BufferedReader(
    					inputStreamReader);
    			String line = null;
    			while ((line = bufferedReader.readLine()) != null) {
    				wifiConf.append(line);
    			}
    			bufferedReader.close();
    			inputStreamReader.close();
    			process.waitFor();
    		} catch (Exception e) {
    			throw e;
    		} finally {
    			try {
    				if (dataOutputStream != null) {
    					dataOutputStream.close();
    				}
    				if (dataInputStream != null) {
    					dataInputStream.close();
    				}
    				process.destroy();
    			} catch (Exception e) {
    				throw e;
    			}
    		}	
    	
    		
    		Pattern network = Pattern.compile("network=\{([^\}]+)\}", Pattern.DOTALL);
            Matcher networkMatcher = network.matcher(wifiConf.toString() );
            while (networkMatcher.find() ) {
                String networkBlock = networkMatcher.group();
                Pattern ssid = Pattern.compile("ssid="([^"]+)"");
                Matcher ssidMatcher = ssid.matcher(networkBlock);
                
                if (ssidMatcher.find() ) {   
                	WifiInfo wifiInfo=new WifiInfo();
                    wifiInfo.Ssid=ssidMatcher.group(1);
                    Pattern psk = Pattern.compile("psk="([^"]+)"");
                    Matcher pskMatcher = psk.matcher(networkBlock);
                    if (pskMatcher.find() ) {
                        wifiInfo.Password=pskMatcher.group(1);
                    } else {
                    	wifiInfo.Password="无密码";
                    }        
                    wifiInfos.add(wifiInfo);
                }
                
            }
    
    		return wifiInfos;
    	}
    
    }
    

    WifiInfo.java

    package com.example.wifipassword;
    
    public class WifiInfo {
    	public String Ssid="";
    	public String Password="";
    }
    


    注:

    1、通过Runtime.getRuntime().exec("su")获取root权限。

    2、通过process.getOutputStream()和process.getInputStream()获取终端的输入流和输出流。

    3、通过dataOutputStream.writeBytes("cat /data/misc/wifi/*.conf ")往终端中输入命令。注意,这里必须要有 作为换行,否则会与后一个exit命令作为一个命令,最终导致命令执行失败,无法得到结果。

    4、通过dataInputStream获取命令执行结果,并以UTF-8的编码转换成字符串。

    5、使用正则表达式过滤出wifi的用户名和密码。

    附上显示密码的代码:

    package com.example.wifipassword;
    
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    	
    	private WifiManage wifiManage;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		wifiManage = new WifiManage();
    		try {
    			Init();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	public void Init() throws Exception {
    		List<WifiInfo> wifiInfos = wifiManage.Read();
    		ListView wifiInfosView=(ListView)findViewById(R.id.WifiInfosView);
    		WifiAdapter ad = new WifiAdapter(wifiInfos,MainActivity.this);
    		wifiInfosView.setAdapter(ad);	
    	}
    	
    	public class WifiAdapter extends BaseAdapter{
    
    		List<WifiInfo> wifiInfos =null;
    		Context con;
    		
    		public WifiAdapter(List<WifiInfo> wifiInfos,Context con){
    			this.wifiInfos =wifiInfos;
    			this.con = con;
    		}
    		
    		@Override
    		public int getCount() {
    			// TODO Auto-generated method stub
    			return wifiInfos.size();
    		}
    
    		@Override
    		public Object getItem(int position) {
    			// TODO Auto-generated method stub
    			return wifiInfos.get(position);
    		}
    
    		@Override
    		public long getItemId(int position) {
    			// TODO Auto-generated method stub
    			return position;
    		}
    
    		@Override
    		public View getView(int position, View convertView, ViewGroup parent) {
    			// TODO Auto-generated method stub
    			convertView = LayoutInflater.from(con).inflate(android.R.layout.simple_list_item_1, null);
    			TextView tv = (TextView)convertView.findViewById(android.R.id.text1);
    			tv.setText("Wifi:"+wifiInfos.get(position).Ssid+"
    密码:"+wifiInfos.get(position).Password);
    			return convertView;
    		}
    		
    	}
    
    }
    

    最终效果图:

    该应用已经上传到百度应用了,地址为http://as.baidu.com/a/item?docid=5828457&pre=web_am_se

    转换请注明出处: 

    Android之查看Wifi密码



  • 相关阅读:
    将博客搬至CSDN
    Java开发基础知识之学习篇——双亲委派机制
    Java开发基础知识之学习篇——理解NIO
    Java开发基础知识之学习篇——类加载机制
    Java开发基础知识之学习篇——Object类
    Java开发基础知识之学习篇——核心类库
    Java开发基础知识之学习篇——JVM组成
    Java笔试准备篇之基础篇——抽象类与接口
    Java开发进阶知识之学习篇——hashCode和equals
    JWT类型的Token介绍
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605031.html
Copyright © 2020-2023  润新知