阅读内容 

C#实现的QQ登录器

[日期:2008-06-19] 来源:  作者: [字体: ]
     前几天看到一篇文章说通过DOS命令就可以登陆QQ,在运行里试了一下,真的可以
  代码如下:
  QQ路径 /start QQUIN:QQ号 PWDHASH:经过MD5和BASE64双充加密的QQ密码 /stat:登陆类型
  
  今天就想做个QQ登录器试一下,信息保存尝试使用了序列化,发现功能真的太强大了,刚才整理了一下,现在完工,里面做了大量的注释,放出代码,文章最下面有打包的下载:
  
  QQLoginForm.cs窗体
  
  using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Text;
  using System.Windows.Forms;
  using System.Security.Cryptography;
  using System.Diagnostics;
  namespace QQLogin
  {
  
   public partial class QQLoginForm : Form
   {
   public QQLoginForm()
   {
   InitializeComponent();
   }
  
   UserInfo ui;
   private void button1_Click(object sender, EventArgs e)
   {
   //单用户登陆
   if (ui == null)
   {
   ui = new UserInfo();//如果没有提取出来对象,就创建一个
   }
   if (ui != null)
   {
   ui.Username = this.txtUser.Text.Trim();
   ui.Password = this.txtPwd.Text;
   ui.Type = this.cboType.Text == "正常" ? "41" : "40";
   if (this.ValidateInput())
   {//验证是否输入完全
   if (string.IsNullOrEmpty(ui.Path))
   {//判断是否有QQ路径,如果没有就打开对话框来选择一下
   DialogResult dr = this.opfQQ.ShowDialog();
   if (dr == DialogResult.OK)
   {
   ui.Path = opfQQ.FileName;//将选择的路径赋值给对象
   this.LoginQQ(ui.Username, ui.Password, ui.Type, ui.Path);//登陆QQ
   }
  
   }
   else
   {
   this.LoginQQ(ui.Username, ui.Password, ui.Type, ui.Path);
  
   }
   }
  
   SerializeHelper.SerializeUserInfo(ui);//每次登陆都序列化保存一次
  
   }
  
   }
   private bool ValidateInput()
   {//验证是否输入完整
   if (this.txtUser.Text == "")
   {
   this.txtUser.Focus();
   return false;
   }
   else if(this.txtPwd.Text=="")
   {
   this.txtPwd.Focus();
   return false;
   }
   return true;
  
   }
  
   private void LoginQQ(string user,string pwd,string type,string path)
   {//登陆QQ的命令,通过CMD命令来执行
   Process MyProcess = new Process();
   //设定程序名
   MyProcess.StartInfo.FileName = "cmd.exe";
   //关闭Shell的使用
   MyProcess.StartInfo.UseShellExecute = false;
   //重定向标准输入
   MyProcess.StartInfo.RedirectStandardInput = true;
   //重定向标准输出
   MyProcess.StartInfo.RedirectStandardOutput = true;
   //重定向错误输出
   MyProcess.StartInfo.RedirectStandardError = true;
   //设置不显示窗口
   MyProcess.StartInfo.CreateNoWindow = true;
   //执行强制结束命令
   MyProcess.Start();
   MyProcess.StandardInput.WriteLine(path+" /start QQUIN:"+user+" PWDHASH:" + EncodeHash.pwdHash(pwd) + " /stat:"+type);//直接结束进程ID
   MyProcess.StandardInput.WriteLine("Exit");
  
   }
  
  
   private void btnExit_Click(object sender, EventArgs e)
   {
   Application.Exit();
   }
  
   private void txtUser_KeyPress(object sender, KeyPressEventArgs e)
   {
   if ((e.KeyChar < '0' || e.KeyChar > '9')&&e.KeyChar!=8)
   {//只能输入数字和退格键
   e.Handled = true;
   }
   }
  
   private void QQLoginForm_Load(object sender, EventArgs e)
   {
   LoadInfo();//单用户获取
  
   }
   private void LoadInfo()
   {//单用户获取
   ui = SerializeHelper.DeserializeUserInfo();//返回获取后对象
   if (ui != null)
   {
   this.txtUser.Text = ui.Username;//填充文本框
   this.txtPwd.Text = ui.Password;//填充密码框
   this.cboType.SelectedIndex = ui.Type == "41" ? 0 : 1;//选择登陆方式
   }
   else
   {
   this.cboType.SelectedIndex = 0;
   }
   }
   private void btnConfig_Click(object sender, EventArgs e)
   {
   ConfigForm cf = new ConfigForm();
   cf.ShowDialog();
   LoadInfo();
   }
  
  
  
   }
  }
  ConfigForm.cs 配置窗体
  using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Text;
  using System.Windows.Forms;
  namespace QQLogin
  {
   public partial class ConfigForm : Form
   {
  
   UserInfo ui;
   public ConfigForm()
   {
   InitializeComponent();
   }
  
   private void txtPath_Click(object sender, EventArgs e)
   {//点击一次文本框,弹出一次对话框来选择QQ路径
   DialogResult dr = this.opfQQ.ShowDialog();
   if (dr == DialogResult.OK)
   {
   this.txtPath.Text = opfQQ.FileName;
  
   }
   }
  
   private bool ValidateInput()
   {//验证是否输入完整
   if (this.txtUser.Text == "")
   {
   this.txtUser.Focus();
   return false;
   }
   else if (this.txtPwd.Text == "")
   {
   this.txtPwd.Focus();
   return false;
   }
   else if (this.txtPath.Text == "")
   {
   return false;
   }
   return true;
  
   }
   private void btnCancel_Click(object sender, EventArgs e)
   {
   this.Close();
   }
  
   private void ConfigForm_Load(object sender, EventArgs e)
   {
   LoadInfo();
   }
  
   private void btnSave_Click(object sender, EventArgs e)
   {
   ui = new UserInfo();
   ui.Username = this.txtUser.Text.Trim();
   ui.Password = this.txtPwd.Text;
   ui.Type = this.cboType.Text == "正常" ? "41" : "40";
   ui.Path = this.txtPath.Text;
   if (this.ValidateInput())
   {
   SerializeHelper.SerializeUserInfo(ui);
   this.Close();
   }
  
  
   }
   private void LoadInfo()
   {
   ui = SerializeHelper.DeserializeUserInfo();
   if (ui != null)
   {
   this.txtUser.Text = ui.Username;
   this.txtPwd.Text = ui.Password;
   this.cboType.SelectedIndex = ui.Type == "41" ? 0 : 1;
   this.txtPath.Text = ui.Path;
   }
   else
   {
   this.cboType.SelectedIndex = 0;
   }
   }
   }
  }
  EncodeHash.cs 加密类
  using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Security.Cryptography;
  
  namespace QQLogin
  {
   /**//// <summary>
   /// 编码加密类
   /// </summary>
   class EncodeHash
   {
   /**//// <summary>
   /// 通过MD5加密后返回加密后的BASE64密码
   /// </summary>
   /// <param name="pwd">要加密的内容</param>
   /// <returns>通过MD5加密后返回加密后的BASE64密码</returns>
  
   public static string pwdHash(string pwd)
   {//使用MD5的16位加密后再转换成BASE64
   System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();//实例化一个md5对像
   // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 
   byte[] s = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(pwd));
   return Convert.ToBase64String(s);
   }
  
   /**//// <summary>
   /// 返回MD5的32位加密后的密码
   /// </summary>
   /// <param name="inputString">要加密的内容</param>
   /// <returns>加密后的结果</returns>
   public static string StringToMD5Hash(string inputString)
   {
  
   MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
   byte[] encryptedBytes = md5.ComputeHash(Encoding.ASCII.GetBytes(inputString));
   StringBuilder sb = new StringBuilder();
   for (int i = 0; i < encryptedBytes.Length; i++)
   {
   sb.AppendFormat("{0:x2}", encryptedBytes[i]);
   }
   return sb.ToString();
   }
  
   /**//// <summary>
   /// Base64编码
   /// </summary>
   /// <param name="code"></param>
   /// <returns></returns>
   public static string EncodeBase64(string code)
   {
   string encode = "";
   byte[] bytes = System.Text.Encoding.Default.GetBytes(code);
  
   try
   {
   encode = Convert.ToBase64String(bytes);
   }
   catch
   {
   encode = code;
   }
   return encode;
   }
  
   /**//// <summary>
   /// Base64解码
   /// </summary>
   /// <param name="code_type"></param>
   /// <param name="code"></param>
   /// <returns></returns>
   public static string DecodeBase64(string code_type, string code)
   {
   string decode = "";
   byte[] bytes = Convert.FromBase64String(code);
   try
   {
   decode = Encoding.GetEncoding(code_type).GetString(bytes);
   }
   catch
   {
   decode = code;
   }
   return decode;
   }
   }
  }
  
  SerializeHelper.cs 序列化类,打算做多用户登录器呢,就预留了两个用来序列化集合的方法
  using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Windows.Forms;
  using System.Runtime.Serialization.Formatters.Binary;//序列化
  using System.IO;
  
  namespace QQLogin
  {
   /**//// <summary>
   /// 序列化帮助类
   /// </summary>
   class SerializeHelper
   {
   /**//// <summary>
   /// 使用反序列化方式读取信息
   /// </summary>
   /// <returns></returns>
   public static UserInfo DeserializeUserInfo()
   {//将用户信息使用反序列化方式提取
   UserInfo ui = null;
   try
   {
   FileStream fileStream = null;
   fileStream = new FileStream(Application.StartupPath + "\\UserInfo.bin", FileMode.Open);
   BinaryFormatter bf = new BinaryFormatter();
   ui = (UserInfo)bf.Deserialize(fileStream);
   fileStream.Close();
   }
   catch (Exception ex)
   {
   }
   return ui;
   }
   /**//// <summary>
   /// 序列化UserInfo对象
   /// </summary>
   /// <param name="ui">传入要序列化的UserInfo对象</param>
   public static void SerializeUserInfo(UserInfo ui)
   {//将用户信息使用序列化方式保存
   try
   {
   FileStream fileStream = null;
   fileStream = new FileStream(Application.StartupPath + "\\UserInfo.bin", FileMode.Create);
   BinaryFormatter bf = new BinaryFormatter();
   bf.Serialize(fileStream, ui);
   fileStream.Close();
   }
   catch (Exception ex)
   {
   MessageBox.Show(ex.Message);
   }
   }
   /**//// <summary>
   /// 反序列化UserInfo泛型集合对象
   /// </summary>
   /// <returns></returns>
   public static List<UserInfo> DeserializeList()
   {//将用户信息使用反序列化方式提取
   List<UserInfo> lst = null;
   FileStream fileStream = null;
   try
   {
  
   fileStream = new FileStream(Application.StartupPath + "\\UserInfo.bin", FileMode.Open);
   BinaryFormatter bf = new BinaryFormatter();
   lst = (List<UserInfo>)bf.Deserialize(fileStream);
   fileStream.Close();
  
   }
   catch (Exception ex)
   {
   MessageBox.Show(ex.Message);
   }
  
  
  
   return lst;
   }
   /**//// <summary>
   /// 序列化UserInfo泛型集合对象
   /// </summary>
   /// <param name="ui">传入要序列化的List<UserInfo>对象</param>
   public static void SerializeList(List<UserInfo> lst)
   {//将用户信息使用序列化方式保存
   FileStream fileStream = null;
   try
   {
  
   fileStream = new FileStream(Application.StartupPath + "\\UserInfo.bin", FileMode.Create);
   BinaryFormatter bf = new BinaryFormatter();
   bf.Serialize(fileStream, lst);
   fileStream.Close();
   }
   catch (Exception ex)
   {
   MessageBox.Show(ex.Message);
   }
   }
   }
  }
  
  UserInfo.cs用户信息类
  using System;
  using System.Collections.Generic;
  using System.Text;
  
  namespace QQLogin
  {
   /**//// <summary>
   /// 用户信息类
   /// </summary>
   [Serializable]
   class UserInfo
   {
   private string username;
  
   public string Username
   {
   get { return username; }
   set { username = value; }
   }
   private string password;
  
   public string Password
   {
   get { return password; }
   set { password = value; }
   }
   private string type;
  
   public string Type
   {
   get { return type; }
   set { type = value; }
   }
   private string path;
  
   public string Path
   {
   get { return path; }
   set { path = value; }
   }
  
   }
  }
  
  下载地址:
  http://www.cnblogs.com/Files/mgod/QQLogin.rar  
阅读:
录入:blue1000

推荐 】 【 打印
相关新闻      
本文评论       全部评论
发表评论
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款


点评: 字数
姓名:
Advertisement
内容查询


Advertisement