前几天看到一篇文章说通过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[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; } } } }
下载地址: http://www.cnblogs.com/Files/mgod/QQLogin.rar