QQ空间网页登录的密码算法改了吗? 好好的方法不能用了用上新的请求地址后提示密码不正确。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 加密方式是知道了,,如下面MD5(MD5(hexchar2bin(MD5("密码")) +"16进制返回码")) + "验证码"private string hexchar2bin(string sPassword) { string str1=""; for (int i = 0; i < sPassword.Length; i = i + 2) { str1 += Convert.ToChar(Convert.ToInt32(sPassword.Substring(i, 2),16)); } return str1; }返回码即这个网址获取的第三个值 http://check.ptlogin2.qq.com/check?uin=8888880&appid=15004501&r=上面没有绝对的解决问题,,因为JS的MD5,和C#的MD5加“16进制返回码”产生了不一样的结果,,希望有高手能解决一下,本人在研究中。。(加普通码则是一样的) ptui_checkVC('0','!NUU', '\x00\x00\x00\x00\x00\x87\xa2\x30');\x00\x00\x00\x00\x00\x87\xa2\x30这种的16进制返回码 吗? 是的,,JS MD5加密unicode和C#加密会有不同的结果,貌似这个问题很老旧了,但还没有找到解决方法 研究出来给我也发一份 [email protected] 谢谢 我的主语言是java, java的最新QQ空间加密算法已经搞定了, 看来C#应该和这个思路差不多。 晚上应该能很快搞定,坐等下班,公司没有VS开发工具。。 应该啊,,难就难在这里,,JAVA的MD5加密和JS的不冲突,,和C#的冲突,我就卡在这问题上。。 被hexchar2bin這個卡住了,不知道怎麼用C#來寫,求大神! 晕,hexchar2bin这个我不是发在上面吗 同求,但是。。我不会太高深了。[email protected] 搞定也发我一份吧[email protected]感谢大神``` 现在主要是 hexchar2bin 之后 和 返回的十六进制 组合MD5加密时 C#和JS 得到的结果不同, 就这里了 对吧? [email protected]...高手无处不在。 也请发我一份,[email protected],谢谢 是因为编码问题,我JAVA是这样解决的。 我觉得C#应该也是这样的。 你去试试。 要么等我下班后,我来试。 java用的是什么编码方式.C#我也试过各种编码方式还是不一样啊 你用JAVA怎麼解決的?貼出來參考下我用C#試試 加密unicode字符基本都不一致,折腾了一下午头疼,,大牛们快来帮帮忙吧 var D = G.p.value; var H = hexchar2bin(md5(D)); var F = md5(H + pt.uin); var C = md5(F + G.verifycode.value.toUpperCase()); A += C好像把QQ号也一起加密了一下啊 pt.uin 并不是通常的QQ号,,是我前面说的那个16进进制返回值,你再跟踪代码就知道了 為什麼我用你這個計算出來的值跟原版JS裏hexchar2bin算出來的不一樣?我把兩個亂碼結果MD5後值是不同的(沒加上pt.uin) public static String hexchar2bin(String str) { String s = ""; for (var i = 0; i < str.Length; i = i + 2) { s += "\\x" + str.Substring(i, 2); } return s; }试试这个` 這個就更不對了,原版JS裏hexchar2bin函數alert出來顯示的是亂碼。不是\x00的文本格式。 \x00\x00\x00\x00\x00\x87\xa2\x30 這個字符串在C#裏md5的結果跟JS裏MD5的值不一樣,這是什麼法術? 那就用C# 调 js呗:在WinForm 中 借用WebBrowser控件 , WebBrowser.Document.InvokeScript 可以调用js.http://www.cnblogs.com/08shiyan/archive/2011/04/22/2023861.htmlAsp.NET 就不用说了吧... public static string EncyptMD5_3_16(string s) { MD5 mD = MD5.Create(); byte[] bytes = Encoding.ASCII.GetBytes(s); byte[] buffer = mD.ComputeHash(bytes); byte[] buffer2 = mD.ComputeHash(buffer); byte[] array = mD.ComputeHash(buffer2); StringBuilder stringBuilder = new StringBuilder(); byte[] array2 = array; for (int i = 0; i < array2.Length; i++) { byte b = array2[i]; stringBuilder.Append(b.ToString("x").PadLeft(2, '0')); } return stringBuilder.ToString().ToUpper(); } public static string smethod_0(string s) { MD5 mD = MD5.Create(); byte[] bytes = Encoding.ASCII.GetBytes(s); byte[] array = mD.ComputeHash(bytes); StringBuilder stringBuilder = new StringBuilder(); byte[] array2 = array; for (int i = 0; i < array2.Length; i++) { byte b = array2[i]; stringBuilder.Append(b.ToString("x").PadLeft(2, '0')); } return stringBuilder.ToString().ToUpper(); } public static byte[] EncyptMD5Bytes(string s) { MD5 mD = MD5.Create(); byte[] bytes = Encoding.ASCII.GetBytes(s); return mD.ComputeHash(bytes); } public static string smethod_1(byte[] s) { MD5 mD = MD5.Create(); byte[] array = mD.ComputeHash(s); StringBuilder stringBuilder = new StringBuilder(); byte[] array2 = array; for (int i = 0; i < array2.Length; i++) { byte b = array2[i]; stringBuilder.Append(b.ToString("x").PadLeft(2, '0')); } return stringBuilder.ToString().ToUpper(); } public static string EncryptQQWebMd5(string s) { MD5 mD = MD5.Create(); byte[] bytes = Encoding.ASCII.GetBytes(s); byte[] array = mD.ComputeHash(bytes); StringBuilder stringBuilder = new StringBuilder(); byte[] array2 = array; for (int i = 0; i < array2.Length; i++) { byte b = array2[i]; stringBuilder.Append("\\x"); stringBuilder.Append(b.ToString("x2")); } return stringBuilder.ToString(); } public static string EncryptOld(string password, string verifyCode) { return QQMd5.smethod_0(QQMd5.EncyptMD5_3_16(password) + verifyCode.ToUpper()); } public static string Encrypt(string qq, string password, string verifyCode) { return QQMd5.Encrypt((long)Convert.ToInt32(qq), password, verifyCode); } public static string Encrypt(long qq, string password, string verifyCode) { ByteBuffer byteBuffer = new ByteBuffer(); byteBuffer.Put(QQMd5.EncyptMD5Bytes(password)); byteBuffer.PutInt(0); byteBuffer.PutInt((uint)qq); QQMd5.EncryptQQWebMd5(password); byte[] s = byteBuffer.ToByteArray(); string str = QQMd5.smethod_1(s); return QQMd5.smethod_0(str + verifyCode.ToUpper()); } 不做太多解析吧全新QQ算法有问题可以到我的BOLG http://fz24z.5d6d.net/bbs.php 我还以为是C#的,原来是JAVA的。。 public static string EncryptQQWebMd5(string s) { MD5 mD = MD5.Create(); byte[] bytes = Encoding.ASCII.GetBytes(s); byte[] array = mD.ComputeHash(bytes); StringBuilder stringBuilder = new StringBuilder(); byte[] array2 = array; for (int i = 0; i < array2.Length; i++) { byte b = array2[i]; stringBuilder.Append("\\x"); stringBuilder.Append(b.ToString("x2")); } return stringBuilder.ToString(); }这个是? c# ByteBuffer 有这个?? 在哪的 http://blog.csdn.net/red_angelx/article/details/1350095我也是百度到的。虽然是JAVA的东西。C#也给实现了c# byteBuffer 类。 byteBuffer.Put(QQMd5.EncyptMD5Bytes(password)); byteBuffer.PutInt(0); byteBuffer.PutInt((uint)qq);这个地方要改成: byteBuffer.PushByteArray(EncyptMD5Bytes(password)); byteBuffer.PushInt(0); byteBuffer.PushInt((uint)qq);public static string Encrypt(long qq, string password, string verifyCode)qq就是QQ号码 chenjacker2013 非常的牛啊,感谢,, 也感谢 zhs23 问题已经解决,,88. QQ最新加密方式已经发布到我博客 http://blog.csdn.net/xiaolajiao958/article/details/7621750 我看有的人不会byteBuffer public class ByteBuffer { private byte[] byte_0; public Stream BaseStream; public ByteBuffer() { this.BaseStream = new MemoryStream(); this.byte_0 = new byte[16]; } public virtual long Seek(int offset, SeekOrigin origin) { return this.BaseStream.Seek((long)offset, origin); } public bool Peek() { return this.BaseStream.Position < this.BaseStream.Length; } public byte[] ToByteArray() { //long position = this.BaseStream.Position; //this.BaseStream.Position = 0L; //byte[] array = new byte[(int)((object)((IntPtr)this.BaseStream.Length))]; //this.BaseStream.Read(array, 0, array.Length); //this.BaseStream.Position = position; //return array; long position = this.BaseStream.Position; this.BaseStream.Position = 0L; byte[] buffer = new byte[this.BaseStream.Length]; this.BaseStream.Read(buffer, 0, buffer.Length); this.BaseStream.Position = position; return buffer; } public void Put(bool value) { this.byte_0[0] = value ? ((byte)1) : ((byte)0); this.BaseStream.Write(this.byte_0, 0, 1); } public void Put(byte value) { this.BaseStream.WriteByte(value); } public void Put(byte[] value) { if (value == null) { throw new ArgumentNullException("value"); } this.BaseStream.Write(value, 0, value.Length); } public void PutInt(int value) { this.PutInt((uint)value); } public void PutInt(uint value) { this.byte_0[0] = (byte)(value >> 24); this.byte_0[1] = (byte)(value >> 16); this.byte_0[2] = (byte)(value >> 8); this.byte_0[3] = (byte)value; this.BaseStream.Write(this.byte_0, 0, 4); } public void PutInt(int index, uint value) { int offset = (int)this.BaseStream.Position; this.Seek(index, SeekOrigin.Begin); this.PutInt(value); this.Seek(offset, SeekOrigin.Begin); } public byte Get() { return (byte)this.BaseStream.ReadByte(); } } QQ空间已经登录成功,但是QQ和拍拍不能登录,抓包GET /login?u=qq号码&p=密码加密&verifycode=验证码&aid=17000101&u1=http%3A%2F%2Fmember.paipai.com%2Fcgi-bin%2Fptlogin%3Floginfrom%3D18&h=1&ptredirect=0&ptlang=2052&from_ui=1&dumy=&fp=loginerroralert&action=11-27-2288669&mibao_css=&t=5&g=1最后的action和时间、cookies有关,t和验证码有关,mibao_css和登录平台有关。action参数不设置,或者设置错误,提示:"ptuiCB('24','0','','0','很遗憾,网络连接出现异常,请您检查是否禁用cookies。(3612345232)', 'qq号码');\r\n"。请大牛解答下 using System;using System.IO;using System.Security.Cryptography;using System.Text;namespace xfqz86Helper{ public static class Hash { public static byte[] MD5(byte[] data) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] hash_byte = md5.ComputeHash(data); return hash_byte; } public static string MD5(byte[] data, bool Upper) { return BinToHex(MD5(data), Upper); } public static byte[] MD5(string str, Encoding encoding) { return MD5(StrToBin(str, encoding)); } public static string MD5(string str, Encoding encoding, bool Upper) { return MD5(StrToBin(str, encoding), Upper); } public static string BinToHex(byte[] buffer, bool Upper) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < buffer.Length; i++) builder.Append(buffer[i].ToString("x2")); if (Upper) return builder.ToString().ToUpper(); else return builder.ToString().ToLower(); } public static byte[] StrToBin(string Str, Encoding encoding) { if (encoding == null) encoding = Encoding.Default; return encoding.GetBytes(Str); } public static byte[] BinArraySum(byte[] buffer1, byte[] buffer2) { if (buffer1 == null) buffer1 = new byte[0]; if (buffer2 == null) buffer2 = new byte[0]; byte[] AllBin = new byte[buffer1.Length + buffer2.Length]; int NowIndex = 0; foreach (Byte TempByte in buffer1) AllBin[NowIndex++] = TempByte; foreach (Byte TempByte in buffer2) AllBin[NowIndex++] = TempByte; return AllBin; } public static string QQPasswordHash(string password, string verifycode, byte[] uin) { return MD5(MD5(BinArraySum(MD5(password, Encoding.UTF8), uin), true) + verifycode.ToUpper(), Encoding.UTF8, true); } }}其中的uin是从http://check.ptlogin2.qq.com/check?uin={QQ号码}&appid=1003903&r={随机数}取得返回数据:ptui_checkVC('0','!NUU','\x00\x00\x00\x00\x00\x87\xa2\x30');说明:蓝色部分为验证码。有返回则可以直接使用该验证码登陆,如不返回验证码就需要手动输入。红色部分为uin,请自行分割成byte[]型数据。 回 #69楼 和 #71楼u = QQ号码p = 加密密码verifycode = 验证码aid = 应用IDu1 = 来路h = ?具体效果未知,可固定为1。ptredirect = 重定向?具体效果未知,可固定为0。ptlang = 界面语言from_ui = ?具体效果未知,可固定为1。dumy = ?具体效果未知,可固定为空。fp = ?具体效果未知,可固定为loginerroralert。action = 登陆时操作记录。11-27-2288669样式。第一个数字为登录时输入框获取焦点次数,输入框包括用户名、密码、验证码。第二个为登录时按键按下次数。第三个为登录时填写表单所耗费时间,毫秒计数。mibao_css = 密保样式t = ?具体效果未知。g = ?具体效果未知,可固定为1。提示"ptuiCB('24','0','','0','很遗憾,网络连接出现异常,请您检查是否禁用cookies。(3612345232)', 'qq号码');\r\n"消息是因为登录时的Cookies作用域有问题。默认网页登录时js会转换Cookies作用域名为“.qq.com”。而软件登陆时不会。所以要用代码把Cookies作用于转换成“.qq.com”具体代码如下:CookieCollection Cookies = CookieContainer.GetCookies(new Uri("http://www.ptlogin2.qq.com/"));foreach (Cookie TempCookie in Cookies){ TempCookie.Domain = ".qq.com"; CookieContainer.Add(TempCookie);}其中CookieContainer为HttpWebRequest接收Cookies所用的对象。 http://captcha.qq.com/getimage?aid=15000101&r=0.40132026315138863&uin="+QQ 回 #74楼 地址为:http://captcha.qq.com/getimage?aid=15000101&r={随机数}&uin={QQ号码} 这个怎么把 uin 转换为byte[]? 哪有算法 直接POST 提交的明文啊。最多就是传输的时候是https加密的。 提交的值怎么加密啊。 回 #78楼uin从http://check.ptlogin2.qq.com/check?uin={QQ号码}&appid={应用ID}&r={随机数}取得返回数据: ptui_checkVC('0','!NUU','\x00\x00\x00\x00\x00\x87\xa2\x30'); 蓝色部分则为uin的js十六进制字串形式。用以下代码解析成byte[]型 String UinStr = '返回的uin js十六进制字串'; String[] UinSplit = UinStr.Split(new String[] { @"\x" }, StringSplitOptions.RemoveEmptyEntries); uin = new byte[UinSplit.Length]; for (int index = 0; index < UinSplit.Length; index++) uin[index] = Convert.ToByte(UinSplit[index], 16); QQ空间登录源码下载地址,点击:http://download.csdn.net/user/web_boy 进行下载! 我的论坛有登陆空间并获取好友的VB源代码登陆成功后可以做很多事情,我做了个农场辅助,全部开源,大家可以参考易我论坛:http://bbs.yiwowang.com 63楼的代码可以用,最好在hexchar2bin 里把' replace掉 财付通数字证书签名验证涉及到TFL.cert.Base64Encode(QQCertCtrl, md5(TFL.cert.Base64Encode(QQCertCtrl,sSeq+sSrc)).toUpperCase()) 这个Base64和MD5是我们普通的吗,加密出来是这个样子AAAAAAPrOrGt/zzZYaiENgs36VmvGiziOM42Babcfu0Ab g8RCfkB1VDbQ31IvAD9QyJmrGQMMzC6YDcR6/ALx/iRczMj3tN5XJJKMXiRuG7saj6N0trBIFfOjJurwpN4UnhDoD83XJVpAXCdKYzm/xKkTLvz8Cs0IYVkyJk3kq7WhN3KpEgSw== 为什么在登陆的一直出现ptuiCB('4','3','','0','登录失败,请重试!*');求解 感谢75楼的兄弟. 这个问题纠结了我好久.. 我之前的状态是需要输入验证码能正常登录.不需要难码就提示网络异常... 之前也调试看过cookie的作用域. 输验证码之后是两个域名... 但没想到竟然真的这个原因..... 用C#写数据库查询的代码 UDP 如何发送大量的数据?如何处理分包? 高手请进 关于编码转换 高手求救!!!!! ascx文件中图片不显示? vs2005 下 c# 如何引入你想要的类 请教一下, 如何自动跳转新发布的主题? 请问有没有办法筛选出同一目录下重复的图片? Visual C#中如何连接SQL数据库 特征与反射到底有什么用? 如何在xml文件中显示十六进制? KeyPress、KeyDown、KeyUp之间的区别???? Timer和线程的问题
string str1="";
for (int i = 0; i < sPassword.Length; i = i + 2) {
str1 += Convert.ToChar(Convert.ToInt32(sPassword.Substring(i, 2),16));
}
return str1;
}返回码即这个网址获取的第三个值 http://check.ptlogin2.qq.com/check?uin=8888880&appid=15004501&r=上面没有绝对的解决问题,,因为JS的MD5,和C#的MD5加“16进制返回码”产生了不一样的结果,,希望有高手能解决一下,本人在研究中。。(加普通码则是一样的)
\x00\x00\x00\x00\x00\x87\xa2\x30
这种的16进制返回码 吗?
[email protected]
搞定也发我一份吧[email protected]感谢大神```
是因为编码问题,我JAVA是这样解决的。 我觉得C#应该也是这样的。 你去试试。 要么等我下班后,我来试。
C#我也试过各种编码方式还是不一样啊
var H = hexchar2bin(md5(D));
var F = md5(H + pt.uin);
var C = md5(F + G.verifycode.value.toUpperCase());
A += C好像把QQ号也一起加密了一下啊
為什麼我用你這個計算出來的值跟原版JS裏hexchar2bin算出來的不一樣?我把兩個亂碼結果MD5後值是不同的(沒加上pt.uin)
public static String hexchar2bin(String str)
{
String s = "";
for (var i = 0; i < str.Length; i = i + 2)
{
s += "\\x" + str.Substring(i, 2);
}
return s;
}
试试这个`
在WinForm 中 借用WebBrowser控件 , WebBrowser.Document.InvokeScript 可以调用js.
http://www.cnblogs.com/08shiyan/archive/2011/04/22/2023861.html
Asp.NET 就不用说了吧...
public static string EncyptMD5_3_16(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
byte[] buffer = mD.ComputeHash(bytes);
byte[] buffer2 = mD.ComputeHash(buffer);
byte[] array = mD.ComputeHash(buffer2);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString().ToUpper();
}
public static string smethod_0(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
byte[] array = mD.ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString().ToUpper();
}
public static byte[] EncyptMD5Bytes(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
return mD.ComputeHash(bytes);
}
public static string smethod_1(byte[] s)
{
MD5 mD = MD5.Create();
byte[] array = mD.ComputeHash(s);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString().ToUpper();
}
public static string EncryptQQWebMd5(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
byte[] array = mD.ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append("\\x");
stringBuilder.Append(b.ToString("x2"));
}
return stringBuilder.ToString();
}
public static string EncryptOld(string password, string verifyCode)
{
return QQMd5.smethod_0(QQMd5.EncyptMD5_3_16(password) + verifyCode.ToUpper());
}
public static string Encrypt(string qq, string password, string verifyCode)
{
return QQMd5.Encrypt((long)Convert.ToInt32(qq), password, verifyCode);
}
public static string Encrypt(long qq, string password, string verifyCode)
{
ByteBuffer byteBuffer = new ByteBuffer();
byteBuffer.Put(QQMd5.EncyptMD5Bytes(password));
byteBuffer.PutInt(0);
byteBuffer.PutInt((uint)qq);
QQMd5.EncryptQQWebMd5(password);
byte[] s = byteBuffer.ToByteArray();
string str = QQMd5.smethod_1(s);
return QQMd5.smethod_0(str + verifyCode.ToUpper());
}
全新QQ算法
有问题可以到我的BOLG http://fz24z.5d6d.net/bbs.php
我还以为是C#的,原来是JAVA的。。
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
byte[] array = mD.ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append("\\x");
stringBuilder.Append(b.ToString("x2"));
}
return stringBuilder.ToString();
}这个是?
c# ByteBuffer 有这个?? 在哪的
我也是百度到的。虽然是JAVA的东西。C#也给实现了c# byteBuffer 类。 byteBuffer.Put(QQMd5.EncyptMD5Bytes(password));
byteBuffer.PutInt(0);
byteBuffer.PutInt((uint)qq);这个地方要改成: byteBuffer.PushByteArray(EncyptMD5Bytes(password));
byteBuffer.PushInt(0);
byteBuffer.PushInt((uint)qq);
public static string Encrypt(long qq, string password, string verifyCode)qq就是QQ号码
public class ByteBuffer
{
private byte[] byte_0;
public Stream BaseStream;
public ByteBuffer()
{
this.BaseStream = new MemoryStream();
this.byte_0 = new byte[16];
}
public virtual long Seek(int offset, SeekOrigin origin)
{
return this.BaseStream.Seek((long)offset, origin);
}
public bool Peek()
{
return this.BaseStream.Position < this.BaseStream.Length;
}
public byte[] ToByteArray()
{
//long position = this.BaseStream.Position;
//this.BaseStream.Position = 0L;
//byte[] array = new byte[(int)((object)((IntPtr)this.BaseStream.Length))];
//this.BaseStream.Read(array, 0, array.Length);
//this.BaseStream.Position = position;
//return array; long position = this.BaseStream.Position;
this.BaseStream.Position = 0L;
byte[] buffer = new byte[this.BaseStream.Length];
this.BaseStream.Read(buffer, 0, buffer.Length);
this.BaseStream.Position = position;
return buffer; }
public void Put(bool value)
{
this.byte_0[0] = value ? ((byte)1) : ((byte)0);
this.BaseStream.Write(this.byte_0, 0, 1); }
public void Put(byte value)
{
this.BaseStream.WriteByte(value);
}
public void Put(byte[] value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
this.BaseStream.Write(value, 0, value.Length);
}
public void PutInt(int value)
{
this.PutInt((uint)value);
}
public void PutInt(uint value)
{
this.byte_0[0] = (byte)(value >> 24);
this.byte_0[1] = (byte)(value >> 16);
this.byte_0[2] = (byte)(value >> 8);
this.byte_0[3] = (byte)value;
this.BaseStream.Write(this.byte_0, 0, 4);
}
public void PutInt(int index, uint value)
{
int offset = (int)this.BaseStream.Position;
this.Seek(index, SeekOrigin.Begin);
this.PutInt(value);
this.Seek(offset, SeekOrigin.Begin);
}
public byte Get()
{
return (byte)this.BaseStream.ReadByte();
}
}
GET /login?u=qq号码&p=密码加密&verifycode=验证码&aid=17000101&u1=http%3A%2F%2Fmember.paipai.com%2Fcgi-bin%2Fptlogin%3Floginfrom%3D18&h=1&ptredirect=0&ptlang=2052&from_ui=1&dumy=&fp=loginerroralert&action=11-27-2288669&mibao_css=&t=5&g=1
最后的action和时间、cookies有关,t和验证码有关,mibao_css和登录平台有关。action参数不设置,或者设置错误,提示:"ptuiCB('24','0','','0','很遗憾,网络连接出现异常,请您检查是否禁用cookies。(3612345232)', 'qq号码');\r\n"。
请大牛解答下
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;namespace xfqz86Helper
{
public static class Hash
{
public static byte[] MD5(byte[] data)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] hash_byte = md5.ComputeHash(data);
return hash_byte;
}
public static string MD5(byte[] data, bool Upper)
{ return BinToHex(MD5(data), Upper); }
public static byte[] MD5(string str, Encoding encoding)
{ return MD5(StrToBin(str, encoding)); }
public static string MD5(string str, Encoding encoding, bool Upper)
{ return MD5(StrToBin(str, encoding), Upper); } public static string BinToHex(byte[] buffer, bool Upper)
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < buffer.Length; i++) builder.Append(buffer[i].ToString("x2"));
if (Upper) return builder.ToString().ToUpper();
else return builder.ToString().ToLower();
}
public static byte[] StrToBin(string Str, Encoding encoding)
{
if (encoding == null) encoding = Encoding.Default;
return encoding.GetBytes(Str);
}
public static byte[] BinArraySum(byte[] buffer1, byte[] buffer2)
{
if (buffer1 == null) buffer1 = new byte[0];
if (buffer2 == null) buffer2 = new byte[0];
byte[] AllBin = new byte[buffer1.Length + buffer2.Length];
int NowIndex = 0;
foreach (Byte TempByte in buffer1) AllBin[NowIndex++] = TempByte;
foreach (Byte TempByte in buffer2) AllBin[NowIndex++] = TempByte;
return AllBin;
} public static string QQPasswordHash(string password, string verifycode, byte[] uin)
{ return MD5(MD5(BinArraySum(MD5(password, Encoding.UTF8), uin), true) + verifycode.ToUpper(), Encoding.UTF8, true); }
}
}其中的uin是从http://check.ptlogin2.qq.com/check?uin={QQ号码}&appid=1003903&r={随机数}取得
返回数据:ptui_checkVC('0','!NUU','\x00\x00\x00\x00\x00\x87\xa2\x30');
说明:
蓝色部分为验证码。有返回则可以直接使用该验证码登陆,如不返回验证码就需要手动输入。
红色部分为uin,请自行分割成byte[]型数据。
p = 加密密码
verifycode = 验证码
aid = 应用ID
u1 = 来路
h = ?具体效果未知,可固定为1。
ptredirect = 重定向?具体效果未知,可固定为0。
ptlang = 界面语言
from_ui = ?具体效果未知,可固定为1。
dumy = ?具体效果未知,可固定为空。
fp = ?具体效果未知,可固定为loginerroralert。
action = 登陆时操作记录。11-27-2288669样式。第一个数字为登录时输入框获取焦点次数,输入框包括用户名、密码、验证码。第二个为登录时按键按下次数。第三个为登录时填写表单所耗费时间,毫秒计数。
mibao_css = 密保样式
t = ?具体效果未知。
g = ?具体效果未知,可固定为1。提示"ptuiCB('24','0','','0','很遗憾,网络连接出现异常,请您检查是否禁用cookies。(3612345232)', 'qq号码');\r\n"消息是因为登录时的Cookies作用域有问题。默认网页登录时js会转换Cookies作用域名为“.qq.com”。
而软件登陆时不会。所以要用代码把Cookies作用于转换成“.qq.com”具体代码如下:CookieCollection Cookies = CookieContainer.GetCookies(new Uri("http://www.ptlogin2.qq.com/"));
foreach (Cookie TempCookie in Cookies)
{
TempCookie.Domain = ".qq.com";
CookieContainer.Add(TempCookie);
}其中CookieContainer为HttpWebRequest接收Cookies所用的对象。
这个怎么把 uin 转换为byte[]?
uin从http://check.ptlogin2.qq.com/check?uin={QQ号码}&appid={应用ID}&r={随机数}取得
返回数据: ptui_checkVC('0','!NUU','\x00\x00\x00\x00\x00\x87\xa2\x30'); 蓝色部分则为uin的js十六进制字串形式。用以下代码解析成byte[]型 String UinStr = '返回的uin js十六进制字串';
String[] UinSplit = UinStr.Split(new String[] { @"\x" }, StringSplitOptions.RemoveEmptyEntries);
uin = new byte[UinSplit.Length];
for (int index = 0; index < UinSplit.Length; index++) uin[index] = Convert.ToByte(UinSplit[index], 16);
登陆成功后可以做很多事情,我做了个农场辅助,全部开源,大家可以参考
易我论坛:http://bbs.yiwowang.com