青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

逆向思路:破解飛秋群聊協議

題外

飛秋是一款局域網內的IM軟件,界面類似QQ,實現上與飛鴿(IP message)有點淵源,免費,不開源。

公司大概兩年前開始使用這款軟件作為員工之間辦公吹牛的工具。最近游戲玩得少,就想徹底換到linux下,

組內也有其他兩人是llinux-er,不過悲劇的是換到linux下就無法收取飛秋群里的聊天信息了,不免寂寞。

所以,就想寫個協議兼容的程序(或者說改個東西)來收取群信息。

 

準備

我本身并不擅長逆向工程,破解什么的純碎業余。在GOOGLE/BAIDU之后發現并沒有前人留下的成果。

使用抓包程序,以及綜合網絡上的信息,還是可以得出不少有用的信息:

# 飛秋兼容了飛鴿的協議,其協議格式基本上基于文本形式,各個內容之間使用冒號作為分隔,例如:

1:100:user:pcname:32:message_body

# 飛秋在私聊情況下的消息內容是沒有加密的,但群聊信息加密了,解密這個內容也是我的目標所在

# 在抓包軟件下根據消息的目標IP地址可以推斷飛秋發送群信息是基于UDP組播的,即就算你不是這個群

   的成員,也會收到群消息

有用的文章: 《局域網內實現飛鴿欺騙》、《飛鴿傳書數據加密分析》(個人感覺沒有任何實質內容,而

且飛鴿傳書并不是飛秋,屬于誤導性文章,但是依然有用)。最重要的,稍微瀏覽IP message的代碼,

以及linux下的iptux(另一個兼容飛鴿的局域網IM)代碼,都是對接下來的破解有益的。

 

破解

我希望我提供更多的,是一種crack的思路,雖然我不是一個cracker。破解和寫程序不太一樣,它需要

更多的耐心、運氣、程序之外的思考。如前所做的準備,尤其重要。

工具及環境:飛秋2.4版本、OllyDbg,為了方便接收群信息,最好有兩臺電腦。

 

STEP 1 找入手點

在開始面對一大推匯編代碼時,我們需要一個最接近目標的點。獲取這個點根據目標的不同而不同。例如,

這里主要是針對網絡數據的解密。所以,最直接的就是去找這些網絡數據。當然,根據具體程序的表現,也

可以從其他點入手,例如飛秋收到群消息后會在任務欄閃爍圖標,也可以從這個功能逆向過去。

 

因為飛秋使用UDP協議,所以我們可以在recvfrom函數下斷點(bp recvfrom)。因為接收UDP包的接口

可能還有WSARecvFrom,甚至winsock1.0中的recvfrom,所以最好都下斷點。另一臺機器發送群消息,

程序在winsock1.0里的recvfrom斷下來:

71A43001 >  8BFF            mov     edi, edi
71A43003    55              push    ebp
71A43004    8BEC            mov     ebp, esp
71A43006    51              push    ecx

這個不是我們需要的,我們需要根據這個點獲得用戶層代碼,這將是整個破解過程的起點。所以,OD中

ALT+K查看調用堆棧,然后跳到調用recvfrom的函數處:

00490890  /$  56            push    esi                              ;  接收數據的函數入口
00490891  |.  8B7424 08     mov     esi, dword ptr [esp+8]
00490895  |.  8D46 10       lea     eax, dword ptr [esi+10]
00490898  |.  50            push    eax                              ; /pFromLen
00490899  |.  56            push    esi                              ; |pFrom
0049089A  |.  C700 10000000 mov     dword ptr [eax], 10              ; |
004908A0  |.  8B09          mov     ecx, dword ptr [ecx]             ; |
004908A2  |.  6A 00         push    0                                ; |Flags = 0
004908A4  |.  8D46 18       lea     eax, dword ptr [esi+18]          ; |
004908A7  |.  68 FF3F0000   push    3FFF                             ; |BufSize = 3FFF (16383.)
004908AC  |.  50            push    eax                              ; |Buffer
004908AD  |.  51            push    ecx                              ; |Socket
004908AE  |.  E8 C7F30C00   call    <jmp.&WSOCK32.#17>               ; \recvfrom

