VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • c#实现qq登录器

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  前几天看到一篇文章说通过DOS命令就可以登陆QQ,在运行里试了一下,真的可以

  代码如下:

  Code

  [copy to clipboard]

  CODE:

  QQ路径 /start QQUIN:QQ号 PWDHASH:经过MD5和BASE64双充加密的QQ密码 /stat:登陆类型

  今天就想做个QQ登录器试一下,信息保存尝试使用了序列化,发现功能真的太强大了,刚才整理了一下,现在完工,里面做了大量的注释,放出代码,文章最下面有打包的下载:

  QQLoginForm.cs窗体

  Code

  [copy to clipboard]

  CODE:

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 配置窗体

  Code

  [copy to clipboard]

  CODE:

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 加密类

  Code

  [copy to clipboard]

  CODE:

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);
      }
      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 序列化类,打算做多用户登录器呢,就预留了两个用来序列化集合的方法

  Code

  [copy to clipboard]

  CODE:

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用户信息类

  Code

  [copy to clipboard]

  CODE:

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; }
    }
  }
}

 

 

  ConfigForm.cs 配置窗体

  Code

  [copy to clipboard]

  CODE:

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;
      }
    }
  }
}



相关教程