• <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>
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            • 隨筆 - 44
            • 文章 - 0
            • 評論 - 86
            • 引用 - 0

            常用鏈接

            留言簿(6)

            隨筆分類(31)

            隨筆檔案(44)

            Mining

            最新隨筆

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            小覷IE 瀏覽器ActiveX 控件創建過程

            1. Activex 控件是怎么安裝的
            一個HTML 中嵌入控件的例子

            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="400" height="300">
            <param name="movie" value="flash/flash.swf">
            <param name="quality" value="high">
            <embed src="flash/flash.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="400" height="300"></embed>
            </object>

            當用IE 打開這個頁面的時候, IE 首先根據 classid 在注冊表中(HKEY_CLASS_ROOT)查找其安裝信息, 如果未找到, 則IE 根據codebase 去看是否有對應的控件存在; 如果還是不行, 則會一些控件注冊服務器聯系(列表在 HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings\CodeBaseSearchPath 可以找到 ), 一般是 http://activex.microsoft.com/objects/ocget.dll , http://codecs.microsoft.com/isapi/ocget.dll  , 然后服務器會告訴IE 從哪里去下載. 

            FROM : http://oreilly.com/catalog/malmobcode/chapter/ch11.html


            2. ActiveX 控件是如何啟動的
            創建一個控件有很多種方法
            CoCreateInstance, CoGetInstanceFromFile, CoGetInstanceFromIStorage
            CoCreateInstanceEx
            CoGetClassObjectFromURL , CoGetClassObject 
            CoGetObject, DllGetClassObject 等
            基本調用順序好像是
            (CoGetInstanceFromFile, CoGetInstanceFromIStorage ) -> CoCreateInstance
            CoCreateInstanceEx
            CoGetClassObjectFromURL -> CoGetClassObject 
            其他沒有測試過... :9

            IE 創建控件的時候會調用 CoGetClassObjectFromURL -> CoGetClassObject 的順序進行, 而不是直接調用(CoCreateInstance 或者 CoCreateInstanceEx) , 但是免不了控件會自己調用 CoCreateInstanceEx, 比如Real 控件在創建的時候會調用Dx 的組件等.

            posted @ 2008-07-30 19:55 泡泡牛 閱讀(2212) | 評論 (2)編輯 收藏
            獲取IE (控件)的所有鏈接(包括Frameset, iframe)

            IE 頂層 body 節點通過IHTMLElement->get_all 方法無法獲取iframe 里面的節點列表

            CComPtr<IHTMLElement> body;
             
            CComPtr
            <IDispatch> spDispCollection;
            body
            ->get_all(&spDispCollection);

            所以要獲取iframe/frame(frameset) 里面的節點列表的話, 則需要根據body/doc 找到frames, 然后從frames -> IHTMLWindow2 -> IHTMLDocument2 . 主要有2個方法, 下面是代碼片段
            方法一:
            IHTMLDocument2 *pDoc = 瀏覽器的Document(IWebBrowser2->IDispatch->IHTMLDocument2); 
            IHTMLWindow2 
            *pHTMLWnd = NULL; 
            IHTMLDocument2 
            *pFrameDoc=NULL; 
            IHTMLFramesCollection2 
            *pFramesCollection=NULL; 
            LPDISPATCH lpDispatch; 

            long p; 
            VARIANT varindex,varresult; 
            varresult.vt
            =VT_DISPATCH; 
            varindex.vt 
            = VT_I4; 
            if(pDoc!=NULL) 

                HRESULT hr
            =pDoc->get_frames(&pFramesCollection); 
                
            if(SUCCEEDED(hr)&&pFramesCollection!=NULL) 
                { 
                    hr
            =pFramesCollection->get_length(&p); 
                    
            if(SUCCEEDED(hr)) 
                        
            for(int i=0; i<p; i++
                        { 
                            varindex.lVal 
            = i; 
                            
            if(pFramesCollection->item(&varindex, &varresult) ==S_OK) 
                            { 
                                lpDispatch
            =(LPDISPATCH)varresult.ppdispVal; 
                                
            if (SUCCEEDED(lpDispatch->QueryInterface(IID_IHTMLWindow2, (LPVOID *)&pHTMLWnd))) 
                                { 
                                    
            if(SUCCEEDED(pHTMLWnd->get_document( &pFrameDoc))) 
                                    { 
                                        
            //work with the pFrameDoc 
                                    } 
                                    pHTMLWnd
            ->Release(); 
                                    pHTMLWnd
            =NULL; 
                                } 
                            } 
                        } 
                        pFramesCollection
            ->Release(); 
                } 
                pDoc
            ->Release(); 
            }

            方法二:
            CComQIPtr<IHTMLElement> pElem = ; // 可以遞歸上面的 CComPtr<IDispatch> spDispCollection 來得到
            CComBSTR bstrTagName;
            pElem
            ->get_tagName(&bstrTagName);
            if ( lstrcmpiW(L"IFRAME", bstrTagName)==0 ||
                    lstrcmpiW(L
            "FRAME", bstrTagName)==0 )
            {
                CComQIPtr
            <IHTMLFrameBase2>    _framebase2;
                CComPtr
            <IHTMLWindow2>        _framewindow;
                CComPtr
            <IHTMLDocument2>        _framedoc;
                
                
            if( (_framebase2 = spItem) 
                    
            && SUCCEEDED( _framebase2->get_contentWindow(&_framewindow) ) && _framewindow!=NULL 
                    
            && SUCCEEDED( _framewindow->get_document(&_framedoc) ) && _framedoc!=NULL )
                {
                    
            // 對 _framedoc 節點進行處理
                }
            }


            iframe 跨域訪問(cross frame)  zz from : http://codecentrix.blogspot.com/2007/10/when-ihtmlwindow2getdocument-returns.html 
            由于安全性限制, 為防止跨域腳本攻擊, 當frames 跨域的時候, IHTMLWindow2::get_document 調用將返回 E_ACCESSDENIED .
            下面函數 HtmlWindowToHtmlDocument  對于跨域的frame 通過 IHTMLWindow2 -> IID_IWebBrowserApp -> IHTMLWindow2 繞過了限制.

            // Converts a IHTMLWindow2 object to a IHTMLDocument2. Returns NULL in case of failure.
            // It takes into account accessing the DOM across frames loaded from different domains.
            CComQIPtr<IHTMLDocument2> HtmlWindowToHtmlDocument(CComQIPtr<IHTMLWindow2> spWindow)
            {
                 ATLASSERT(spWindow 
            != NULL);

                 CComQIPtr
            <IHTMLDocument2> spDocument;
                 HRESULT hRes 
            = spWindow->get_document(&spDocument);
                
                 
            if ((S_OK == hRes) && (spDocument != NULL))
                 {
                      
            // The html document was properly retrieved.
                      return spDocument;
                 }

                 
            // hRes could be E_ACCESSDENIED that means a security restriction that
                 
            // prevents scripting across frames that loads documents from different internet domains.
                 CComQIPtr<IWebBrowser2>  spBrws = HtmlWindowToHtmlWebBrowser(spWindow);
                 
            if (spBrws == NULL)
                 {
                      
            return CComQIPtr<IHTMLDocument2>();
                 }

                 
            // Get the document object from the IWebBrowser2 object.
                 CComQIPtr<IDispatch> spDisp;
                 hRes 
            = spBrws->get_Document(&spDisp);
                 spDocument 
            = spDisp;

                 
            return spDocument;
            }


            // Converts a IHTMLWindow2 object to a IWebBrowser2. Returns NULL in case of failure.
            CComQIPtr<IWebBrowser2> HtmlWindowToHtmlWebBrowser(CComQIPtr<IHTMLWindow2> spWindow)
            {
                 ATLASSERT(spWindow 
            != NULL);

                 CComQIPtr
            <IServiceProvider>  spServiceProvider = spWindow;
                 
            if (spServiceProvider == NULL)
                 {
                      
            return CComQIPtr<IWebBrowser2>();
                 }

                 CComQIPtr
            <IWebBrowser2> spWebBrws;
                 HRESULT hRes 
            = spServiceProvider->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&spWebBrws);
                 
            if (hRes != S_OK)
                 {
                      
            return CComQIPtr<IWebBrowser2>();
                 }

                 
            return spWebBrws;
            }


            附:
            IE(控件/接口)中主要有4個部分, Browser, Document, Frame/IFrame, Element , 其對應接口分別是
            Browser         -    IWebBrowser2
            Document      -    IHTMLDocument2
            Frame/IFrame-    IHTMLWindow2
            Element         -    IHTMLElement
            可以通過下面方法互相獲取
            browser      -> document        IWebBrowser2::get_Document
            document     -> frame           IHTMLDocument2::get_parentWindow
            frame        -> document        IHTMLWindow2::get_document
            frame        -> parent frame    IHTMLWindow2::get_parent
            frame        -> children frames IHTMLWindow2::get_frames
            element     -> Frame             IHTMLElement->QI(IHTMLFrameBase2) -> IHTMLFrameBase2->get_contentWindow -> IHTMLWindow2

            ref:
            在多Frame的網頁中怎么取出各個Frame的IHTMLDocument2的接口!急用.(高分)
            在文章 When IHTMLWindow2::get_document returns E_ACCESSDENIED 解決了iframe 跨域訪問的問題

            posted @ 2008-07-30 19:17 泡泡牛 閱讀(7213) | 評論 (3)編輯 收藏
            Apache 安裝在只讀分區上的配置

            有時候Apache 程序安裝在NFS ,SAMBA, Windows 的共享盤上, 而且可能是只讀, 所以需要修改一些配置. 主要有:
            # apache 運行時所依賴文件
            LockFile /path/to/apache-rproxy.lock
            # apache 運行時會修改的相關文件
            PidFile /path/to/apache-rproxy.pid
            ErrorLog /path/to/apache-rproxy.elog
            CustomLog /path/to/apache-rproxy.dlog "%{%v/%T}t %h -> %{SERVER}e URL: %U"

            具體說明如下

            ServerRoot "/usr/local"
            ServerRoot用于指定守護進程httpd的運行目錄,httpd在啟動之后將自動將進程的當前目錄改變為這個目錄,因此如果設置文件中指定的文件或目錄是相對路徑,那么真實路徑就位于這個ServerRoot定義的路徑之下。

            由于httpd會經常進行并發的文件操作,就需要使用加鎖的方式來保證文件操作不沖突,由于NFS文件系統在文件加鎖方面能力有限,因此這個目錄應該是本地磁盤文件系統,而不應該使用NFS文件系統。

            LockFile /var/run/httpd.lock
            LockFile參數指定了httpd守護進程的加鎖文件,一般不需要設置這個參數,Apache服務器將自動在ServerRoot下面的路徑中進行操作。但如果ServerRoot為NFS文件系統,便需要使用這個參數指定本地文件系統中的路徑。

            PidFile /var/run/httpd.pid
            PidFile指定的文件將記錄httpd守護進程的進程號,由于httpd能自動復制其自身,因此系統中有多個httpd進程,但只有一個進程為最初啟動的進程,它為其他進程的父進程,對這個進程發送信號將影響所有的httpd進程。PidFILE定義的文件中就記錄httpd父進程的進程號。

            posted @ 2008-07-18 18:08 泡泡牛 閱讀(643) | 評論 (0)編輯 收藏
            C/C++ 的預處理變量,宏 和 預定義宏

            == 預處理指令(Preprocessor Directives) ==


            == 預處理操作符(Preprocessor Operators) ==
            Stringizing operator (#)
            Causes the corresponding actual argument to be enclosed in double quotation marks
            將參數變成字符串 : #x -> "x"

            Charizing operator (#@)
            Causes the corresponding argument to be enclosed in single quotation marks and to be treated as a character (Microsoft Specific)
            將參數變成字符變量 : #x -> 'x'

            Token-pasting operator (##)
            Allows tokens used as actual arguments to be concatenated to form other tokens
            將參數和前面的符號結合 : token##x -> tokenx


            == 預定義宏(Predefined Macros) ==

            __FILE__
            __LINE__

            #define LINE1(x) #x
            #define LINE(x) LINE1(x)
            #define TODO(msg)   message ( __FILE__ "(" LINE(__LINE__)  "): [TODO] " #msg )
            #define NOTE(msg)   message ( __FILE__ "(" LINE(__LINE__)  "): [NOTE] " #msg )

            posted @ 2008-06-06 14:10 泡泡牛 閱讀(2249) | 評論 (0)編輯 收藏
            zz 自定義瀏覽器控件

            同自動化瀏覽器(http://blog.joycode.com/jiangsheng/archive/2005/10/20/65489.aspx)相比,自動化瀏覽器控件(WebBrowser Control) 在應用程序中更加常用。從Outlook的預覽窗格到Maxthon這樣的基于IE引擎的瀏覽器,從無界面的HTML分析器到Norton Antivirusd的主界面,瀏覽器控件在眾多領域被用作各種各樣的用途。這也使得有必要根據具體的用戶需求自定義瀏覽器控件的行為。

            在應用程序中加入瀏覽器控件

            集成瀏覽器控件的最簡單的方法是找一個支持ActiveX的集成開發環境,在工具箱中加入Microsoft Web Browser這個控件,往表單上拖一個這個控件就可以完成工作。你甚至可以用集成開發環境添加ActiveX的事件處理函數。如果要直接導入ActiveX的話,建議使用mehrcpp的vbMHWB控件(http://www.codeproject.com/atl/vbmhwb.asp)。這個控件在瀏覽器控件的基礎上進行了擴展,暴露了很多底層接口。

            通常導入ActiveX就可以滿足大部分需求  ,但是有些類庫中也集成了瀏覽器控件,并且提供了更多的功能,例如MFC的CHTMLView和CDHtmlDialog,ATL的HTML Control,以及.Net 2.0中的Windows.Forms.WebBrowser。如果使用Visual C++來進行非托管編程,那么建議使用MFC或者ATL的封裝類,或者使用vbMHWB控件。托管編程中當然首選Windows.Forms.WebBrowser。除非這些類的BUG影響到了應用程序的開發,否則建議使用這些功能更加強大的封裝類。

            在使用瀏覽器控件及其封裝類的時候要注意一些已知問題

            常見任務

            在集成瀏覽器控件之后,可以完成基本的網頁瀏覽,但是對于不同的任務,也需要進一步的處理,例如設置控件的屬性、為控件添加事件處理、操作HTML文檔等等。

            修改瀏覽器控件的屬性

            這在集成開發環境中可以很容易地設置,也可以自己實現容器來設置,但是CHTMLView這樣的封裝類沒有這個選項(http://support.microsoft.com/kb/197921)。

            • 鏈接目標解析。對于用瀏覽器控件來做瀏覽器的場合來說,需要將瀏覽器的RegisterAsBrowser屬性設置為true。這使得Internet Explorer在解析HTML鏈接的target屬性指定的目標窗口時可以找到這個窗口。
            • 禁用拖放。對于使用瀏覽器控件來做預覽窗格的場合來說,需要將瀏覽器的RegisterAsDropTarget屬性設置為false。這使得窗口不接受拖進來的文件和鏈接。
            • 禁用消息框。對于用瀏覽器控件來做HTML分析器的場合來說,有時需要屏蔽腳本產生的消息框以避免阻塞程序運行。這可以通過設置瀏覽器的Silent屬性來實現,或者實現IDocHostShowUI::ShowMessage。

            捕獲瀏覽器控件的事件

            集成開發環境中可以也很容易地添加瀏覽器的事件處理函數。比較常用的事件包括

            • NewWindow2或者NewWindow3事件。默認情況下,瀏覽器控件中創建的新窗口會是一個Internet Explorer的窗口。這通常不是預期的行為,對于瀏覽器程序來說更是這樣。需要處理瀏覽器的NewWindow2或者NewWindow3(在Windows XP SP2或者Windows 2003 SP1之后可用)事件來讓新的瀏覽器窗口在應用程序提供的窗口中運行。
            • WindowClosing事件。瀏覽器控件需要處理WindowClosing事件來在瀏覽器控件被腳本關閉時關閉瀏覽器控件的宿主窗口(http://support.microsoft.com/kb/253219)。
            • BeforeNavigate2事件。可以在自己的網頁中加入自定義的協議,之后在BeforeNavigate2事件中掃描URL來進行網頁和應用程序之間的交互(http://www.microsoft.com/msj/0100/c/c0100.aspx)。當然,自定義的網絡協議也可以用Asynchronous Pluggable Protocol來處理(參見http://support.microsoft.com/kb/303740),vbMHWB控件就實現了這個功能。但是更加常用的是在彈出廣告過濾器程序中用BeforeNavigate2來判斷在NewWindow2事件中創建的窗口是否需要關閉。

            操作MSHTML文檔

            通常HTML分析和瀏覽器自動化程序都需要分析網頁的結構,找到需要操作的元素。這需要對網頁的結構進行分析,找到目標元素的標識方法。 一些常用的操作包括:

             在頁面包含框架的時候,可能需要跨框架訪問HTML文檔。可以通過查詢框架元素所支持的IWebBrowser2接口或者IHTMLWindow2接口來訪問框架中的文檔(http://support.microsoft.com/kb/196340),但是也有可能因為安全設置而無法訪問(http://support.microsoft.com/kb/167796)。

            在瀏覽器控件中顯示其它類型的文檔時,可以用IWebBrowser2的document屬性來訪問ActiveX文檔,例如在顯示Microsoft Word時,IWebBrowser2的document屬性就是Word的文檔對象,在顯示文件夾的時候,IWebBrowser2的document屬性就是文件夾對象等等。

            擴展瀏覽器的宿主

            瀏覽器控件在創建時會查詢ActiveX容器的IOleClientSite的實現的如下接口:IDocHostUIHandler, IDocHostUIHandler2 and IDocHostShowUI

            雖然在無法自定義ActiveX容器的情況下可以用ICustomDoc::SetUIHandler來掛接IDocHostUIHandler到瀏覽器控件,但是這樣也會造成內存泄漏(http://support.microsoft.com/kb/893629)。一些類庫,例如MFC、ATL和.Net類庫都實現了IDocHostUIHandler接口。

            除了專門用于瀏覽器用途的程序之外,通常都需要自定義瀏覽器控件的上下文菜單。這需要實現IDocHostUIHandler::ShowContextMenu。通常的實現包括完全禁用上下文菜單、完全替換上下文菜單、以及修改部分上下文菜單。經常被從上下文菜單中移除的菜單項包含查看源代碼、刷新和屬性。一種替代的方案是在容器中過濾右鍵消息(http://support.microsoft.com/kb/231578)。

            與瀏覽器相比,一些Internet Explorer的宿主功能在瀏覽器控件中并不是默認啟用。在某些場合,默認啟用的宿主功能可能并非預期。這時需要實現IDocHostUIHandler::GetHostInfo。可以通過實現IDocHostUIHandler::GetHostInfo來自定義的功能包括:

            • 自動完成功能。對于用瀏覽器控件來做瀏覽器的場合來說,這個功能是有必要啟用的。啟用的方法是設置DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE位
            • 如果瀏覽器中的鏈接網址包含非ASCII的字符,那么需要實現IDocHostUIHandler::GetHostInfo,并且在返回的DOCHOSTUIINFO結構中設置dwFlags成員的DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8位。這使得網址會在發送之前用UTF-8編碼。
            • 3D邊框、滾動條,禁用文字選擇功能和禁用頁面上的腳本。
            • 對于使用瀏覽器控件來做HTML編輯器的場合來說,有時需要修改默認的頁面樣式。這都需要實現IDocHostUIHandler::GetHostInfo(http://support.microsoft.com/kb/328803)。注意在有些版本的IE中IDocHostUIHandler::GetHostInfo只在MSHTML被初始化的時候被調用,所以如果你需要在MSHTML被初始化之后使你的修改生效,你需要瀏覽到一個Word之類的非HTML Active document文檔,之后再瀏覽回來。

            在使用瀏覽器控件來做數據錄入界面的場合,需要更改瀏覽器控件默認的Tab鍵處理使得用戶可以使用Tab鍵切換到容器中的其他控件。這需要實現IDocHostUIHandler::TranslateAccelerator來自定義瀏覽器控件的快捷鍵處理。對于MFC這樣用消息鉤子來做消息預處理的可自定義容器來說,也可以用PreTranslateMessage來過濾F5鍵盤消息,而不是實現IDocHostUIHandler::TranslateAccelerator。

            在腳本中調用應用程序對瀏覽器控件的擴展,這需要實現IDocHostUIHandler::GetExternal。使用.Net的WebBrowser控件的話設置ObjectForScripting屬性就可以了。

            對于用瀏覽器控件來做HTML分析器的場合來說,有時需要屏蔽腳本產生的消息框。這需要實現IDocHostShowUI::ShowMessage,或者設置瀏覽器的Silent屬性。

            另外,瀏覽器也會查詢IOleClientSite來獲得其它的服務信息,例如

            其他控制

            對于用瀏覽器控件來做HTML分析器的場合來說,有時需要禁用瀏覽器的腳本、ActiveX或者圖片下載。這可以通過在容器中實現IDispatch,處理DISPID_AMBIENT_DLCONTROL來做到(http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/overview/Overview.asp)。

            看來離線瀏覽的控制并不能用這種方法來控制(http://support.microsoft.com/kb/247336)。不過你可以自己編寫一個HTTP層傳遞 BINDF_OFFLINEOPERATION標志 (http://groups-beta.google.com/group/microsoft.public.inetsdk.programming.mshtml_hosting/msg/76bf4910a289d4b3

            在瀏覽器控件中java小程序可能不能正常運行,如果使用Sun JVM1.4之后的版本,可以用SetEnvironmentVariable 來設置JAVA_PLUGIN_WEBCONTROL_ENABLE為1來啟用Sun JVM。

            默認情況下在頁面載入時會有點擊聲。屏蔽點擊聲的一個方法是在程序運行時修改注冊表鍵(http://support.microsoft.com/kb/201901),另一個方法是將瀏覽器控件隱藏,在調用Navigate2之后再顯示,但是這也需要鎖定控件的更新區域(LockWindowUpdate)以避免閃爍。在IE7中,也可以調用 CoInternetSetFeatureEnabled函數,傳遞FEATURE_DISABLE_NAVIGATION_SOUNDS來禁用瀏覽時的聲音。

            在需要使用代理服務器時,有可能需要在應用程序中使用非默認的代理服務器設置。這可以通過調用UrlMkSetSessionOption來實現。

            Overriding IInternetSecurityManager in a CComControl class
            CAxWindow implements IObjectWithSite interface (get it with QueryHost
            method). Call SetSite passing your implementation of IServiceProvider.
            At this point, AxWin will forward all QueryService calls from hosted
            WebBrowser to your implementation.

            posted @ 2008-04-18 22:29 泡泡牛 閱讀(1958) | 評論 (0)編輯 收藏
            ie 攻擊監測

            對ie 的攻擊分好幾類, 有修改主頁, 彈出窗口, 惡意插件, 網頁木馬等. 其中一些是利用了ie 的腳本的自帶功能, 而另外一些要對ie 實施攻擊后才能做到, 主要手段有利用第三方軟件漏洞, ie 堆噴射等, 文章 [ [JavaScript中的堆風水]|[ http://www.team509.com/download/Heap%20Feng%20Shui%20in%20JavaScript_en_cn.htm ] ] 對堆噴射進行了介紹, 主要是利用覆蓋函數返回地址或者對象的虛函數表來執行shellcode, 主要涉及到ie & 系統的內存管理.
            一般shellcode 基本只完成攻擊動作, 具體的對系統的后續攻擊肯定離不了下載執行 exe 文件等動作, 并且在攻擊ie 也會有各種癥狀, 可以根據這些基本實現惡意代碼.

            1. 根據ie 癥狀
            當ie 訪問惡意頁面的遭受攻擊時, 其重要表現是
            a. 內存使用
            b. cpu 使用率
            所以實時監測這些參數可以基本判斷是否有攻擊


            2. 根據行為
            shellcode 如果被執行, 那么肯定會進行木馬下載執行等步驟. 一般純shellcode 里面的內容不會很多, 所以不可能完成很多復雜的攻擊.
            win32 創建進程的API調用串是:
            WinExec/ShellExecuteA/CreateProcessA->CreateProcessInternalA->CreateProcessInternalW->ZwCreateProcessEx

            CreateProcessW->CreateProcessInternalW->ZwCreateProcessEx

            win32 要執行下載的API 主要是wsock32.dll 的
            recv , recvfrom

            所以對上述API 進行攔截, 一般可以檢測到是否有ie 是否被攻擊, 但是這個只能在攻擊成功后, shellcode 執行后才能被檢測到

            3.
            攔截一些操作注冊表, 創建窗口等API , 可以做到防止被修改主頁, 彈出窗口等

             

            利用ms 的Detours 可以很容易的實現對系統 API 的hook
            http://blog.csdn.net/hu0406/archive/2008/03/05/2150358.aspx
            http://blog.csdn.net/hu0406/archive/2008/03/05/2150351.aspx
            http://www.moon-soft.com/doc/2288.htm
            http://blog.csdn.net/dedodong/archive/2006/10/07/1323925.aspx

            [ [JavaScript中的堆風水]|[ http://www.team509.com/download/Heap%20Feng%20Shui%20in%20JavaScript_en_cn.htm ] ] ie 堆噴射

            [ [也聊inline-hook]|[ http://blog.tom.com/tigerkings941220/article/9211.html ] ] 介紹了 進程自身保護(通過攔截LoadLibraryW)和IE漏洞防護(通過攔截CreateProcessInternalW)

            [ [maxthon2(遨游2) mxsafe.dll對網頁木馬的防護以及繞過]|[ http://hi.baidu.com/54nop/blog/item/b52cff6e713964d980cb4a9e.html ] ] 討論了maxthon2 防止網頁木馬的策略( 攔截 ZwCreateProcessEx/ZwCreateProcess, ZwWriteVirtualMemory, LoadLibraryExW, CreateProcessInternalW )以及對抗策略, 其實這個只是hook & unhook 的游戲了..

            [ [小議PE病毒技術]|[ http://blog.vckbase.com/windowssky/archive/2007/04/17.html ] ] 介紹了 pe 病毒 & win32 進程加載內部

            [ [360安全衛士程序員志愿者]|[ http://blog.csdn.net/dedodong/archive/2006/10/07/1323925.aspx ] ] 通過攔截 NtCreateProcessEx/NtCreateProcess 實現了"""編寫一個程序,在此程序中運行a.exe,并使得a.exe認為是由explorer.exe運行它的"""

            [ [阻擊惡意軟件--清除和保護你的網站的小技巧]|[ http://www.googlechinawebmaster.com/labels/badware.html ] ] google 上的對惡意軟件(badware) 的介紹

            [ [StopBadware Blog]|[ http://blogs.stopbadware.org/articles/2007/11 ] ]


             

            posted @ 2008-04-18 19:49 泡泡牛 閱讀(1915) | 評論 (1)編輯 收藏
            Windows Winnet 實現HTTP 文件斷點續傳下載

            1. MFC 下載文件

            有2種方法:
            a)
            創建CInternetSession 對象 -> 調用 CInternetSession::OpenURL 該函數解析URL,然后打開與URL指定的服務器連接,同時返回一個只讀的CInternetFile對象 -> CInternetFile::Read 讀取文件 -> 析構CInternetSession

            b)
            創建CInternetSession 對象 -> 調用 CInternetSession::GetHttpConnection
            返回CHttpConnection 對象 -> 調用CHttpConnection::OpenRequest 創建一個CHttpFile對象 -> CHttpFile::SendRequest 發送連接請求 -> CHttpFile::QueryInfo 獲取HTTP 信息(比如文件大小, ETAG等) | CInternetFile::Read 讀取文件 ->  析構CInternetSession

            在上述過程中, 如果出現錯誤會拋出 CInternetException 異常
            另外在打開鏈接前, 可以進行如下設置
            CInternetSession::SetOption    讀取或設置 InternetQuery 選項 (如超時或重試次數)
            CInternetSession::EnableStatusCallback 設置回調函數監視session狀態
            CHttpFile::AddRequestHeaders   設置HTTP 請求頭(需要在CHttpFile::SendRequest 前調用)


            2. 實現斷點續傳
            斷點續傳其實是通過在HTTP 請求頭中設置要下載的文件區間來實現, 一個典型的HTTP 請求頭是

              GEThttp://class/download.microtool.de:80/somedata.exe 
              Host:download.microtool.de
              Accept:*/*
              Pragma:no-cache
              Cache-Control:no-cache
              Referer:http://class/download.microtool.de/
              User-Agent:Mozilla/4.04[en](Win95;I;Nav)
              Range:bytes=554554-
             
            注意最后一行:Range:bytes=554554-,格式為:Range: bytes=起始位置 - 終止位置,也就是說,我們可以通過設置Http請求頭的設置起始結束位置,來獲取HTTP文件的某一部分。


            3. Win32 WinInet API 實現
            和MFC 的函數對應, 執行下載操作大致需要的函數有:

            InternetOpen是最先調用的函數,它返回HINTERNET句柄,習慣定義為hSession,即會話句柄, 相當于CInternetSession
            InternetConnect使用hSession句柄,返回的是http連接句柄,定義為hConnect, 相當于 CInternetSession::GetHttpConnection
            HttpOpenRequest使用hConnect句柄,返回的句柄是http請求句柄,定義為hRequest, 相當于 CHttpConnection::OpenRequest
            HttpSendRequest(相當于 CHttpFile::SendRequest)、HttpQueryInfo、InternetSetFilePointer和InternetReadFile都使用HttpOpenRequest返回的句柄,即hRequest。

            CInternetSession::OpenURL 相當于實現了 InternetConnect & HttpOpenRequest & HttpSendRequest 3個函數

            當這幾個句柄不再使用時,應該用函數InternetCloseHandle把它關閉,以釋放其占用的資源。


            用WinInet開發Internet客戶端應用指南(一)  http://www.vckbase.com/document/viewdoc/?id=545
            用WinInet開發Internet客戶端應用指南(二) http://www.vckbase.com/document/viewdoc/?id=546
            使用 CInternetSession 封裝多線程 http 文件下載 http://www.vckbase.com/document/viewdoc/?id=1693
            Http下載的斷點續傳       http://sunyan331.spaces.live.com/blog/cns!89B9F8BF2575E281!947.entry
            HTTP服務器上斷點下載文件(里面有很不錯的源碼)      http://www.cnitblog.com/wangk/archive/2007/05/22/5942.html
            編寫斷點續傳和多線程下載(有源碼)   http://www.bbbh.org/20060427/2620/
            WinInet: implementing resuming feature  http://www.clevercomponents.com/articles/article015/resuming.asp
            (很詳細的一個代碼解釋)Retrieving a file via. HTTP  http://www.codeproject.com/KB/IP/getwebfile.aspx 

            posted @ 2008-04-17 23:01 泡泡牛 閱讀(9908) | 評論 (0)編輯 收藏
            MSNP協議的通信過程[En]

            You have been using MSN for quite some time wondering how it works. Well You need not look any further. This article will not just tell you how MSN works but will also tell you how to make your own version of MSN messenger. You can download a sample application from here MSN Clone .Let's get ready to rumble!!!!

             

            We can split up the working of MSN messenger into 2 phases

            • Authentication Phase

            • Instant Messaging Phase

            The Authentication Phase involves logging into the MSN messenger server and also (friends) list retrieval in this case.

            The Instant Messaging Phase involves sending/accepting requests for an Instant Messaging session and also sending/receiving messages.

             

            The MSN messenger protocol is an ASCII based protocol. In other words the commands are in pure English !!!.The first phase involves connecting to an MSN messenger server .In this case we shall connect to the server 64.4.13.58 on port 1863(MSN messenger works through port 1863).

            Once the connection is done we need to start the log in process. The first stage in this phase is the versioning stage. In this stage the client (in this case your app) lists/sends the versions that it can support to the server and waits for the server to respond.

            VER 0 MSNP7 MSNP6 MSNP5 MSNP4 CVRO

            In the MSN messenger protocol a "trial id" is sent along with every command. The trial id starts from 0 and is incremented every time the server responds successfully to the client's commands.

             

            The server responds like this

            VER 0 MSNP7 MSNP6 MSNP5 MSNP4

            The Client and the server have agreed on a version in which they will communicate.

             

            Next the client sends a request to the server asking it for the name of the security package it supports for authentication.

            INF 1

            Unlike Yahoo, Rediff and a few other Messengers MSN does not actually send the password as it is.It encrypts the password while sending it ensuring that your password will not be leaked out easily if somebody monitors your port.

             

            The server responds with this

            INF 1 MD5

            Here MD5 is the name of the security package which the server currently supports.

            Next the client sends the userid to the server

             

            USR 2  MD5  I  venky_dude@hotmail.com

            Here the server does a check whether it contains all the relevant details about the user for authentication .If it does not then it sends the following reply

             XFR 2  NS 64.4.13.55:1863  0

            What the server says is that the client should connect to the Notification Server(NS) on 64.4.13.55 on port 1863. We close the current connection and repeat the  steps while being connected to the new server i.e  64.4.13.55

            • (client)   VER 3 MSNP7 MSNP6 MSNP5 MSNP4 CVRO

            • (server) VER 3 MSNP7 MSNP6 MSNP5 MSNP4 

            • (client)   INF  4

            • (server) INF  4  MD5

            • (client)  USR  5  MD5 I venky_dude@hotmail.com

            Now the server to which we are connected to has the relevant information about the user trying to log in. The server replies this way

            USR 5  MD5  S 989048851.1851137130

             The string which is sent by the server is the " MD5 Hash". It is a hash generated by the server and is used in the authentication process. The client then has to send the password which is encrypted using the MD5 algorithm.In effect the client has to send the unique MD5 equivalent of the MD5 hash i.e 989048851.1851137130 in this case and the password combined .i.e. MD5 equivalent of (hash+pass). In this case it turns out to be 3b7926d277068ec49576a0c40598ff21.

            USR 6 MD5 S 3b7926d277068ec49576a0c40598ff21

            If the password is right then the server replies with this

            USR 6 OK venky_dude@hotmail.com venkat

            Here the last word is the nickname/name by which the user is known.

            In the new version of the protocol (MSNP7) the server sends additional data like some general information about the user and a authentication code something similar to a cookie which can be used for various other functions.

             

            MSG Hotmai Hotmail 362
            MIME-Version: 1.0
            Content-Type: text/x-msmsgspro file; charset=UT
            LoginTime: 1011252477
            EmailEnabled: 1
            MemberIdHigh: 84736
            MemberIdLow: - 1434729391
            lang _preference: 103
            preferredEmai l: venky_dude@hotmail.com
            country: IN
            PostalCode:
            Gender: M
            Kid:0
            Age: 22
            sid: 517
            kv: 2
            MSPAuth: 2AAAAAAAADU0p4uxxxJtDJozJSlUTS0i7YpwnC9PUHRv56YKxxxCTWmg$$

            Now we are logged into the server but our status is still offline. We need to change our status to online in order to send and receive messages. The client does this in the following way

            CHG 7 NLN

            The server replies with friends who are online and in various states.

            CHG 7 NLN

            ILN 7 NLN btxxxe@hotmail.com nick
            ILN 7 AWY wmpyxxx@msn.com mike
            ILN 7 BSY tehpxxpxx@hotmail.com yeaxxx

            MSG Hotmail Hotmail 223
            MIME-Version: 1.0
            Content-Type: text/x-msmsgsinitialemailnotification; charset=UTF-8

            Inbox-Unread: 293
            Folders-Unread: 0
            Inbox-URL: /cgi-bin/HoTMaiL
            Folders-URL: /cgi-bin/folders
            Post-URL: http://www.hotmail.com

             

            The next command to be sent to the server pertains to the version of the client currently being used.The client send to the server it's version number and also information about the machine like the OS and the build.

            CVR 8 0x0409 win 4.10 i386 MSMSGS 4.5.0127 MSMSGS

            Here 0x409 win 4.10 i386 specifies that the client is running win98 on a intel microprocessor, and MSMSGS 4.5.0127 MSMSGS here specifies the version and build no of msmsgs.exe (basically the version no of MSN messenger).

            The server responds with the url to download the latest version and some other info

            CVR 8 4.5.0127 4.5.0127 1.0.0863 http://download.microsoft.com/download/msnmessenger/install/4.5/win98me/en-us/mmssetup.exe http://messenger.microsoft.com

             

            It is not necesarry to send the CVR command, the messenger protocol will function properly regardless of this command being sent

             

            To get a list of people who are in our friends list we may send this command

            LST 9 RL

            On sending this command the server will reply by sending the reverse list .The reverse list is basically a list of users who can see you when you are online and send you a message.You could alternatively also request for the forward list by sending LST 9 FL .The forward list contains a list of all users whom the user has added to his/her list.

            The server responds this way

            LST 9 RL 69 1 19 venky_dude@hotmail.com venkat
            LST 9 RL 69 2 19 puxxxxx@hotmail.com PUJA
            LST 9 RL 69 3 19 vancxxxxx@hotmail.com ramachandran
            LST 9 RL 69 4 19 moxxxxx@hotmail.com chandramouli
            LST 9 RL 69 5 19 v_n_xxxxx@hotmail.com Narayanaswamy
            LST 9 RL 69 6 19 dexxxxx@hotmail.com Venkatesh
            LST 9 RL 69 7 19 lousydxxxxx@hotmail.com deepika%20kalyani%20Vairam                                                  LST 9 RL 69 8 19 hexxxxxr@hotmail.com Hetchar%20Ramachandran
            LST 9 RL 69 9 19 ambxxxxx@hotmail.com Aiyer
            LST 9 RL 69 10 19 suxxx@hotmail.com Ganesh
            LST 9 RL 69 11 19 deexxxxx@hotmail.com Deepak
            LST 9 RL 69 12 19 anilxxxxx@hotmail.com anil
            LST 9 RL 69 13 19 dixxxxx@hotmail.com <Diamond>
            LST 9 RL 69 14 19 nvxxxx@hotmail.com giri
            LST 9 RL 69 15 19 shxxx@hotmail.com Hari
            LST 9 RL 69 16 19 radhikashuxxxxx@hotmail.com radhika
            LST 9 RL 69 17 19 eskaxxxxx@hotmail.com kannan
            LST 9 RL 69 18 19 shaxxxxx@hotmail.com Shankar
            LST 9 RL 69 19 19 puneetagarxxxxx@hotmail.com puneet

             

             

            *Every time a friend comes online the server(NS) sends us the following command

            NLN 10NLN deaxxxx@hotmail.com Venkatesh

            and when the friend goes offline the server sends us this

            FLN 10 FLN deaxxxx@hotmail.com

            With the MSNP7 protocol msn has introduced a new challenege authentication mechanism. The MSN server sends t a challenge key which the user has to authenticate succesfully in order for the session to continue.

            CHL 0 20881396011366812350

             

            The client has to send the md5 equivalent of this string which is formed by appending this hash with the string "Q1P7W2E4J9R8U3S5".So the final string which will be sent to the server will be the md5 equivalent of 20881396011366812350Q1P7W2E4J9R8U3S5

            i.e MD5string(20881396011366812350Q1P7W2E4J9R8U3S5 )

            So the client response would be something like this

            QRY 18 msmsgs@msnmsgr.com 32
            0212eaad0876afb8505859ca75d21a78

            Here 18 is the trial id .Replace it by the appropriate trial id in your program .

            The server will respond in the following way if the authentication is right

            QRY 18

            We have successfully logged into the MSN Messenger server. The Instant Messaging phase is next.






            Instant Messaging in MSN Messenger is session based . The people in between whom the conversation is going to take place have to be in a session mode. We cannot send/receive messages unless we start a chat session with a user. 

            There are basically two methods in  which a user can be in a chat session                                                           

            • User sends a chat session request to another user
            • User receives a chat session request from another user

             

            User sends a chat session request

             

            The client(user) sends a command to the server asking it for the address of the SwitchBoard(SB) server. All instant messaging conversation take place via the switchboard server.

            XFR 9 SB

            The server(SB) replies back with the ip address of the switchboard server(SB),the port on which to connect and a CKI hash. CKI is a security package and the client has to use the hash to connect to the switchboard server.

             XFR 9 SB 64.4.13.88:1863 CKI 989487642.2070896604     

            Now we have to make another  new connection this time to the switchboard server. Our previous connection to the MSN messenger server  must be kept as it is. If we lose connection with that server we would log out.

            After we have connected to the switchboard server(SB) we send the following command to the switchboard server.

            USR 1 venky_dude@hotmail.com  989487642.2070896604  

            If the CKI hash sent by us is right the server(SB) responds back with this

            USR 1 OK venky_dude@hotmail.com venkat

            After this has been done the user has to "Call" the other user to the chat session. This is done by sending the following command.

            CAL 2 deadxxx@hotmail.com 

            The server replies back with the a session id which it will pass on to the other user

            CAL 2 RINGING 11717653

            When the other user replies and is ready for a chat the server(SB) sends us this command

            JOI deadlee@hotmail.com Venkatesh

            This indicates that the other user has joined in the conversation and we are now ready to send and receive messages.

             

            User receives a chat session request

            When we are being invited to a chat session by a user the server(NS) send us the following message.

             

            RNG 11742066 64.4.13.74:1863 CKI 989495494.750408580 deaxxxx@hotmail.com Venkatesh

            Here the server(NS) sends us the session id ,the ip address of the SwitchBoard server to connect to,the port on which to connect to ,the CKI hash and the user trying to start a conversation with us.

            Now we have to make another  new connection this time to the switchboard server. Our previous connection to the MSN messenger server  must be kept as it is. If we loose connection with that server we would log out.

            We  connect to the switchboard server and send the following command

            ANS 1 venky_dude@hotmail.com 989495494.750408580 11742066

            Here we send our login name ,the CKI hash that was sent to us and the session Id that was sent to us

            The server responds back with 

            IRO 1 1 1 deaxxxx@hotmail.com Venkatesh

            and

            ANS 1 OK

            We are now ready to send and receive messages.

             

            Before sending/receiving messages let us see how the message is constructed.

            When we are sending a message we build the header information  in the following way

            MIME-Version: 1.0
            Content-Type: text/plain; charset=UTF-8
            X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22

            While sending a message we send it this way

            MSG  2  N 137                                                                                                                                                            MIME-Version: 1.0
            Content-Type: text/plain; charset=UTF-8
            X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22

            hello

            Here 2 is the trial id which has to incremented each time we send a message. 137 is the total length of the message i.e length of the header and length of the actual message that we are sending in this case it is 'hello'.

             While receiving the message it is more or less similar

            Here is an example of a message received

            MSG deaxxxx@hotmail.com Venkatesh 137
            MIME-Version: 1.0
            Content-Type: text/plain; charset=UTF-8
            X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22

            hello

             

            When the other user is typing a message we receive the foll message

            MSG deaxxxx@hotmail.com Venkatesh 100
            MIME-Version: 1.0
            Content-Type: text/x-msmsgscontrol
            TypingUser: deaxxxx@hotmail.com

             

            I guess now u guys are well on your way to make your own version of  MSN messenger.Post your doubts/comments/message in the Forumn .Do visit my projects page for some cool vb & c++ codes

             I'll keep adding to the protocol ,will try to put in addition functions like add/remove users ,rename user id,file transfer and voice chat, so keep checking back

             

            References:

            You could take a look at these sites for more information

            This is the original protocol published by microsoft.

            http://www.tlsecurity.net/Textware/Misc/draft-movva-msn-messenger-protocol-00.txt

            This is the MD5 homepage where u can find programs/codes for doing the MD5 encryption

            http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html


            MSNP10協議分析 01.登錄 [by progsoft]
            http://blog.csdn.net/progsoft/archive/2004/08/24/82938.aspx

            MSN協議中文釋義(Zz)
            http://blog.csdn.net/fanccYang/archive/2005/03/16/321198.aspx

            MSN Protocol Version 8
            http://msnpiki.msnfanatic.com/index.php/Main_Page
            介紹了MSNP 的整個協議 & 服務器 Notification Server (NS)  & Switchboard (SB)  的功能

            MSN Messenger Protocol Version 9
            http://zoronax.bot2k3.net/
            很詳細的介紹, 里面還有原始包例子

            MSN Messenger Protocol
            http://www.hypothetic.org/docs/msn/client/invitation_types.php
            MSNP 的詳細命令介紹

            Reverse-engineering MSN Messenger's Video Conversation Formats[Ramiro Polla]
            http://www.libing.net.cn/read.php/1031.htm

            posted @ 2008-03-23 13:13 泡泡牛 閱讀(4372) | 評論 (1)編輯 收藏
            IE 異步可插入協議擴展

            可插入協議擴展(Asynchronous Pluggable Protocols)主要基于異步的URL Moniker技術。 IE的URL Moniker在urlmon.dll 動態庫中實現的, 有兩種處理機制:
            1. 根據URL 協議調用外部程序處理
            比如telnet: or news: or mailto:,當訪問這些url的時候會打開相應的程序來處理。
            比如要添加note:協議(Registering an Application to a URL Protocol), 則只要修改注冊表
            [HKEY_CLASSES_ROOT]
                [note]
                    (Default) = "URL:Note Protocol"
                    URL Protocol = ""
                    [DefaultIcon]
                        (Default) = "notepad.exe"
                    [shell]
                        [open]
                            [command]
                                (Default) = "c:\windows\notepad.exe %1"
            在IE 中輸入 note://xxx.txt 的時候會自動用notepad 打開xxx.txt 文件

            2. 根據URL 協議調用類對象來處理
            可以根據URL 協議或者MIME type 注冊不同的處理對象
            有兩種方式:
            a) 通過在注冊表將URL 協議與COM 對象關聯
            主要在注冊表中的
            HKEY_CLASSES_ROOT\PROTOCOLS\Handler # URL 協議
            HKEY_CLASSES_ROOT\PROTOCOLS\Filter # Mime Filter

            b) 通過臨時注冊類對象將URL 協議與其關聯
            // 注冊
            CComPtr<IInternetSession> spSession;
            CComPtr<IClassFactory>   spCFHTTP;
            HRESULT hr = CoInternetGetSession(0, &spSession, 0);
            hr = FilterFactory::CreateInstance(CLSID_HttpProtocol, &spCFHTTP);
            hr = spSession->RegisterNameSpace(spCFHTTP, CLSID_NULL, L"http", 0, 0, 0);

            // 反注冊
            spSession->UnregisterNameSpace(spCFHTTP, L"http");

             

            3. FilterFactory 的實現可以參考
            Asynchronous Pluggable Protocol Implementation with ATL
            http://www.codeguru.com/cpp/com-tech/atl/misc/article.php/c37/

            Internet Explorer下載文件的終極過濾
            http://blog.csdn.net/111222/archive/2002/02/09/7255.aspx

            通過Mime filter技術對網頁源碼進行過濾(監視下載文件)
            http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx

            HTML代碼過濾技術
            http://blog.csdn.net/lion_wing/articles/534716.aspx

            About Asynchronous Pluggable Protocols (MSDN)

            Internet Explorer 編程簡述(九)在自己的瀏覽器中嵌入Google工具條
            http://blog.csdn.net/CathyEagle/archive/2005/12/12/550698.aspx

            放1000分,高手進來動手試試:如何提取AJAX里的HTML內容?
            http://topic.csdn.net/t/20061214/12/5230161.html
            這里主要通過監視IE 的下載從而保存Google Map 的地圖數據文件.  通過監視http & text/html & application/javascript 的內容來獲取圖片文件URL 和 信息.. :)


            posted @ 2008-03-23 00:38 泡泡牛 閱讀(5223) | 評論 (1)編輯 收藏
            const和指針組合的變化

            a. char const* p     *p不能變,p能變,不需要初始化
            b. const char* p     同a
            c. char* const p     *p能變,p不能變,需要初始化
            d. const char* const p  *p不能變,p不能變,需要初始化
            d. const char const* p  *p不能變,p能變,不需要初始化
            e. const char const* const p  錯誤
            f. char const* const p  同d

            posted @ 2008-02-27 11:03 泡泡牛 閱讀(659) | 評論 (0)編輯 收藏
            僅列出標題
            共5頁: 1 2 3 4 5 
            欧美亚洲国产精品久久| 久久精品中文字幕第23页| 国产精品一区二区久久精品无码 | 伊人久久大香线焦AV综合影院| 好久久免费视频高清| 精品乱码久久久久久久| 亚洲国产一成人久久精品| 久久亚洲中文字幕精品一区| 欧美久久久久久| 精品久久久久久国产| 五月丁香综合激情六月久久 | 亚洲精品乱码久久久久久久久久久久 | 亚洲国产精品18久久久久久| 一本色道久久综合狠狠躁| 久久国语露脸国产精品电影| 男女久久久国产一区二区三区| 少妇人妻88久久中文字幕| 国产婷婷成人久久Av免费高清| 久久精品蜜芽亚洲国产AV| 久久综合久久综合久久| 国产精品狼人久久久久影院| 久久天天躁狠狠躁夜夜av浪潮 | 理论片午午伦夜理片久久| 欧美精品乱码99久久蜜桃| 久久综合给合久久国产免费| 狠狠色丁香婷婷综合久久来| 久久99精品国产麻豆婷婷| 亚洲国产小视频精品久久久三级| 国产精品久久久久久五月尺| 久久精品午夜一区二区福利| 伊人热人久久中文字幕| 无夜精品久久久久久| 久久99国内精品自在现线| 久久久久久毛片免费看| 久久久久亚洲Av无码专| 久久艹国产| 国产高潮国产高潮久久久| 久久伊人精品青青草原日本| 99久久无色码中文字幕| 久久婷婷五月综合成人D啪| 国产精品久久久久久福利漫画|