邪惡的OD已經將調用recvfrom時傳入參數的指令標記出來了。中文注釋是我分析時加的。recvfrom里傳入

的接收緩存,是我們應該關注的。如果能跟進這個緩存,假設程序的流程比較簡單:接收了數據,然后在某個

地方直接解密,不管它的加密方式是什么,只要能找到這個緩存數據從加密變為解密的地方,對于整個破解而言,

都算是邁進了一大步。

于是,在00490890(上面找到的函數入口)下斷點,準備跟進接收緩存。注意:在OD里調試跟在vc里不一樣,

跳到調用堆棧里的某個函數,寄存器依然是當前的值。所以需要重新跟。

 

STEP 2 內存斷點

F9讓程序繼續運行,再次在另一臺機器上發送群消息。這回程序在00490890處斷下,然后跟接收緩存:

004908AC  |.  50            push    eax                              ; |Buffer = 0011F4CC
004908AD  |.  51            push    ecx                              ; |Socket
004908AE  |.  E8 C7F30C00   call    <jmp.&WSOCK32.#17>               ; \recvfrom

接收緩存Buffer的值為0011F4CC,如前所述,我們要跟進這個地址指向的內存的變化情況。F8單步運行到

recvfrom后,也就是接收了網絡數據后,查看內存內容

(d 0011F4CC):

