C#实现的QQ登录器

前几天看到一篇文章说通过DOS命令就可以登陆QQ,在运行里试了一下,真的可以
代码如下:
QQ路径 /start QQUIN:QQ号 PWDHASH:经过MD5BASE64双充加密的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; }
        }


    }

}


下载地址:
https://files.cnblogs.com/mgod/QQLogin.rar
原文地址:https://www.cnblogs.com/top5/p/1723518.html