前几天看到一篇文章说通过DOS命令就可以登陆QQ,在运行里试了一下,真的可以
代码如下:
QQ路径 /start QQUIN:QQ号 PWDHASH:经过MD5和BASE64双充加密的QQ密码 /stat:登陆类型
今天就想做个QQ登录器试一下,信息保存尝试使用了序列化,发现功能真的太强大了,刚才整理了一下,现在完工,里面做了大量的注释,放出代码,文章最下面有打包的下载:
QQLoginForm.cs窗体
ConfigForm.cs 配置窗体
EncodeHash.cs 加密类
SerializeHelper.cs 序列化类,打算做多用户登录器呢,就预留了两个用来序列化集合的方法
UserInfo.cs用户信息类
下载地址:
https://files.cnblogs.com/mgod/QQLogin.rar
代码如下:
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();
}
}
}
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;
}
}
}
}
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;
}
}
}
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);
}
}
}
}
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; }
}
}
}
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