0011F4CC  31 5F 6C 62 74 34 5F 30 23 31 32 38 23 38 38 41  1_lbt4_0#128#88A
0011F4DC  45 31 44 44 34 36 36 46 44 23 30 23 30 23 37 32  E1DD466FD#0#0#72
0011F4EC  3A 31 32 39 35 37 32 31 32 31 33 3A 41 64 6D 69  :1295721213:Admi
0011F4FC  6E 69 73 74 72 61 74 6F 72 3A 50 43 2D 32 30 31  nistrator:PC-201
0011F50C  30 31 31 30 34 32 30 30 35 3A 34 31 39 34 33 33  011042005:419433
0011F51C  39 3A 5E 3B 83 A1 14 6D A4 D2 E3 D8 E8 AB B1 3A  9:^;儭mひ闔璜?
0011F52C  5B BC C2 FE E9 DA CB DD 00 BC 59 FC 9D A7 D7 91  [悸謁?糦鼭ё

內容開頭正是飛秋的協議頭,未加密,不過沒多大用。根據之前獲取的飛秋協議,可知,在0011F51E

處就是聊天內容的密文。

很自然地,為了監視這段內存的變化情況,在該位置下內存訪問斷點(右擊數據區即可看到下斷點的選項)。

F9繼續走,然后馬上斷下來:

0049010F  |.  F3:A5         rep     movs dword ptr es:[edi], dword ptr [>
00490111  |.  8B4A 04       mov     ecx, dword ptr [edx+4]
00490114  |.  C74424 24 000>mov     dword ptr [esp+24], 0
0049011C  |.  894D 64       mov     dword ptr [ebp+64], ecx
0049011F  |.  33C9          xor     ecx, ecx

程序到了一個陌生的環境(在這種滿世界都是匯編代碼的情況下,幾乎一不小心就會迷失其中),看了下

附近的代碼,沒什么可疑。通過下內存訪問斷點的思路,似乎顯得荊棘叢生。

 

STEP 3 靠近目標

不妨冷靜下來思考,如果沒有直接的路,我們可能需要悲慘地大海撈針。在寫一個網絡程序時,網絡底層

收到數據包,無非要么直接進行邏輯處理,要么緩存到一個邏輯處理隊列里稍后處理。后者雖然對于程序員

而言是個好方法,但是因為跨了線程,又涉及到隊列緩存,對于逆向而言,絕對是悲劇。

 

但是如果使用了前者呢?對于一個網絡客戶端程序而言,也許直接進行邏輯處理才是最KISS的方法。(這種猜測

的破解方式,絕對需要運氣。)所以,如果是直接進行處理,那么在接收到網絡數據附近,必然就有解密函數。

所以,不妨順著收包函數附近隨意瀏覽一番。(但不要走進太深的call,不然又迷失了。)

0048FE10  /$  B8 18400000   mov     eax, 4018                          
0048FE15  |.  E8 560A0C00   call    00550870
0048FE1A  |.  8D4424 00     lea     eax, dword ptr [esp]
0048FE1E  |.  56            push    esi
0048FE1F  |.  8BF1          mov     esi, ecx
0048FE21  |.  50            push    eax
0048FE22  |.  E8 690A0000   call    00490890                             ;  接收網絡數據

0048FE10函數調用了剛才發現的收包函數。這個函數在收完數據后,不久就調用了另一個函數:

0048FE3F  |.  51            push    ecx
0048FE40  |.  52            push    edx
0048FE41  |.  8BCE          mov     ecx, esi
0048FE43  |.  E8 88020000   call    004900D0                             ;  似乎很可疑?

進到004900D0函數,發現這個函數真TMD巨大。隨意瀏覽之,發現OD有這種提示:

00490178  |.  68 34FD5E00   push    005EFD34                             ;  ASCII "_lbt"
0049017D  |.  8D4C24 14     lea     ecx, dword ptr [esp+14]
00490181  |.  89BC24 544000>mov     dword ptr [esp+4054], edi

_lbt,恩,消息頭里有這個字符串標識。估計是在做些消息頭的邏輯操作。這個函數太長,里面還有若干call,

可謂頭大。所以說,代碼寫得丑,可讀性差,對于防破解還是頗有益處的。跳回到0048FE43,發現當前

函數基本完了。

 

于是往上看,來到調用這個函數的地方:

0050F647  |.  E8 C407F8FF   call    0048FE10
0050F64C  |.  BF 01000000   mov     edi, 1

回顧下,我們有函數A接收網絡數據,有函數B調用A,現在回到了C,來到了調用B的地方0050F647。C函數

也很巨大,直接往下瀏覽,會發現一些switch語句:

0050F71A  |.  81E6 FF000000 and     esi, 0FF
0050F720  |.  8D46 FF       lea     eax, dword ptr [esi-1]               ;  Switch (cases 1..D3)
0050F723  |.  3D D2000000   cmp     eax, 0D2
0050F728  |.  0F87 8C000000 ja      0050F7BA
0050F72E  |.  33C9          xor     ecx, ecx
0050F730  |.  8A88 60315100 mov     cl, byte ptr [eax+513160]
0050F736  |.  FF248D 403051>jmp     dword ptr [ecx*4+513040]
0050F73D  |>  8D9424 F40000>lea     edx, dword ptr [esp+F4]              ;  Case 1 of switch 0050F720

往后瀏覽下這個switch…case,發現非常之大,這個函數也因此非常巨大。不妨猜測這個是根據不同消息做不同

邏輯處理的地方。這個想法正是給予我們靈感的關鍵。

 

群聊消息必然也有個類型,通過之前OD獲取到的網絡數據(或者截取網絡封包所得),群聊消息的類型為:4194339

(16進制400023H),去掉高位,也就是23H。仔細地對比每一個case,果然發現了一段處理代碼:

00512787  |> \39AC24 640100>cmp     dword ptr [esp+164], ebp             ;  Case 23 of switch 0050F720
0051278E  |.  75 07         jnz     short 00512797                       ;  群聊天處理
00512790  |.  8BC7          mov     eax, edi
00512792  |.  E9 8C080000   jmp     00513023

這個代碼之下的處理也有不少代碼。在不涉及到更多細節之前,我們可以大膽地將注意力放在接下來的call上。從這個case

往下,第一個call為:

005127E6  |.  50            push    eax
005127E7  |.  E8 A4A20000   call    0051CA90                             ;  非??梢?br>005127EC  |.  B8 01000000   mov     eax, 1
005127F1  |.  E9 2D080000   jmp     00513023

 

STEP 4 多嘗試

有懷疑,就用事實來證明。果斷地在005127E6處下斷點。然后發群消息,程序斷下來。因為這個函數壓入了

eax作為參數,且對ecx做了賦值:

005127E4  |.  8BCB          mov     ecx, ebx
005127E6  |.  50            push    eax
005127E7  |.  E8 A4A20000   call    0051CA90                             ;  非??梢?

在調用一個函數前對ecx做賦值,一般都是C++成員函數調用。eax作為一個參數,非常值得關注,果斷查看eax

指向的內存值:

001235C8  41 64 6D 69 6E 69 73 74 72 61 74 6F 72 00 6D 00  Administrator.m.
001235D8  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
001235E8  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
001235F8  00 00 50 43 2D 32 30 31 30 31 31 30 34 32 30 30  ..PC-20101104200
00123608  35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  5...............
00123618  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00123628  8A 7B 00 00 C0 A8 00 03 09 79 00 00 01 00 00 00  妠..括..y.....
00123638  04 00 00 00 00 00 00 00 80 00 00 00 38 38 41 45  .......€...88AE
00123648  31 44 44 34 36 36 46 44 00 00 00 00 00 00 00 00  1DD466FD........
00123658  00 00 00 00 F4 C7 23 00 FD 22 3B 4D 23 00 40 00  ....羥#.?;M#.@.
00123668  49 00 00 00 36 00 00 00 5E 3B 83 A1 14 6D A4 D2  I...6...^;儭mひ

有用戶名、機器名、發送者MAC地址,這么多可疑信息。完全可以猜測,eax傳入的是一個結構體地址,

當然對象地址也可以,反正是個復雜數據結構。更重要的,在這塊內存往下不遠處,果斷地發現了從

網絡接收到的加密的聊天內容:

00123670  5E 3B 83 A1 14 6D A4 D2 E3 D8 E8 AB B1 3A 5B BC  ^;儭mひ闔璜?[
00123680  C2 FE E9 DA CB DD 00 BC 59 FC 9D A7 D7 91 CF 5A  漫櫞溯.糦鼭ё懴Z

F8直接步過0051CA90函數。任務欄開始出現閃爍的圖標(雖然沒有閃),上面的內存數據變了:

00123670  74 65 73 74 7B 2F 66 6F 6E 74 3B 2D 31 34 20 30  test{/font;-14 0
00123680  20 30 20 30 20 34 30 30 20 30 20 30 20 30 20 31   0 0 400 0 0 0 1
00123690  33 34 20 33 20 32 20 31 20 32 20 CB CE CC E5 20  34 3 2 1 2 宋體

test正是我發的內容。

 

STEP 5 縮小范圍

實際上走到這里,憑借運氣和程序編寫的常識,已經找到關鍵點。不過看來0051CA90這個函數做的事情

有點多,除了解密內容似乎還有UI上的一些處理(例如那個閃爍的任務欄圖標)。所以,我們要做的是,進一步

跟進,找到關鍵點。

 

現在縮小范圍要容易得多,因為我們得到了一個會變化的內存地址:00123670。只需要F8一步一步地

運行代碼,一旦發現內存內容改變,則可以進一步進如,從而找到關鍵call。具體過程我就不給了,大概為:

0051CB02  |.  52            push    edx
0051CB03  |.  68 00400000   push    4000
0051CB08  |.  56            push    esi
0051CB09  |.  50            push    eax
0051CB0A  |.  56            push    esi
0051CB0B  |.  E8 F041F7FF   call    00490D00                             ; 跟進

 

00490DB0  |.  6A 00         push    0
00490DB2  |.  83E1 03       and     ecx, 3
00490DB5  |.  6A 22         push    22
00490DB7  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr [es>
00490DB9  |.  8BBC24 344000>mov     edi, dword ptr [esp+4034]
00490DC0  |.  50            push    eax                                  ;  數據長度
00490DC1  |.  8D4424 20     lea     eax, dword ptr [esp+20]
00490DC5  |.  57            push    edi                                  ;  輸出緩存
00490DC6  |.  50            push    eax                                  ;  輸入緩存(加密內容)
00490DC7  |.  8D4C24 20     lea     ecx, dword ptr [esp+20]
00490DCB  |.  E8 5049F7FF   call    00405720                             ;  最終解密函數

 

00405720函數內的實現基本上全是數據操作指令。加解密算法無非就是搗鼓這些數據,所以當我進到

00405720函數時,基本上可以斷定它就是最終的解密函數。

 

STEP 6 解密

事實上我們并不需要去弄懂它的具體解密算法,就算是直接的C++代碼,沒有算法論文的話也很難看懂,更何況

是這里的匯編。最直接的方式,就是查看這個解密函數對外界的依賴情況,例如需要的參數,this里是否有依賴

的數據。在了解了這些情況后,大可以將這段匯編復制出來直接作為C++內嵌匯編代碼使用。

 

不過,這里我想到了更簡單的方式。因為我注意到飛秋和飛鴿在實現上有著不解之緣,而且我琢磨著作者也不會

為了一個加解密不太重要的應用場合而去整些高深的算法。我想到,飛秋也許會直接使用飛鴿里的加解密代碼!

 

在IP message的源碼里,有blowfish加密算法的實現,我們來看接口:

class CBlowFish
{
private:
    DWORD    *PArray;
    DWORD    (*SBoxes)[256];
    void    Blowfish_encipher(DWORD *xl, DWORD *xr);
    void    Blowfish_decipher(DWORD *xl, DWORD *xr);

public:
            CBlowFish(const BYTE *key=NULL, int keybytes=0);
            ~CBlowFish();
    void    Initialize(const BYTE *key, int keybytes);
    DWORD    GetOutputLength(DWORD lInputLong, int mode);
    DWORD    Encrypt(const BYTE *pInput, BYTE *pOutput, DWORD lSize, int mode=BF_CBC|BF_PKCS5, _int64 IV=0);
    DWORD    Decrypt(const BYTE *pInput, BYTE *pOutput, DWORD lSize, int mode=BF_CBC|BF_PKCS5, _int64 IV=0);
};

從接口實現來說算是簡潔漂亮友好和諧。我也用Decrypt這個函數的參數比對了上面沒找到的那個call(00405720),

因為這里只是懷疑這個call就是這里的Decrypt,但并沒有確切的證據。不過,對比下他們的參數就可以非常肯定了:

00490DB0  |.  6A 00         push    0           ;參數IV
00490DB2  |.  83E1 03       and     ecx, 3
00490DB5  |.  6A 22         push    22        ;參數mode
00490DB7  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr [es>
00490DB9  |.  8BBC24 344000>mov     edi, dword ptr [esp+4034]
00490DC0  |.  50            push    eax                                  ; 參數 數據長度
00490DC1  |.  8D4424 20     lea     eax, dword ptr [esp+20]
00490DC5  |.  57            push    edi                                  ;  參數輸出緩存
00490DC6  |.  50            push    eax                                  ; 參數輸入緩存(加密內容)
00490DC7  |.  8D4C24 20     lea     ecx, dword ptr [esp+20]
00490DCB  |.  E8 5049F7FF   call    00405720                             ;  最終解密函數

最重要的,是參數mode。Decrypt默認參數mode是BF_CBC|BF_PKCS5的位組合,結果,恰好為22!

所以,基本上可以斷定:飛秋的加解密實現,就是使用了IP message的blowfish算法:blowfish.cpp/h/h2。

 

STEP 7 密鑰

查看CBlowFish的使用,在解密前需要初始化,大概就是傳入密鑰之類。如果我們上面的猜測沒有錯,那么我們

從網絡上取得的數據,然后取得密鑰,直接使用blowfish的源碼,就可以解密出消息內容。

 

接下來的關鍵就是,找到這個密鑰。關于這個密鑰,之前在飛秋的配置文件FeiqCfg.xml里繞了很久的圈子,因為

發現加入一個群的時候,這個文件里就會多出一項很長的16進制字符串。也一度猜測密鑰就是保存在這個字符串的

某個偏移里。接下來會讓人大跌眼鏡。

 

因為CBlowFish這個類確實簡單,使用它的最簡單方式就是直接創建局部對象,然后傳入key和keysize,即可完成

初始化。在之前展示的思路里,我也一度先去嘗試最簡單的方法。對于C++局部對象的創建,有個顯著特征就是

mov ecx, dword ptr [esp+xxx],也就是往ecx里寫入一個棧地址。而且可以肯定的是,這個構造代碼,必然發生

于call 00405720前面不遠處,往上跟進:

00490D3F  |> \8B8C24 304000>mov     ecx, dword ptr [esp+4030]
00490D46  |>  51            push    ecx                                  
00490D47  |.  52            push    edx                                  
00490D48  |.  8D4C24 0C     lea     ecx, dword ptr [esp+C]
00490D4C  |.  E8 3F3DF7FF   call    00404A90                             

一個壓入兩個參數的函數調用,對比CBlowFish的構造函數,剛好是2個參數。跟進00404A90:

 

00404A90  /$  56            push    esi
00404A91  |.  8BF1          mov     esi, ecx
00404A93  |.  6A 48         push    48
00404A95  |.  E8 69301600   call    00567B03
00404A9A  |.  68 00100000   push    1000
00404A9F  |.  8906          mov     dword ptr [esi], eax
00404AA1  |.  E8 5D301600   call    00567B03

 

又是可愛的立即數!48H、1000H,這種特別的立即數總能讓人安心,對比CBlowFish構造函數實現:

CBlowFish::CBlowFish (const BYTE *key, int keybytes)
{
    PArray = new DWORD [NPASS + 2];//NPASS=16
    SBoxes = new DWORD [4][256];

    if (key)
        Initialize(key, keybytes);
}

sizeof(DWORD)*18=48H,sizeof(DWORD)*4*256=1000H!這么極具喜劇意義的匯編C++代碼映射,

基本可以肯定,00404AA1處,正是構造CBlowFish對象的地方,而構造的參數,正是我們魂牽夢縈的解密密鑰:

 

00490D46  |> \51            push    ecx                                  ;  key長度
00490D47  |.  52            push    edx                                  ;  密鑰key
00490D48  |.  8D4C24 0C     lea     ecx, dword ptr [esp+C]
00490D4C  |.  E8 3F3DF7FF   call    00404A90                             ;  構造blowfish對象

 

在此處下斷點,發送群消息,程序斷下來,看看密鑰究竟是什么。如果它確實是FeiqCfg.xml里的某個值,

那么我們還要進一步跟這個值具體在哪個配置項里。看看吧,密鑰edx:

 

edx=00123644, (ASCII "88AE1DD466FD")

 

 

TM的密鑰居然是發送者的MAC地址!當我看到這個的時候我幾乎快摔倒地上。如果飛秋使用一個MAC地址

作為密鑰,那么這意味著:通過自己寫的程序,可以取得局域網內其他群里的聊天內容!這個實在太邪惡了。

上回抓包的時候,雖然看不到內容,但可以看到美術、策劃在群里聊的無比歡樂。這回有喜感了。

 

STEP END 可略

看看時間,悲劇地發現整篇文章花了接近3個小時才寫完。此刻我正躊躇要不要把代碼發上來,但轉念一想

最后那個STEP的發現實在讓人蛋疼,所以還是算了。打算稍微封裝下,然后使用這份代碼在iptux 上改改包裝

個界面,目的就算達成了。相信瀏覽完整篇文章,寫出自己的代碼不是什么大問題。

 

其實我大可以直接給結論,但是我依然樂于分享過程和思路。一來算是自我總結記錄(每次拿起OD,總是快捷

鍵一路忘);二來也給有心人一個指引。

 

最后,對這種東西還是有必要出個免責聲明:根據本文章所造成的一切后果與文章作者無關。為了不糟蹋我這3個

小時的時間,轉載麻煩注明出處。

PS,最后回顧下結論,其實發現這個解密非常非常簡單。你說如果直接給盧本陶(飛秋作者)發封郵件,他會不

會直接告訴我?

posted on 2011-01-23 21:01 Kevin Lynx 閱讀(25906) 評論(9)  編輯 收藏 引用 所屬分類: c/c++通用編程

評論

# re: 逆向思路:破解飛秋群聊協議[未登錄] 2011-01-24 14:43 dophi

已閱  回復  更多評論   

# re: 逆向思路:破解飛秋群聊協議 2011-01-24 22:03 lin_style

我覺得會,哈哈哈  回復  更多評論   

# re: 逆向思路:破解飛秋群聊協議 2011-01-25 23:28 欲三更

呵呵,我看到文章的開頭就猜飛秋加密用的應該是飛鴿傳書源碼里的某種加密算法,果不其然哈哈^_^  回復  更多評論   

# re: 逆向思路:破解飛秋群聊協議 2011-01-26 18:23 YcdoiT

一個菜鳥大開眼界  回復  更多評論   

# re: 逆向思路:破解飛秋群聊協議[未登錄] 2011-01-27 23:31 微妙的平衡

kl又在做壞事了。  回復  更多評論   

# re: 逆向思路:破解飛秋群聊協議 2011-01-28 16:04 tunpishuang

"代碼寫得丑,可讀性差,對于防破解還是頗有益處的。" 哈哈。太有喜感了。  回復  更多評論   

# re: 逆向思路:破解飛秋群聊協議 2012-09-26 10:54 super5er

看完之后,興奮不已!  回復  更多評論   

# re: 逆向思路:破解飛秋群聊協議 2014-11-18 14:10 FatBean

你好:
請問飛秋群聊消息的發送應該調用什么接口?  回復  更多評論   

# re: 逆向思路:破解飛秋群聊協議 2015-06-30 16:07 primeking

你好,我和你一樣,我用iptux接受不到飛秋群的信息。可是我是個硬件工程師,你可以把你改好的iptux給我一個嗎?277787468@qq.com  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线观看一区| 99视频在线精品国自产拍免费观看| 美女主播一区| 9国产精品视频| 女同性一区二区三区人了人一 | 欧美亚洲网站| 亚洲第一页中文字幕| 国产精品久久久久久亚洲调教| 欧美一区二区视频在线观看2020 | 在线精品视频一区二区三四| 国产精品五区| 国产尤物精品| 精品999久久久| 国产日韩欧美在线看| 久久久久国产精品一区| 欧美一区1区三区3区公司| 在线中文字幕日韩| 日韩一级精品| 99视频精品免费观看| 欧美一区二区高清| 宅男在线国产精品| 欧美中文字幕视频| 欧美顶级艳妇交换群宴| 欧美成人精品在线播放| 国产精品a久久久久| 国产欧美日韩综合一区在线观看| 韩国成人精品a∨在线观看| 伊人婷婷久久| 欧美一区二区三区视频| 欧美大片在线观看一区二区| 欧美aaa级| 亚洲综合导航| 欧美日韩一区三区四区| 国模精品一区二区三区色天香| 亚洲国产第一页| 欧美一进一出视频| 亚洲天堂成人在线视频| 欧美激情精品久久久久久大尺度 | 亚洲欧美日韩另类| 亚洲毛片在线看| 欧美日韩一卡| 一区二区成人精品| 91久久综合亚洲鲁鲁五月天| 亚洲日本视频| 欧美精品亚洲精品| 亚洲国产精品久久久久秋霞蜜臀| 午夜亚洲精品| 免费观看一区| 91久久久一线二线三线品牌| 久久国产夜色精品鲁鲁99| 欧美影视一区| 久久影视精品| 国产欧美日韩视频一区二区三区| 国产在线成人| 先锋影音网一区二区| 亚洲国产欧美在线人成| 亚洲欧美日韩在线不卡| 亚洲精品一区在线| 欧美一二三区在线观看| 欧美va亚洲va日韩∨a综合色| 欧美视频福利| 亚洲黄色有码视频| 美脚丝袜一区二区三区在线观看 | 国产一区自拍视频| 亚洲免费网址| 亚洲四色影视在线观看| 国产精品99免费看 | 久久精品国产69国产精品亚洲| 欧美日韩一区二区免费视频| 精品69视频一区二区三区| 欧美亚洲在线播放| 亚洲午夜羞羞片| 欧美三日本三级三级在线播放| 日韩亚洲视频在线| 亚洲免费av网站| 欧美日韩国产91| 亚洲视频在线播放| 亚洲午夜激情网页| 国产精品久久久久久久久久免费 | 国产精品美女黄网| 国内精品嫩模av私拍在线观看| 久久国产精品99精品国产| 羞羞色国产精品| 精品成人国产| 欧美a一区二区| 欧美日韩国产成人高清视频| 亚洲欧美日韩直播| 久久国产精品色婷婷| 91久久一区二区| 亚洲一区二区三区四区中文| 国产日韩精品视频一区二区三区| 久久夜色精品国产亚洲aⅴ| 久久免费视频一区| 午夜亚洲精品| 韩国在线视频一区| 亚洲高清一二三区| 欧美三级网址| 久久综合色8888| 免费日韩成人| 午夜精品理论片| 欧美在线精品免播放器视频| 在线观看成人小视频| 亚洲精品少妇30p| 国产美女精品| 亚洲三级免费观看| 国产欧美一区二区精品性色| 欧美电影打屁股sp| 欧美视频精品在线观看| 欧美大片免费观看在线观看网站推荐| 欧美在线免费视频| 欧美黄色成人网| 1000精品久久久久久久久 | 久久免费少妇高潮久久精品99| 久久久亚洲欧洲日产国码αv| 99视频在线观看一区三区| 午夜精品在线视频| 亚洲一区二区精品| 久久青青草综合| 亚洲一区日本| 蜜臀91精品一区二区三区| 亚洲一区二区三区高清不卡| 久久夜色精品国产噜噜av| 久久精品99国产精品| 欧美裸体一区二区三区| 亚洲国产成人精品久久久国产成人一区| 久久国产精品第一页| 欧美理论大片| 欧美在线免费观看视频| 欧美国产日韩精品免费观看| 午夜久久资源| 欧美日韩精品免费观看视一区二区| 久久久久久久久久久久久久一区| 狼狼综合久久久久综合网| 久久精品视频99| 国产伦精品一区二区三区免费| 中文在线不卡| 亚洲一区二区三区在线视频| 欧美精品成人| 亚洲国内精品在线| 91久久久国产精品| 西西人体一区二区| 在线性视频日韩欧美| 亚洲欧美成人精品| 香蕉久久夜色| 在线亚洲精品| 夜夜嗨av一区二区三区网站四季av| 99一区二区| 亚洲精品少妇30p| 麻豆精品在线视频| 久久久精品国产99久久精品芒果| 国产乱码精品一区二区三区五月婷| 在线亚洲免费| 欧美一二三视频| 国产日韩视频| 亚洲欧美日韩电影| 久久精品日韩欧美| 狠狠v欧美v日韩v亚洲ⅴ| 久久精品一区四区| 免费亚洲一区| 亚洲免费观看视频| 国产精品久久久久毛片软件 | 亚洲色诱最新| 性18欧美另类| 久久精品国产综合| 国产无一区二区| 久久免费高清| 亚洲国产高清自拍| 中文日韩在线视频| 欧美高清视频一区二区三区在线观看| 欧美成人免费播放| 亚洲免费成人av电影| 欧美激情第五页| 亚洲视频精选| 米奇777在线欧美播放| 日韩视频在线播放| 欧美日韩一区二区视频在线观看 | 欧美成人a视频| 麻豆视频一区二区| 一区二区三区日韩欧美精品| 欧美高清视频免费观看| 91久久精品日日躁夜夜躁国产| 亚洲人成网站在线播| 欧美日韩一二三区| 亚洲国产精品免费| 亚洲第一毛片| 欧美性一二三区| 欧美伊久线香蕉线新在线| 欧美sm重口味系列视频在线观看| 久久精品夜色噜噜亚洲a∨| 亚洲国产天堂久久综合| 午夜精品www| 亚洲国产精品一区在线观看不卡 | 亚洲电影激情视频网站| 久久久国际精品| 日韩视频中文| 欧美成ee人免费视频| 亚洲欧美日韩在线一区| 亚洲日本中文字幕免费在线不卡| 欧美午夜激情视频| 欧美国产在线观看|