C#实现的QQ登录器

来源:互联网 发布:java 动态添加字段 编辑:程序博客网 时间:2024/04/28 08:01
前几天看到一篇文章说通过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);
            }
            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; }
        }


    }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////

下载Demo地址:http://u.115.com/file/bha14f52#
QQLogin.rar

原创粉丝点击