zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    MAC OS 上appium自动化测试环境搭建
    Vba+access+Excel编程
    测试工具--SoapUI
    python打包代码做.exe文件
    EXCEL 表格常用函数小记
    python学习杂记--读取安卓设备sdcard中的文件列表
    appium三种等待方式
    python学习杂记--处理excel表格
    Docker学习笔记二
    DHCP报文格式
  • 原文地址:https://www.cnblogs.com/top5/p/1723518.html
Copyright © 2011-2022 走看看