今年上半年研究出來的,http://www.ywjt.org/index/archives/453.html,一塊兒分享:html
最開始禁用QQ是用iptables的七層補丁,但那個是針對源ip去禁用QQ的特徵碼,如今咱們要作的是想針對QQ號作處理。另外,以前認爲QQ是用udp鏈接服務器的8000端口,而後試着把udp的8000端口禁用,發現和咱們遊戲同樣,發現這個端口不通,會去用另外的備用端口,好比tcp的80和443之類的端口,因此經過禁用端口這是行不通的,並且服務器地址不定。
注意到iptables有個-m string –hex-string 這個匹配方式,有個string模塊,有個抓數據包,而後作drop處理的方式,下面就去抓包。
工具:SmartSniff
QQ號碼:858276842
電腦ip:192.168.3.7
網關:linux iptables nat環境
思路:QQ號碼須要通訊,先獲得QQ號碼的十六進制。
echo 「obase=16;858276842″ | bc
獲得QQ號碼的十六進制332843EA。
linux
下面抓包的時候多注意到33 28 43 EA 這種字符。shell
第一個框是QQ號,第二個和第三個是通過屢次登錄,和登錄不一樣QQ號獲得的「特徵碼」
每次登錄都須要有這個字符,因此試着匹配這個字符,而後drop。看看效果,
服務器
另外有個差別的就是QQ2011的Q+版本特徵碼不同,看下面的截圖65變成了64tcp
針對QQ2011 Q+版本工具
iptables -I RH-Firewall-1-INPUT -s 192.168.3.7/32 -m string –hex-string 「|0000010101000064|」 –algo bm -j DROP測試
QQ2012的時候匹配的是0000010101000065,會出現已經登錄的QQ不會掉線的狀況,可是會出現重複收到好友發送過來的消息,多是由於收到消息以後沒法通知服務器已經收到,因此服務器重複發送好友的消息過來,可是下線以後會沒法上線。
當匹配的是00010101000065,前面少匹配一個00,已經登錄的QQ發現會出現沒法發送消息的狀況。spa
iptables -I RH-Firewall-1-INPUT -s 192.168.3.7/32 -m string –hex-string 「|0000010101000065|」 –algo bm -j DROPhtm
開白名單的時候只須要匹配到那個QQ號,而後ACCEPT處理就能夠了,好比858276842這個QQ號碼,能夠抓包獲得是33 28 43 ea,也能夠經過計算獲得,爲了減少偏差,後面能夠多匹配0200這個後綴。blog
iptables -I RH-Firewall-1-INPUT -s 192.168.3.7/32 -m string –hex-string 「|332843ea0200|」 –algo bm -j ACCEPT
經測試百發百中。
echo 「obase=16; 858276842″ | bc這樣能夠獲得QQ號碼的16進制。固然也有例外的狀況,當十六進制前面有個0的時候,系統默認會把0去掉,咱們能夠作個特殊處理,當是奇數的時候前面自動加0,用的是awk
echo 「obase=16;396162545″|bc | awk -F 「」 ‘{if(NF%2==」0″) {print $0} else {print 「0″$0 }}’
另外能夠經過抓包獲得哪一個ip在登錄哪一個QQ號,具體操做方法是在網關上面抓包。
tcpdump -nn -i eth1 -X ‘host 192.168.3.7′
能夠加個參數 –w file,把結果寫到文件裏面去,好作分析,以後用一樣的方法-r讀取這個文件就能夠了,在文件裏面把十六進制的空格去掉,用sed ‘s/ //g’就能夠了,而後去搜索特徵碼0200,前面的那幾位就是QQ號碼的十六進制了,十六進制轉換十進制能夠用shell的echo命令巧妙地實現:
echo $((16#179CF5F1))
獲得QQ:396162545
因此最終的實行方法是
#容許的QQ先ACCEPT放行,
iptables -I RH-Firewall-1-INPUT -m string –hex-string 「|332843ea0200|」 –algo bm -j ACCEPT
#拒絕全部QQ2012和Q+的登錄
iptables -I RH-Firewall-1-INPUT -m string –hex-string 「|0000010101000065|」 –algo bm -j DROP
iptables -I RH-Firewall-1-INPUT -m string –hex-string 「|0000010101000064|」 –algo bm -j DROP
附作測試時候保存的QQ數據包:
這個是Q+的。
已經作大範圍驗證~ ~