<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    wonderer's program

    everything will be better
    posts - 19, comments - 6, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    2007年6月2日

    去SA面試的時候,面試官問我平時用Java的什么數據結構,答曰:Vector。又問:哪有用過其他的的嗎?例如List和Map之類的。答曰:甚少。(自己汗一個,沒水平)既然不會就要學習啦。

    翻開《Java學習筆記》,里面對對象容器的描述不錯。

    1. ArrayList和LinkedList

    ArrayList使用了數組結構實現List的數據。所以ArraryList用來快速定位對象是非常有效率的。但是如果要對ArraryList中間插入或者刪除,效率會非常低。

    LinkedList使用鏈表來實現的List。所以跟ArrayList相反,LinkedList對于插入和刪除是非常有優勢,反之對于快速定位,是LinkedList的弱項。

    1)ArrayListDemo

    public class ArrayListDemo {
        public static void main(String[] args) {
            
            //用Scanner類,可以輕松獲得commander的輸入
            Scanner scanner = new Scanner(System.in);
            
            List<String> list = new ArrayList<String>();
            
            //在控制臺輸入,quit退出
            while(true) {
                System.out.print("Rokey@console# ");
                String input = scanner.next();
                if(input.equals("quit")) {
                    break;
                }
                list.add(input);
            }
            
            System.out.print("顯示輸入:");
            
            //使用5.0的foreach功能對List進行遍歷
            for(String s:list) {
                //5.0的類C的輸出格式
                System.out.printf("%s ",s);
            }
        }
    }

    輸出:

    Rokey@console# 一二三
    Rokey@console# 三二一
    Rokey@console# quit
    顯示輸入:一二三 三二一 
    

     

    2)用LinkedList實現的一個字符串棧

    /**
     *
     * @author Rokey
     * 用LinkedList構建一個字符棧,先進先出
     */
    public class StringStack {
    
        private LinkedList<String> linkList;
    
        public StringStack() {
            linkList = new LinkedList<String>();
        }
    
        public void push(String s) {
            //將元素加入鏈表第一個位置
            linkList.addFirst(s);
        }
    
        public String pop() {
            //刪除鏈表第一個元素,并返回
            return linkList.removeFirst();
        }
    
        public String top() {
            //返回鏈表第一個元素,但并不刪除
            return linkList.getFirst();
        }
    
        public boolean isEmpty() {
            //檢查鏈表是否為空
            return linkList.isEmpty();
        }
    }
    public class StringStackDemo {
    
        public static void main(String[] args) {
    
            //用Scanner類,可以輕松獲得commander的輸入
            Scanner scanner = new Scanner(System.in);
    
            StringStack stack = new StringStack();
    
            //在控制臺輸入,quit退出
            while (true) {
                System.out.print("Rokey@console# ");
                String input = scanner.next();
                if (input.equals("quit")) {
                    break;
                }
                stack.push(input);
            }
    
            System.out.print("顯示輸入:");
            //使用5.0的foreach功能對List進行遍歷
            
            while(!stack.isEmpty()) {
                //5.0的類C的輸出格式
                System.out.printf("%s ", stack.pop());
            }
        }
    }

    輸出:

    Rokey@console# 一二三
    Rokey@console# 三二一
    Rokey@console# quit
    顯示輸入:三二一 一二三 

    posted @ 2007-12-27 23:05 wonderer 閱讀(3078) | 評論 (0)編輯 收藏

    OYM中的任務中,有一項對文件內容的檢查挺有意思的,就是要檢查字符是否是全角的,例如“GY”(not“GY”),并且把這些字符改為半角的。
    想起了在研發中心的一個朋友的抱怨:“昨天寫了一整天的程序,發到廣大教務處那邊居然說不能用,然后親自跑了一躺,發現不是我的程序有問題,是那邊的人輸入個全角字符,搜半角的字符,當然不行了”
    恩,Betty寫的需求真有意思,考慮的問題很周全,是一個很厲害的項目經理。如果從輸入這里解決了字符是否是半角的,那么,以后的情況就容易解決很多了。恩,網上搜了一下資料,查了一下書,得出了以下代碼:
    public void testChar() {
      String s1 
    = "123";
      String s2 
    = "abc";
      String s3 
    = "123abc";
      System.out.println(s1);
      System.out.println(s2);
      System.out.println(s3);
      
    for (int i = 0; i < s1.length(); i++) {
       
    int j = s1.charAt(i);
       
    if (j > 256) {
        
    int temp = j - 65248;
        
    if (temp >= 0) {
         System.out.print((
    char)j+"-->:" + (char) temp);
        } 
    else {
          System.out.print((
    char) j);
        }
       } 
    else {
        System.out.print((
    char) j);
       }
      }
      System.out.println();
      
      
    for (int i = 0; i < s2.length(); i++) {
       
    int j = s2.charAt(i);
       
    if (j > 256) {
        
    int temp = j - 65248;
        
    if (temp >= 0) {
         System.out.print((
    char)j+"-->:" + (char) temp);
        } 
    else {
         System.out.print((
    char) j);
        }
       } 
    else {
        System.out.print ((
    char) j);
       }
      }
      System.out.println();
      
      
    for (int i = 0; i < s3.length(); i++) {
       
    int j = s3.charAt(i);
       
    if (j > 256) {
        
    int temp = j - 65248;
        
    if (temp >= 0) {
          System.out.print((
    char)j+"-->:" + (char) temp);
        } 
    else {
         System.out.print((
    char) j);
        }
       } 
    else {
        System.out.print((
    char) j);
       }
      }
      System.out.println();
     
     }
    輸出的結果如下:
    123
    -->ab-->bc--c
    123a
    -->ab-->bc--c


    posted @ 2007-12-23 16:46 wonderer 閱讀(1943) | 評論 (3)編輯 收藏

    OYM的任務中,有個要求,上傳一個Excel文件,檢查他的內容是否合法,并返回信息。

    今天想了一下,第一個要解決的問題就是上傳一個Excel文件,上傳文件的組件到挺多的,網上一搜,就有一大堆教程,但是現在并不是要上傳一個文件到服務器以作存儲之用,而是要上傳一個文件到內存里,以Java的數據結構存儲起來,并檢查,把合乎要求的數據寫到數據庫里。所以在網上的一大堆上傳文件的組件并不合用。于是又想自己寫,思路就是從客戶端那里獲取一個InputStream,然后就對這個InputStream做一系列的檢查。代碼如下:

    ServletInputStream sis =  request.getInputStream();
    InputStreamReader isr = new InputStreamReader(sis);
                 
    int ch;
    while((ch = isr.read()) != -1 ) {          
       out.println((char)ch);
    }
                 
    System.out.flush();

    結果的出去就是如下(輸出東西寫到頁面):

    -----------------------------7d7ea23120550 
    Content-Disposition: form-data; name="file1"; 
    filename="C:\Documents and Settings\Administrator\桌面\test.txt" 
    Content-Type: text/plain 
    my name is Rokey.Rokey。我的名字叫Rokey. 
    -----------------------------7d7ea23120550 Content-Disposition: form-data; 
    name="Submit" 上傳 -----------------------------7d7ea23120550--
    很明顯,這里只有
    my name is Rokey.Rokey。我的名字叫Rokey.

    對我有用,這個也正是我的文件里面的內容,其它的都是關于這些form的其它信息。對我這個程序是沒有用的。如果這里寫下去的話,還要我去分析那些是數據,哪些是form的參數。好,到現在為止,我已經打消了自己寫的念頭了。我想,那些組件都可以把上傳文件封裝得那么好,能不能利用那些庫,抽出文件的IO流,讓我操作呢?

    于是,就開始對的API看,看到里面有這么一段。

    public class MultipartParser
    extends java.lang.Object
    A utility class to handle multipart/form-data requests, the kind of requests that support file uploads. This class uses a "pull" model where the reading of incoming files and parameters is controlled by the client code, which allows incoming files to be stored into any OutputStream. If you wish to use an API which resembles HttpServletRequest, use the "push" model MultipartRequest instead. It's an easy-to-use wrapper around this class.

    This class can receive arbitrarily large files (up to an artificial limit you can set), and fairly efficiently too. It cannot handle nested data (multipart content within multipart content). It can now with the latest release handle internationalized content (such as non Latin-1 filenames).

    It also optionally includes enhanced buffering and Content-Length limitation. Buffering is only required if your servlet container is poorly implemented (many are, including Tomcat 3.2), but it is generally recommended because it will make a slow servlet container a lot faster, and will only make a fast servlet container a little slower. Content-Length limiting is usually only required if you find that your servlet is hanging trying to read the input stram from the POST, and it is similarly recommended because it only has a minimal impact on performance.

    而且里面的API已經封裝程我想象得到的情況了。于是,我就覺得這樣我就可以完成我的功能了。于是,就寫了以下代碼:

    MultipartParser mp = new MultipartParser(request, 10 * 1024 * 1024);
    Part part;
    while ((part = mp.readNextPart()) != null) {
          if (part.isParam()) {
              // it's a parameter part
              ParamPart paramPart = (ParamPart) part;
              //out.println("param: name=" + name + "; value=" + value);
          } else if (part.isFile()) {
              FilePart filePart = (FilePart) part;
              InputStream is = filePart.getInputStream();
              InputStreamReader isr = new InputStreamReader(is);
    
              int ch;
              while ((ch = isr.read()) != -1) {
    
                  out.print((char) ch);
              }
    
              System.out.flush();
              isr.close();
              is.close();
          }
    }
                   

    出去結果如下:

    my name is Rokey.Rokey。
    我的名字叫Rokey.
    到現在,已經可以把這個流封裝成一個文件流,送給Excel的組件去處理了。

    posted @ 2007-12-23 00:52 wonderer 閱讀(1446) | 評論 (0)編輯 收藏

         摘要: 什么是IOC呢,在網上搜到了一非常有意思的講解。IoC就是Inversion of Control,控制反轉。在Java開發中,IoC意味著將你設計好的類交給系統去控制,而不是在你的類內部控制。這稱為控制反轉。 下面我們以幾個例子來說明什么是IoC 假設我們要設計一個Girl和一個Boy類,其中Girl有kiss方法,即Girl想要Kiss一個Boy。那么,我們的問題是,Girl如何能夠認識這個B...  閱讀全文

    posted @ 2007-10-28 16:50 wonderer 閱讀(685) | 評論 (0)編輯 收藏

    Buffloa里的傳遞參數的編碼是GBK。

    buffalo.switchPart('body',url,false);如果url中包含漢字,是采用GBK編碼的。在不改變tomcat的配置文件的情況下,在目標頁面里獲得url參數的正確方法是

       1: String name = new String(request.getParameter("name").getBytes(
       2:             "ISO8859-1"), "GBK");

    注意,如果這里用utf-8作為編碼的轉換的話,會出現亂碼。

    posted @ 2007-10-26 16:41 wonderer 閱讀(432) | 評論 (0)編輯 收藏

    最近在準備考試系統的開發,碰到了 request.getParameter亂碼的問題。跟林彬討論了一下,還是覺得用老方法管用。

    如果是post的話,可以通過設置filter的方法來解決。

    如果是get或者是超鏈接的話,以前是通過設置tomcat的配置文件server.xml來解決的,但這樣不好,并不是所有的項目,我們都可以修改到服務器的tomcat的配置文件。具體代碼如下:

       1: Connector port="8080" maxHttpHeaderSize="8192"
       2:                maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
       3:                enableLookups="false" redirectPort="8443" acceptCount="100"
       4:                connectionTimeout="20000" disableUploadTimeout="true" uRIEncoding="gbk"/>

    還是覺得老方法管用,只是有點麻煩:

       1: String id=new String(request.getParameter("id").getBytes("ISO8859-1"),"UTF-8");
       2: String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");

    posted @ 2007-10-25 23:23 wonderer 閱讀(13436) | 評論 (1)編輯 收藏

    電腦搬回了宿舍,破解了校園網,多人公用一條寬帶。要一個主機撥號。ip總不免要設來設去,總是要手工改,很麻煩,于是上網查了查,寫了個改ip的bat文件。內容如下:

    1: netsh interface ip set address name="本地連接" source=static addr=192.168.0.39

    mask=255.255.255.0 gateway=192.168.0.1 gwmetric=1

       2: netsh interface ip set dns name = "本地連接" source = static addr = 202.116.128.1
       3: netsh interface ip add dns name = "本地連接" addr = 202.116.128.2

    posted @ 2007-09-11 17:25 wonderer 閱讀(2064) | 評論 (1)編輯 收藏

    在寫HTML中,并不是&nbsp才會產生一個空格。<td>hello (間隔一個空格)</td>輸出的數據是: hello+一個空格.如果是對這數據進行修改然后再寫回到數據庫的話,這樣就會產生錯誤。

    如下寫法是會錯誤的,

    image

    造成的結果是 image  仔細留意會發現運通后面多了一個空格

    必須改成一下寫法:

    image 

    注意</td>跟前面是沒有空格的。這樣運行結果就會是這樣的image ,是沒有空格的。

    posted @ 2007-08-03 10:32 wonderer 閱讀(677) | 評論 (0)編輯 收藏

         摘要: 寫了個Spring的DAO入門例子。 DAO的接口 1: package dataSourceDemo; 2:   3: public interface IUserDAO { 4: public void insert(User user); 5: public User find(Integer id); 6:   7: } ...  閱讀全文

    posted @ 2007-07-18 14:04 wonderer 閱讀(496) | 評論 (0)編輯 收藏

    首先要導入包

    1:Spring支持包:spring.jar , commons-logging.jar

    2: JUnit支持包: JUnit.jar

    image

    建立Bean類,

       1: package refBeanDemo;
       2:  
       3: import java.util.Date;
       4:  
       5: public class HelloBean {
       6:     private String helloWorld;
       7:     private Date date;
       8:     public Date getDate() {
       9:         return date;
      10:     }
      11:     public void setDate(Date date) {
      12:         this.date = date;
      13:     }
      14:     public String getHelloWorld() {
      15:         return helloWorld;
      16:     }
      17:     public void setHelloWorld(String helloWorld) {
      18:         this.helloWorld = helloWorld;
      19:     }
      20:     
      21: }

     

    建立配置文件,和在里面進行注入

       1: <?xml version="1.0" encoding="UTF-8"?>
       2: <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "../resources/spring-beans-2.0.dtd" >
       3: <beans>
       4:     <bean id="dateBean" class="java.util.Date"></bean>
       5:     
       6:     <bean id="helloBean" class="refBeanDemo.HelloBean">
       7:         <property name="helloWorld">
       8:             <value>你好,世界</value>
       9:         </property>
      10:         <property name="date" ref="dateBean"></property>
      11:     </bean>
      12: </beans>

    寫JUnit進行測試,方便管理,把JUnit的東東放到test包里。

       1: package refBeanDemo;
       2:  
       3: import org.springframework.context.ApplicationContext;
       4: import org.springframework.context.support.ClassPathXmlApplicationContext;
       5:  
       6: import junit.framework.TestCase;
       7:  
       8: public class TestRefBeanDemo extends TestCase {
       9:     private ApplicationContext context;
      10:  
      11:     public void setUp() {
      12:         context = new ClassPathXmlApplicationContext("refBeanDemo/NewFile.xml");
      13:     }
      14:  
      15:     public void testSpring() {
      16:         HelloBean helloBean = (HelloBean)context.getBean("helloBean");
      17:         System.out.println(helloBean.getDate());
      18:         assertEquals("你好,世界", helloBean.getHelloWorld());
      19:         
      20:     }
      21: }

     

    運行JUnit測試

    image

    測試成功。類的分布如下:

    image

    image

    posted @ 2007-07-18 11:12 wonderer 閱讀(1356) | 評論 (0)編輯 收藏

    ARP地址欺騙類病毒(以下簡稱ARP病毒)是一類特殊的病毒,該病毒一般屬于木馬(Trojan)病毒,不具備主動傳播的特性,不會自我復制。但是由于其發作的時候會向全網發送偽造的ARP數據包,干擾全網的運行,因此它的危害比一些蠕蟲還要嚴重得多。

    二、ARP病毒發作時的現象

    網絡掉線,但網絡連接正常,內網的部分PC機不能上網,或者所有電腦不能上網,無法打開網頁或打開網頁慢,局域網時斷時續并且網速較慢等。

    三、ARP病毒原理

    3.1 網絡模型簡介

    眾所周知,按照OSI (Open Systems Interconnection Reference Model 開放系統互聯參考模型) 的觀點,可將網絡系統劃分為7層結構,每一個層次上運行著不同的協議和服務,并且上下層之間互相配合,完成網絡數據交換的功能,如圖1:

    1106901

    圖1 OSI網絡體系模型

    然而,OSI的模型僅僅是一個參考模型,并不是實際網絡中應用的模型。實際上應用最廣泛的商用網絡模型即TCP/IP體系模型,將網絡劃分為四層,每一個層次上也運行著不同的協議和服務,如圖2。

    1106903

    圖2 TCP/IP四層體系模型及其配套協議

    上圖中,藍色字體表示該層的名稱,綠色字表示運行在該層上的協議。由圖2可見,我們即將要討論的ARP協議,就是工作在網際層上的協議。

    3.2 ARP協議簡介


    我們大家都知道,在局域網中,一臺主機要和另一臺主機進行通信,必須要知道目標主機 的IP地址,但是最終負責在局域網中傳送數據的網卡等物理設備是不識別IP地址的,只能識別其硬件地址即MAC地址。MAC地址是48位的,通常表示為 12個16進制數,每2個16進制數之間用“-”或者冒號隔開,如:00-0B-2F-13-1A-11就是一個MAC地址。每一塊網卡都有其全球唯一的 MAC地址,網卡之間發送數據,只能根據對方網卡的MAC地址進行發送,這時就需要一個將高層數據包中的IP地址轉換成低層MAC地址的協議,而這個重要 的任務將由ARP協議完成。

    ARP全稱為Address Resolution Protocol,地址解析協議。所謂“地址解析”就是主機在發送數據包前將目標主機IP地址轉換成目標主機MAC地址的過程。ARP協議的基本功能就是 通過目標設備的IP地址,查詢目標設備的MAC地址,以保證通信的順利進行。 這時就涉及到一個問題,一個局域網中的電腦少則幾臺,多則上百臺,這么多的電腦之間,如何能準確的記住對方電腦網卡的MAC地址,以便數據的發送呢?這就 涉及到了另外一個概念,ARP緩存表。在局域網的任何一臺主機中,都有一個ARP緩存表,該表中保存這網絡中各個電腦的IP地址和MAC地址的對照關系。 當這臺主機向同局域網中另外的主機發送數據的時候,會根據ARP緩存表里的對應關系進行發送。

    下面,我們用一個模擬的局域網環境,來說明ARP欺騙的過程。

    3.3 ARP欺騙過程


    假設一個只有三臺電腦組成的局域網,該局域網由交換機(Switch)連接。其中一 個電腦名叫A,代表攻擊方;一臺電腦叫S,代表源主機,即發送數據的電腦;令一臺電腦名叫D,代表目的主機,即接收數據的電腦。這三臺電腦的IP地址分別 為192.168.0.2,192.168.0.3,192.168.0.4。MAC地址分別為MAC_A,MAC_S,MAC_D。其網絡拓撲環境如圖 3。

    1106905

    圖3 網絡拓撲

    現在,S電腦要給D電腦發送數據了,在S電腦內部,上層的TCP和UDP的數據包已經傳送到 了最底層的網絡接口層,數據包即將要發送出去,但這時還不知道目的主機D電腦的MAC地址MAC_D。這時候,S電腦要先查詢自身的ARP緩存表,查看里 面是否有192.168.0.4這臺電腦的MAC地址,如果有,那很好辦,就將 封裝在數據包的外面。直接發送出去即可。如果沒有,這時S電腦要向全網絡發送一個ARP廣播包,大聲詢問:“我的IP是192.168.0.3,硬件地址 是MAC_S,我想知道IP地址為192.168.0.4的主機的硬件地址是多少?” 這時,全網絡的電腦都收到該ARP廣播包了,包括A電腦和D電腦。A電腦一看其要查詢的IP地址不是自己的,就將該數據包丟棄不予理會。而D電腦一看IP 地址是自己的,則回答S電腦:“我的IP地址是192.168.0.4,我的硬件地址是MAC_D”需要注意的是,這條信息是單獨回答的,即D電腦單獨向 S電腦發送的,并非剛才的廣播。現在S電腦已經知道目的電腦D的MAC地址了,它可以將要發送的數據包上貼上目的地址MAC_D,發送出去了。同時它還會 動態更新自身的ARP緩存表,將192.168.0.4-MAC_D這一條記錄添加進去,這樣,等S電腦下次再給D電腦發送數據的時候,就不用大聲詢問發 送ARP廣播包了。這就是正常情況下的數據包發送過程。

    這樣的機制看上去很完美,似乎整個局域網也天下太平,相安無事。但是,上述數據發 送機制有一個致命的缺陷,即它是建立在對局域網中電腦全部信任的基礎上的,也就是說它的假設前提是:無論局域網中那臺電腦,其發送的ARP數據包都是正確 的。那么這樣就很危險了!因為局域網中并非所有的電腦都安分守己,往往有非法者的存在。比如在上述數據發送中,當S電腦向全網詢問“我想知道IP地址為 192.168.0.4的主機的硬件地址是多少?”后,D電腦也回應了自己的正確MAC地址。但是當此時,一向沉默寡言的A電腦也回話了:“我的IP地址 是192.168.0.4,我的硬件地址是MAC_A” ,注意,此時它竟然冒充自己是D電腦的IP地址,而MAC地址竟然寫成自己的!由于A電腦不停地發送這樣的應答數據包,本來S電腦的ARP緩存表中已經保 存了正確的記錄:192.168.0.4-MAC_D,但是由于A電腦的不停應答,這時S電腦并不知道A電腦發送的數據包是偽造的,導致S電腦又重新動態 更新自身的ARP緩存表,這回記錄成:192.168.0.4-MAC_A,很顯然,這是一個錯誤的記錄(這步也叫ARP緩存表中毒),這樣就導致以后凡 是S電腦要發送給D電腦,也就是IP地址為192.168.0.4這臺主機的數據,都將會發送給MAC地址為MAC_A的主機,這樣,在光天化日之下,A 電腦竟然劫持了由S電腦發送給D電腦的數據!這就是ARP欺騙的過程。

    如果A這臺電腦再做的“過分”一些,它不冒充D電腦,而是冒充網關,那后果會怎么 樣呢?我們大家都知道,如果一個局域網中的電腦要連接外網,也就是登陸互聯網的時候,都要經過局域網中的網關轉發一下,所有收發的數據都要先經過網關,再 由網關發向互聯網。在局域網中,網關的IP地址一般為192.168.0.1。如果A這臺電腦向全網不停的發送ARP欺騙廣播,大聲說:“我的IP地址是 192.168.0.1,我的硬件地址是MAC_A”這時局域網中的其它電腦并沒有察覺到什么,因為局域網通信的前提條件是信任任何電腦發送的ARP廣播 包。這樣局域網中的其它電腦都會更新自身的ARP緩存表,記錄下192.168.0.1-MAC_A這樣的記錄,這樣,當它們發送給網關,也就是IP地址 為192.168.0.1這臺電腦的數據,結果都會發送到MAC_A這臺電腦中!這樣,A電腦就將會監聽整個局域網發送給互聯網的數據包!

    實際上,這種病毒早就出現過,這就是ARP地址欺騙類病毒。一些傳奇木馬 (Trojan/PSW.LMir)具有這樣的特性,該木馬一般通過傳奇外掛、網頁木馬等方式使局域網中的某臺電腦中毒,這樣中毒電腦便可嗅探到整個局域 網發送的所有數據包,該木馬破解了《傳奇》游戲的數據包加密算法,通過截獲局域網中的數據包,分析數據包中的用戶隱私信息,盜取用戶的游戲帳號和密碼。在 解析這些封包之后,再將它們發送到真正的網關。這樣的病毒有一個令網吧游戲玩家聞之色變的名字:“傳奇網吧殺手” !

    四、ARP病毒新的表現形式


    由于現在的網絡游戲數據包在發送過程中,均已采用了強悍的加密算法,因此這類ARP 病毒在解密數據包的時候遇到了很大的難度。現在又新出現了一種ARP病毒,與以前的一樣的是,該類ARP病毒也是向全網發送偽造的ARP欺騙廣播,自身偽 裝成網關。但區別是,它著重的不是對網絡游戲數據包的解密,而是對于HTTP請求訪問的修改。

    HTTP是應用層的協議,主要是用于WEB網頁訪問。還是以上面的局域網環境舉 例,如果局域網中一臺電腦S要請求某個網站頁面,如想請求www.sina.com.cn這個網頁,這臺電腦會先向網關發送HTTP請求,說:“我想登陸 www.sina.com.cn網頁,請你將這個網頁下載下來,并發送給我。”這樣,網關就會將www.sina.com.cn頁面下載下來,并發送給S 電腦。這時,如果A這臺電腦通過向全網發送偽造的ARP欺騙廣播,自身偽裝成網關,成為一臺ARP中毒電腦的話,這樣當S電腦請求WEB網頁時,A電腦先 是“好心好意”地將這個頁面下載下來,然后發送給S電腦,但是它在返回給S電腦時,會向其中插入惡意網址連接!該惡意網址連接會利用MS06-014和 MS07-017等多種系統漏洞,向S電腦種植木馬病毒!同樣,如果D電腦也是請求WEB頁面訪問,A電腦同樣也會給D電腦返回帶毒的網頁,這樣,如果一 個局域網中存在這樣的ARP病毒電腦的話,頃刻間,整個網段的電腦將會全部中毒!淪為黑客手中的僵尸電腦!

    案例:


    某企業用戶反映,其內部局域網用戶無論訪問那個網站,KV殺毒軟件均報病毒:Exploit.ANIfile.o 。

    在經過對該局域網分析之后,發現該局域網中有ARP病毒電腦導致其它電腦訪問網頁 時,返回的網頁帶毒,并且該帶毒網頁通過MS06-014和MS07-017漏洞給電腦植入一個木馬下載器,而該木馬下載器又會下載10多個惡性網游木 馬,可以盜取包括魔獸世界,傳奇世界,征途,夢幻西游,邊鋒游戲在內的多款網絡游戲的帳號和密碼,對網絡游戲玩家的游戲裝備造成了極大的損失。被ARP病 毒電腦篡改的網頁如圖4。

    1108133

    圖4 被ARP病毒插入的惡意網址連接

    從圖4中可以看出,局域網中存在這樣的ARP病毒電腦之后,其它客戶機無論訪問什么網頁,當返回該網頁時,都會被插入一條惡意網址連接,如果用戶沒有打過相應的系統補丁,就會感染木馬病毒。

    五、ARP病毒電腦的定位方法


    下面,又有了一個新的課題擺在我們面前:如何能夠快速檢測定位出局域網中的ARP病毒電腦?

    面對著局域網中成百臺電腦,一個一個地檢測顯然不是好辦法。其實我們只要利用ARP 病毒的基本原理:發送偽造的ARP欺騙廣播,中毒電腦自身偽裝成網關的特性,就可以快速鎖定中毒電腦。可以設想用程序來實現以下功能:在網絡正常的時候, 牢牢記住正確網關的IP地址和MAC地址,并且實時監控著來自全網的ARP數據包,當發現有某個ARP數據包廣播,其IP地址是正確網關的IP地址,但是 其MAC地址竟然是其它電腦的MAC地址的時候,這時,無疑是發生了ARP欺騙。對此可疑MAC地址報警,在根據網絡正常時候的IP-MAC地址對照表查 詢該電腦,定位出其IP地址,這樣就定位出中毒電腦了。下面詳細說一下幾種不同的檢測ARP中毒電腦的方法。

    5.1 命令行法


    這種方法比較簡便,不利用第三方工具,利用系統自帶的ARP命令即可完成。上文已經 說過,當局域網中發生ARP欺騙的時候,ARP病毒電腦會向全網不停地發送ARP欺騙廣播,這時局域網中的其它電腦就會動態更新自身的ARP緩存表,將網 關的MAC地址記錄成ARP病毒電腦的MAC地址,這時候我們只要在其它受影響的電腦中查詢一下當前網關的MAC地址,就知道中毒電腦的MAC地址了,查 詢命令為 ARP -a,需要在cmd命令提示行下輸入。輸入后的返回信息如下:

    Internet Address      Physical Address        Type

    192.168.0.1 00-50-56-e6-49-56 dynamic

    這時,由于這個電腦的ARP表是錯誤的記錄,因此,該MAC地址不是真正網關的MAC地址, 而是中毒電腦的MAC地址!這時,再根據網絡正常時,全網的IP—MAC地址對照表,查找中毒電腦的IP地址就可以了。由此可見,在網絡正常的時候,保存 一個全網電腦的IP—MAC地址對照表是多么的重要。可以使用nbtscan 工具掃描全網段的IP地址和MAC地址,保存下來,以備后用。

    5.2 工具軟件法


    現在網上有很多ARP病毒定位工具,其中做得較好的是Anti ARP Sniffer(現在已更名為ARP防火墻),下面我就演示一下使用Anti ARP Sniffer這個工具軟件來定位ARP中毒電腦。

    首先打開Anti ARP Sniffer 軟件,輸入網關的IP地址之后,再點擊紅色框內的“枚舉MAC”按鈕,即可獲得正確網關的MAC地址,如圖5。

    1109953

    圖5 輸入網關IP地址后,枚舉MAC

    接著點擊“自動保護”按鈕,即可保護當前網卡與網關的正常通信。如圖6。

    1109955

    圖6 點擊自動保護按鈕

    當局域網中存在ARP欺騙時,該數據包會被Anti ARP Sniffer記錄,該軟件會以氣泡的形式報警。如圖7。

    1109957

    圖7 Anti ARP Sniffer 的攔截記錄

    這時,我們再根據欺騙機的MAC地址,對比查找全網的IP-MAC地址對照表,即可快速定位出中毒電腦。

    5.3 Sniffer 抓包嗅探法

    當局域網中有ARP病毒欺騙時,往往伴隨著大量的ARP欺騙廣播數據包,這時,流量檢測機制應該能夠很好的檢測出網絡的異常舉動,此時Ethereal 這樣的抓包工具就能派上用場。如圖8。

    1109959

    圖8 用Ethereal抓包工具定位出ARP中毒電腦

    從圖8中的紅色框內的信息可以看出,192.168.0.109 這臺電腦正向全網發送大量的ARP廣播包,一般的講,局域網中有電腦發送ARP廣播包的情況是存在的,但是如果不停的大量發送,就很可疑了。而這臺192.168.0.109 電腦正是一個ARP中毒電腦。

    以上三種方法有時需要結合使用,互相印證,這樣可以快速準確的將ARP中毒電腦定位出來。

    七、ARP病毒的網絡免疫措施


    由于ARP病毒的種種網絡特性,可以采用一些技術手段進行網絡中ARP病毒欺騙數據包免疫。即便網絡中有ARP中毒電腦,在發送欺騙的ARP數據包,其它電腦也不會修改自身的ARP緩存表,數據包始終發送給正確的網關,用的比較多的辦法是“雙向綁定法” 。

    雙向綁定法,顧名思義,就是要在兩端綁定IP-MAC地址,其中一端是在路由器中, 把所有PC的IP-MAC輸入到一個靜態表中,這叫路由器IP-MAC綁定。令一端是局域網中的每個客戶機,在客戶端設置網關的靜態ARP信息,這叫PC 機IP-MAC綁定。客戶機中的設置方法如下:

    新建記事本,輸入如下命令:

    arp -d
    arp -s 192.168.0.1 00-e0-4c-8c-9a-47

    其中,“arp –d” 命令是清空當前的ARP緩存表,而“arp -s 192.168.0.1 00-e0-4c-8c-9a-47 ”命令則是將正確網關的IP地址和MAC地址綁定起來,將這個批處理文件放到系統的啟動目錄中,可以實現每次開機自運行,這一步叫做“固化arp表” 。

    “雙向綁定法”一般在網吧里面應用的居多。

    除此之外,很多交換機和路由器廠商也推出了各自的防御ARP病毒的軟硬產品,如:華 為的H3C AR 18-6X 系列全千兆以太網路由器就可以實現局域網中的ARP病毒免疫,該路由器提供MAC和IP地址綁定功能,可以根據用戶的配置,在特定的IP地址和MAC地址 之間形成關聯關系。對于聲稱從這個IP地址發送的報文,如果其MAC地址不是指定關系對中的地址,路由器將予以丟棄,是避免IP地址假冒攻擊的一種方式。

    八、ARP病毒KV解決方案

    針對ARP病毒日益猖獗的情況,江民科技推出了整體解決方案:

    1.KV殺毒軟件每周7天不間斷升級病毒庫,單機版網絡版同步升級,實時攔截來自網絡上的各種ARP病毒。

    2.針對局域網用戶,建議統一部署KV網絡版殺毒軟件,KV網絡版具有全網統一升級病毒庫,統一全網殺毒的強大功能,可以徹底查殺來自局域網中的ARP病毒。

    3.“KV未知病毒掃描”功能可以識別出絕大多數ARP病毒,KV未知病毒掃描程序采用獨特的行為判定技術,可以徹底檢測出本機中已知和未知的ARP病毒,協助網絡管理員快速清除ARP病毒。

    4.特針對企業用戶,提供“ARP病毒應急響應服務” ,江民科技網絡安全工程師可以上門處理企業用戶內網中的ARP病毒,確保快速恢復企業網絡的數據通訊安全。

    5.KV新版防火墻特增加了ARP病毒防御功能,可以攔截來自局域網中的ARP欺騙數據包,保護本機聯網安全。設置界面如圖11。

    1112749

    圖11 KV新版防火墻增加了ARP攻擊防護功能

    KV新版防火墻增加了ARP攻擊防護功能,該功能使用方法也很簡單,安裝完KV防火墻之后, 點擊“設置”按鈕,然后勾選“啟用攻擊防護功能” ,再點擊“自動檢測本機網絡設置” ,程序就會自動獲得本機和網關的IP地址和MAC地址,然后點擊確定即可。KV防火墻就會實時檢測來自網絡中的ARP數據包,發現有異常的數據包欺騙,就 會予以攔截,保障本機網絡通信安全。

    九、關于ARP病毒的網絡安全建議

    1.在網絡正常時候保存好全網的IP—MAC地址對照表,這樣在查找ARP中毒電腦時很方便。

    2.都全網的電腦都打上MS06-014和MS07-017這兩個補丁,包括所有的客戶端和服務器,以免感染網頁木馬。

    3.部署網絡流量檢測設備,時刻監視全網的ARP廣播包,查看其MAC地址是否正確。

    4.做好IP—MAC地址的綁定工作,對于從這個IP地址發送的報文,如果其MAC地址不是指定關系對中的地址,予以丟棄。

    5.部署網絡版的殺毒軟件,定期升級病毒庫,定期全網殺毒。

    posted @ 2007-06-22 21:11 wonderer 閱讀(275) | 評論 (0)編輯 收藏

    找到SQLServer的安裝目錄,我的是"E:\Program Files\Microsoft SQL Server",在Binn里找到文件"sqlservr.exe",就可以查看版本了。

    image

    以下是版本號的對照:

    SQL Server Versions
    @Version SQL Server Version Released
    6.50.201 SQL Server 6.5 RTM
    6.50.213 SQL Server 6.5 with Service Pack 1
    6.50.240 SQL Server 6.5 with Service Pack 2
    6.50.258 SQL Server 6.5 with Service Pack 3
    6.50.281 SQL Server 6.5 with Service Pack 4
    6.50.415 SQL Server 6.5 with Service Pack 5
    6.50.416 SQL Server 6.5 with Service Pack 5a
    7.00.623 SQL Server 7.0 / MSDE 1.0 RTM
    7.00.699 SQL Server 7.0 SP1 July 1999
    7.00.842 SQL Server 7.0 SP2 March 20th, 2000
    7.00.961 SQL Server 7.0 SP3 December 15th, 2000
    7.00.1063 SQL Server 7.0 SP4
    8.00.194 SQL Server 2000 RTM
    8.00.384 SQL Server 2000 SP1
    8.00.534 SQL Server 2000 SP2 November 30th, 2001
    8.00.760 SQL Server 2000 SP3
    8.00.2039 SQL Server 2000 SP4

    posted @ 2007-06-02 21:53 wonderer 閱讀(1709) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲AV无码国产一区二区三区| 9久久免费国产精品特黄| 亚洲国产精品丝袜在线观看| 伊人免费在线观看高清版| 亚洲国产中文在线二区三区免| 国产在线ts人妖免费视频| 久艹视频在线免费观看| 亚洲第一成年网站视频| 亚洲国产成人一区二区精品区| 无码国产精品久久一区免费| 中文字幕在线免费观看视频| 亚洲娇小性色xxxx| 久久久久久久尹人综合网亚洲| 日本特黄特色免费大片| 亚洲国产成人超福利久久精品| 国产亚洲福利一区二区免费看| 亚洲色精品88色婷婷七月丁香| 18禁成年无码免费网站无遮挡 | jzzjzz免费观看大片免费| 亚洲啪啪免费视频| 亚洲精品少妇30p| 成人免费777777| 真实国产乱子伦精品免费| 一级毛片成人免费看a| 亚洲愉拍一区二区三区| 99久久亚洲综合精品成人网| 亚洲一级特黄大片无码毛片| 成年女人毛片免费观看97| 97视频免费观看2区| 国产va免费观看| 国产成人高清亚洲一区91| 亚洲日本久久久午夜精品| 亚洲图片一区二区| 国产精品亚洲一区二区三区在线 | 1000部免费啪啪十八未年禁止观看| 国产亚洲情侣久久精品| 亚洲中文字幕乱码一区| 91午夜精品亚洲一区二区三区| 亚洲国产精华液网站w| 亚洲永久精品ww47| 亚洲情侣偷拍精品|