一種阻止漏洞利用的方法及裝置制造方法
【專利摘要】本發(fā)明公開了一種阻止漏洞利用的方法及裝置,屬于計算機領(lǐng)域。所述方法包括:獲取軟件訪問內(nèi)存的訪問信息,所述訪問信息包括所述軟件在運行過程中訪問內(nèi)存的內(nèi)存地址或者所述軟件在運行過程中發(fā)生的異常所在的線程對應的結(jié)構(gòu)化異常處理鏈;根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用;如果所述軟件存在的漏洞被利用,則結(jié)束所述軟件繼續(xù)運行,以實現(xiàn)阻止所述軟件的漏洞被利用。所述裝置包括:獲取模塊、確定模塊和結(jié)束模塊。本發(fā)明能夠成功阻止漏洞利用同時不影響系統(tǒng)運行。
【專利說明】—種阻止漏洞利用的方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機領(lǐng)域,特別涉及一種阻止漏洞利用的方法及裝置。
【背景技術(shù)】
[0002]軟件在日常生活和工作中應用越來越多,其安全性非常重要,但是軟件畢竟是人為編寫的,漏洞產(chǎn)生在所難免。在發(fā)現(xiàn)漏洞之后到軟件開發(fā)商發(fā)布漏洞修補補丁之間存在一段空檔期,在這段空檔期內(nèi)需要阻止黑客利用漏洞進行破壞。
[0003]目前現(xiàn)有技術(shù)通過殺毒軟件來阻止黑客利用軟件中存在的漏洞,可以為:殺毒軟件對終端上的整個軟件系統(tǒng)進行保護,當發(fā)現(xiàn)軟件系統(tǒng)中的某個軟件存在漏洞時,則結(jié)束該軟件繼續(xù)運行。由于結(jié)束該軟件運行后,黑客就無法利用該軟件的漏洞,所以實現(xiàn)阻止黑客利用該軟件中存在的漏洞來進行破壞。
[0004]在實現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問題:
[0005]在現(xiàn)有技術(shù)中,殺毒軟件是對整個軟件系統(tǒng)進行保護的,如果殺毒軟件保護太松,可能會遺漏個別漏洞,如果殺毒軟件保護太嚴,會影響系統(tǒng)正常運行。
【發(fā)明內(nèi)容】
[0006]為了能成功阻止漏洞利用同時不影響系統(tǒng)運行,本發(fā)明提供了一種阻止漏洞利用的方法及裝置。所述技術(shù)方案如下:
[0007]—種阻止漏洞利用的方法,所述方法包括:
[0008]獲取軟件訪問內(nèi)存的訪問信息,所述訪問信息包括所述軟件在運行過程中訪問內(nèi)存的內(nèi)存地址或者所述軟件在運行過程中發(fā)生的異常所在的線程對應的結(jié)構(gòu)化異常處理鏈;
[0009]根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用;
[0010]如果所述軟件存在的漏洞被利用,則結(jié)束所述軟件繼續(xù)運行,以實現(xiàn)阻止所述軟件的漏洞被利用。
[0011]一種阻止漏洞利用的裝置,所述裝置包括:
[0012]獲取模塊,用于獲取軟件訪問內(nèi)存的訪問信息,所述訪問信息包括所述軟件在運行過程中訪問內(nèi)存的內(nèi)存地址或者所述軟件在運行過程中發(fā)生的異常所在的線程對應的結(jié)構(gòu)化異常處理鏈;
[0013]確定模塊,用于確定所述軟件存在的漏洞是否被利用;
[0014]結(jié)束模塊,用于如果所述軟件存在的漏洞被利用,則結(jié)束所述軟件繼續(xù)運行,以實現(xiàn)阻止所述軟件的漏洞被利用;
[0015]在本發(fā)明實施例中,獲取軟件訪問內(nèi)存的訪問信息;根據(jù)訪問信息確定所述軟件存在的漏洞是否被利用;如果被利用,則結(jié)束軟件運行。能成功阻止漏洞利用同時不影響系統(tǒng)運行。
【專利附圖】
【附圖說明】
[0016]圖1是本發(fā)明實施例1提供的一種阻止軟件漏洞利用的方法流程圖;
[0017]圖2-1是本發(fā)明實施例2提供的一種阻止軟件漏洞利用的方法流程圖;
[0018]圖2-2是本發(fā)明實施例2提供的一種內(nèi)存空間不意圖;
[0019]圖3-1是本發(fā)明實施例3提供的一種阻止軟件漏洞利用的方法流程圖;
[0020]圖3-2 是本發(fā)明實施例 3 提供的第一種 SEH (Structured Except1n Handling,結(jié)構(gòu)化異常處理)鏈結(jié)構(gòu)示意圖;
[0021]圖3-3是本發(fā)明實施例3提供的第二種SHl鏈結(jié)構(gòu)示意圖;
[0022]圖4是本發(fā)明實施例4提供的一種阻止軟件漏洞利用的裝置結(jié)構(gòu)示意圖。
【具體實施方式】
[0023]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明實施方式作進一步地詳細描述。
[0024]實施例1
[0025]參見圖1,本發(fā)明實施例提供了一種阻止軟件漏洞利用的方法,包括:
[0026]步驟101:獲取軟件訪問內(nèi)存的訪問信息,訪問信息包括軟件在運行過程中訪問內(nèi)存的內(nèi)存地址或者軟件在運行過程中發(fā)生的異常所在的線程對應的SHl鏈;
[0027]步驟102:根據(jù)訪問信息,確定軟件存在的漏洞是否被利用;
[0028]步驟103:如果軟件存在的漏洞被利用,則結(jié)束軟件繼續(xù)運行,以實現(xiàn)阻止軟件的漏洞被利用。
[0029]在本發(fā)明實施例中,獲取軟件訪問內(nèi)存的訪問信息;根據(jù)訪問信息確定所述軟件存在的漏洞是否被利用;如果被利用,則結(jié)束軟件運行。能成功阻止漏洞利用同時不影響系統(tǒng)運行。
[0030]實施例2
[0031]在實施例1所示的方法基礎(chǔ)之上,本發(fā)明實施例提供了一種阻止軟件漏洞利用的方法。
[0032]其中,該方法獲取軟件運行過程中訪問內(nèi)存的內(nèi)存地址,根據(jù)該內(nèi)存地址確定軟件存在的漏洞是否被利用,如果該軟件存在的漏洞被利用,則結(jié)束該軟件繼續(xù)運行,以實現(xiàn)阻止該軟件的漏洞被利用。
[0033]參見圖2-1,該方法包括:
[0034]步驟201:獲取該軟件運行過程中訪問內(nèi)存的內(nèi)存地址;
[0035]進一步地,在執(zhí)行本步驟之前,還可以包括:
[0036]當該軟件啟動時,在該軟件對應的地址列表中將與空操作指令相同的內(nèi)存地址對應的屬性信息修改為不可讀不可寫。
[0037]其中,可以通過Virtual Alloc系列函數(shù)來在該軟件對應的地址列表中將與空操作指令相同的內(nèi)存地址對應的屬性信息修改為不可讀不可寫。
[0038]其中,該軟件中包括多個類,當該軟件啟動時,該軟件會為其包括的類申請內(nèi)存空間。參見圖2-2,該內(nèi)存空間用于存儲該類包括的函數(shù)、虛表和該虛表的地址,該虛表用于存儲該類包括的函數(shù)的地址。
[0039]其中,該軟件為其包括的類申請內(nèi)存空間時,創(chuàng)建其對應的一個地址列表,該地址列表用于存儲該內(nèi)存空間中包括的內(nèi)存地址與屬性信息的對應關(guān)系。該軟件還保存每個類對應的指針,每個類對應的指針分別用于指向每個類對應的內(nèi)存空間。
[0040]當軟件需要調(diào)用某個類的函數(shù)時,該軟件根據(jù)該類的指針定位到該類對應的內(nèi)存空間,從該內(nèi)存空間中獲取虛表地址,根據(jù)該虛表地址定位出對應的虛表,根據(jù)該函數(shù)的偏移量,從該虛表中獲取該函數(shù)的地址,根據(jù)該函數(shù)的地址來調(diào)用該函數(shù)。
[0041]需要說明的是:該軟件可能存在漏洞,當該軟件運行到其存在的漏洞時,該軟件可能釋放掉其申請的內(nèi)存空間,并且在釋放其申請的內(nèi)存空間之后還可能去訪問其釋放的內(nèi)存空間。
[0042]其中,目前黑客可以利用該軟件存在的漏洞,具體為:當該軟件釋放其申請的內(nèi)存空間時,黑客可以將該內(nèi)存空間中的虛表的地址替換為與空操作指令相同的內(nèi)存地址,在該內(nèi)存地址對應的內(nèi)存空間中存儲該內(nèi)存地址,且存儲該內(nèi)存地址個數(shù)與該虛表中包括的函數(shù)的地址的個數(shù)相同,然后再在該內(nèi)存地址對應的內(nèi)存空間中的最后一行內(nèi)存地址后存儲惡意代碼。
[0043]當該軟件因存在的漏洞又重新調(diào)用某個類的函數(shù),該軟件根據(jù)該類的指針定位到該類對應的內(nèi)存空間,從該內(nèi)存空間中獲取虛表的地址。由于該虛表的地址已被黑客替換為與空操作指令相同的內(nèi)存地址,所以該軟件根據(jù)虛表的地址,定位出該內(nèi)存地址對應的內(nèi)存空間,根據(jù)該函數(shù)的偏移量,從定位出的內(nèi)存空間中獲取該函數(shù)的地址。由于定位出的內(nèi)存空間中存儲的都是該內(nèi)存地址,所以該軟件根據(jù)該函數(shù)地址又重新定位出該內(nèi)存空間,此時該軟件將該內(nèi)存空間中存儲的內(nèi)存地址作為空指令進行執(zhí)行,直到執(zhí)行到惡意代碼進行破壞。因此本發(fā)明實施例可以利用如下202至204的步驟來阻止該軟件存在的漏洞被黑客利用。
[0044]其中,與空操作指令相同的內(nèi)存地址即可以作為內(nèi)存地址,又可以作為空操作指令,包括 0x0a0a0a0a、0x0b0b0b0b、0x0c0c0c0c、0x0d0d0d0d、0x0e0e0e0e、0x0f0f0f0f、0x14141414和0x15151515中的至少一者。例如,對于OxOaOaOaOa這個數(shù)據(jù),即可以作為空操作指令,又可以作為內(nèi)存地址。
[0045]步驟202:根據(jù)獲取的內(nèi)存地址,確定該軟件存在的漏洞是否被利用,如果該軟件存在的漏洞被利用,則執(zhí)行步驟203 ;
[0046]具體地,本步驟可以通過如下第一和第二兩種方式來實現(xiàn),包括:
[0047]第一、判斷獲取的內(nèi)存地址是否與空操作指令相同,如果是,則確定出該軟件存在的漏洞被利用,如果否,則確定出該軟件存在的漏洞沒有被利用。
[0048]其中,將獲取的內(nèi)存地址與已存儲的空操作指令表中包括的每個空操作指令進行比較,如果比較出該空操作指令表中存在與獲取的內(nèi)存地址相同的空操作指令,則判斷出獲取的內(nèi)存地址與空操作指令相同,如果比較出該空操作指令表中不存在與獲取的內(nèi)存地址相同的空操作指令。則判斷出獲取的內(nèi)存地址與空操作指令不同。
[0049]第二,對獲取的內(nèi)存地址對應的內(nèi)存空間進行判斷,如果該內(nèi)存空間不可讀不可寫,則確定出該軟件存在的漏洞被利用,如果該內(nèi)存空間可讀或可寫,則確定出該軟件存在的漏洞沒有被利用。
[0050]其中,根據(jù)獲取的內(nèi)存地址,從該軟件對應的地址列表中獲取該內(nèi)存地址的屬性信息,地址列表用于存儲內(nèi)存地址與屬性信息的對應關(guān)系;如果該屬性信息為不可讀不可寫,則判斷出該內(nèi)存地址對應的內(nèi)存空間不可讀不可寫;如果該屬性信息為可讀或可寫,則判斷出該內(nèi)存地址對應的內(nèi)存空間可讀或可寫。
[0051]步驟203:結(jié)束該軟件繼續(xù)運行,以實現(xiàn)阻止該軟件的漏洞被利用;
[0052]具體地,結(jié)束用于運行該軟件的進程,以實現(xiàn)結(jié)束該軟件繼續(xù)運行。
[0053]其中,當該軟件啟動時,操作系統(tǒng)為該軟件分配一個進程,該進程用于運行該軟件。
[0054]步驟204:顯示提示信息給用戶,以提示用戶因該軟件存在的漏洞被利用而結(jié)束該軟件繼續(xù)運行。
[0055]其中,當發(fā)現(xiàn)該軟件存在的漏洞被利用時給用戶以提示,例如“該軟件存在的漏洞正在被利用,處于安全考慮將結(jié)束該軟件運行”等等。
[0056]在本發(fā)明實施例中,獲取該軟件運行過程中訪問內(nèi)存的內(nèi)存地址,根據(jù)獲取的內(nèi)存地址,確定該軟件存在的漏洞是否被利用,如果該軟件存在的漏洞被利用,顯示提示信息給用戶,以提示用戶因該軟件存在的漏洞被利用而結(jié)束該軟件繼續(xù)運行,以實現(xiàn)阻止該軟件的漏洞被利用。能成功阻止漏洞利用同時不影響系統(tǒng)運行。
[0057]實施例3
[0058]在實施例1所示的方法基礎(chǔ)之上,本發(fā)明實施例提供了一種阻止軟件漏洞利用的方法。
[0059]其中,該方法獲取軟件在運行過程中發(fā)生的異常所在的線程對應的SHl鏈,根據(jù)該SHl鏈確定該軟件存在的漏洞是否被利用,如果該軟件存在的漏洞被利用,則結(jié)束該軟件繼續(xù)運行,以實現(xiàn)阻止該軟件的漏洞被利用。
[0060]參見圖3-1,該方法包括:
[0061]步驟301:獲取軟件在運行過程中發(fā)生的異常所在的線程對應的SHl鏈;
[0062]其中,當該軟件啟動時,操作系統(tǒng)創(chuàng)建該軟件包括的一個或多個線程,不同線程之間互不干涉,并為每個線程創(chuàng)建對應的一個SHl鏈。SHl鏈中包括多個SHl節(jié)點,每個SHl節(jié)點至少包括節(jié)點指針和函數(shù)指針。對于任一個SEH節(jié)點中包括的節(jié)點指針用于指向該SEH節(jié)點的下一個SHl節(jié)點,以及該SHl節(jié)點包括的函數(shù)指針用于指向異常處理函數(shù)。參見圖3-2。
[0063]其中,軟件通過其包括的線程來運行,該軟件包括的線程在運行過程中可能會發(fā)生異常,該線程發(fā)生的異常即為該軟件在運行過程中發(fā)生異常。當該軟件發(fā)生異常時,可以獲取發(fā)生該異常的線程,即獲取該異常所在的線程,并進一步獲取該線程對應的SEH鏈。
[0064]當軟件發(fā)生異常時,該軟件可以獲取該異常所在線程對應的SHl鏈。從該SHl鏈包括的第一個SHl節(jié)點開始遍歷,根據(jù)遍歷的SHl節(jié)點中包括的函數(shù)指針調(diào)用對應的異常處理函數(shù),并確定該異常處理函數(shù)能否處理該異常。如果能,則結(jié)束繼續(xù)遍歷該SHl鏈中的SEH節(jié)點,并通過該異常處理函數(shù)來處理該異常;如果不能,根據(jù)遍歷的SHl節(jié)點中包括的節(jié)點指針遍歷下一個SHl節(jié)點,直到找出能處理該異常的異常函數(shù)或遍歷到最后一個SEH節(jié)點時為止。
[0065]其中,可以通過KiUserExcept1nDispatcher系統(tǒng)函數(shù)派發(fā)異常,依次遍歷該SEH鏈中的每個函數(shù)指針調(diào)用對應的異常處理函數(shù)。
[0066]其中,軟件可能存在漏洞,當軟件運行到其包括的漏洞時,軟件可能發(fā)溢出并覆蓋某個SHl鏈包括的SHl節(jié)點。此時黑客可以將覆蓋的SHl節(jié)點包括的函數(shù)指針設(shè)置為指向惡意代碼,將覆蓋的SHl節(jié)點包括的節(jié)點指針的值設(shè)置為任一數(shù)值。
[0067]其中,當該SHl鏈對應的線程發(fā)生異常時,軟件可以遍歷該SHl鏈,并根據(jù)覆蓋的SEH節(jié)點中包括的函數(shù)指針調(diào)用并運行惡意代碼,所以在本發(fā)明實施例中,需要通過如下步驟302至304來阻止黑客利用軟件存在的漏洞。
[0068]進一步地,在執(zhí)行本步驟之前,當該軟件啟動并在操作系統(tǒng)創(chuàng)建該軟件包括的線程對應的SHl鏈后,還可以包括:
[0069]當該軟件啟動時,在該軟件包括的線程所對應的SHl鏈的最末尾節(jié)點后添加預設(shè)的SEH節(jié)點。參見圖3-3。
[0070]具體地,當該軟件啟動時,在該軟件包括的線程對應的SHl鏈中查找到最末尾節(jié)點,設(shè)置最末尾節(jié)點中包括的節(jié)點指針指向預設(shè)的SEH節(jié)點。參見圖3-3。
[0071]其中,可以通過掛鉤系統(tǒng)提供的CreatThread函數(shù),通過掛鉤技術(shù)修改新線程的函數(shù)入口,可以達到在SHl鏈的最末尾節(jié)點后添加一個節(jié)點指針并指向預設(shè)的SHl節(jié)點的目的。
[0072]步驟302:根據(jù)該SEH鏈確定該軟件存在的漏洞是否被利用,如果該軟件存在的漏洞被利用,則執(zhí)行步驟303;
[0073]具體地,對該SHl鏈的完整性進行判斷,如果該SHl鏈不完整,則確定出軟件存在的漏洞被利用;如果該SHl鏈完整,則確定出軟件存在的漏洞沒有被利用。
[0074]其中,對該SHl鏈的完整性進行判斷的操作,可以為:
[0075]獲取該SEH鏈最末尾的一個SHl節(jié)點,如果該SEH節(jié)點不是預設(shè)的SEH節(jié)點,則判斷出該SHl鏈不完整;如果該SHl節(jié)點是預設(shè)的SHl節(jié)點,則判斷出該SHl鏈完整。
[0076]其中,從該SHl鏈的第一個SHl節(jié)點開始,并根據(jù)第一個SHl節(jié)點包括的節(jié)點指針查找下一個節(jié)點,直到查找到該SHl鏈的最末尾SHl節(jié)點。如果該SHl鏈中的某個SHl節(jié)點被黑客修改,則當查找到該SHl節(jié)點時,由于該SHl節(jié)點中的節(jié)點指針的值被黑客修改為任一數(shù)值,所以根據(jù)該SHl節(jié)點中的節(jié)點指針查找不出下一個SHl節(jié)點,所以查找的最末尾的SEH節(jié)點為該SHl節(jié)點,而不是預設(shè)的SHl節(jié)點,從而可以確定出軟件存在的漏洞被利用。
[0077]步驟303:結(jié)束該軟件繼續(xù)運行,以實現(xiàn)阻止該軟件的漏洞被利用;
[0078]具體地,結(jié)束用于運行該軟件的進程,以實現(xiàn)結(jié)束該軟件繼續(xù)運行。
[0079]其中,當該軟件啟動時,操作系統(tǒng)為該軟件分配一個進程,該進程用于運行該軟件。
[0080]步驟304:顯示提示信息給用戶,以提示用戶因該軟件存在的漏洞被利用而結(jié)束該軟件繼續(xù)運行。
[0081]其中,當發(fā)現(xiàn)該軟件存在的漏洞被利用時給用戶以提示,例如“該軟件存在的漏洞正在被利用,處于安全考慮將結(jié)束該軟件運行”等等。
[0082]在本發(fā)明實施例中,獲取軟件在運行過程中發(fā)生的異常所在的線程對應的SEH鏈,根據(jù)該SHl鏈確定該軟件存在的漏洞是否被利用,如果該軟件存在的漏洞被利用,顯示提示信息給用戶,以提示用戶因該軟件存在的漏洞被利用而結(jié)束該軟件繼續(xù)運行,以實現(xiàn)阻止該軟件的漏洞被利用。能成功阻止漏洞利用同時不影響系統(tǒng)運行。
[0083]實施例4
[0084]參見圖4,本發(fā)明實施例提供了一種阻止軟件漏洞利用的裝置,包括:
[0085]獲取模塊401,用于獲取軟件訪問內(nèi)存的訪問信息,所述訪問信息包括所述軟件在運行過程中訪問內(nèi)存的內(nèi)存地址或者所述軟件在運行過程中發(fā)生的異常所在的線程對應的SEH鏈;
[0086]確定模塊402,用于根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用;
[0087]結(jié)束模塊403,用于如果所述軟件存在的漏洞被利用,則結(jié)束所述軟件繼續(xù)運行,以實現(xiàn)阻止所述軟件的漏洞被利用。
[0088]其中,所述確定模塊402包括:
[0089]第一判斷單元,用于判斷所述內(nèi)存地址是否與空操作指令相同,如果是,則確定出所述軟件存在的漏洞被利用,如果否,則確定出所述軟件存在的漏洞沒有被利用;
[0090]第二判斷單元,用于對所述內(nèi)存地址對應的內(nèi)存空間進行判斷,如果所述內(nèi)存空間不可讀不可寫,則確定出所述軟件存在的漏洞被利用,如果所述內(nèi)存空間可讀或可寫,則確定出所述軟件存在的漏洞沒有被利用。
[0091]其中,所述第二判斷單元包括:
[0092]獲取子單元,用于根據(jù)所述內(nèi)存地址,從所述軟件對應的地址列表中獲取所述內(nèi)存地址的屬性信息,所述地址列表用于存儲內(nèi)存地址與屬性信息的對應關(guān)系;
[0093]判斷子單元:用于如果所述屬性信息為不可讀不可寫,則判斷出所述內(nèi)存地址對應的內(nèi)存空間不可讀不可寫;如果所述屬性信息為可讀或可寫,則判斷出所述內(nèi)存地址對應的內(nèi)存空間可讀或可寫。
[0094]進一步地,所述裝置還包括:
[0095]修改模塊:用于當所述軟件啟動時,在所述軟件對應的地址列表中將與空操作指令相同的內(nèi)存地址對應的屬性信息修改為不可讀不可寫。
[0096]進一步地,與所述空操作指令相同的內(nèi)存地址包括OxOaOaOaOa、OxObObObOb、OxOcOcOcOc,OxOdOdOdOd,OxOeOeOeOe,OxOfOfOfOf,0x14141414 和 0x15151515 中的至少一者。
[0097]其中,所述確定模塊402包括;
[0098]第三判斷單元,用于對所述SEH鏈的完整性進行判斷;
[0099]第一確定單元,用于如果所述SHl鏈不完整,則確定出所述軟件存在的漏洞被利用;
[0100]第二確定單元,用于如果所述SHl鏈完整,則確定出所述軟件存在的漏洞沒有被利用。
[0101]其中,所述第三判斷單元包括:
[0102]獲取子單元,用于獲取所述SHl鏈最末尾的一個SHl節(jié)點;
[0103]第一判斷子單元,用于如果所述SHl節(jié)點不是預設(shè)的SHl節(jié)點,則判斷出所述SEH節(jié)點不完整;
[0104]第二判斷子單元,用于如果所述SHl節(jié)點是預設(shè)的SHl節(jié)點,則判斷出所述SHl鏈完整。
[0105]進一步地,所述裝置還包括:
[0106]添加模塊,用于在創(chuàng)建所述軟件包括的線程時,獲取所述創(chuàng)建的線程對應的SEH鏈,在所述獲取的SHl鏈的最末尾節(jié)點之后添加預設(shè)的SHl節(jié)點。
[0107]在本發(fā)明實施例中,獲取軟件訪問內(nèi)存的訪問信息;根據(jù)訪問信息確定所述軟件存在的漏洞是否被利用;如果被利用,則結(jié)束軟件運行。能成功阻止漏洞利用同時不影響系統(tǒng)運行。
[0108]本實施例提供了一種可讀存儲介質(zhì),所述可讀存儲介質(zhì)存儲有一個或者一個以上程序,所述一個或者一個以上程序被一個或者一個以上的處理器用來執(zhí)行一種阻止漏洞利用的方法,所述方法包括:
[0109]獲取軟件訪問內(nèi)存的訪問信息,所述訪問信息包括所述軟件在運行過程中訪問內(nèi)存的內(nèi)存地址或者所述軟件在運行過程中發(fā)生的異常所在的線程對應的結(jié)構(gòu)化異常處理鏈;
[0110]根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用;
[0111]如果所述軟件存在的漏洞被利用,則結(jié)束所述軟件繼續(xù)運行,以實現(xiàn)阻止所述軟件的漏洞被利用。
[0112]優(yōu)選的,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用,包括:
[0113]判斷所述內(nèi)存地址是否與空操作指令相同,如果是,則確定出所述軟件存在的漏洞被利用,如果否,則確定出所述軟件存在的漏洞沒有被利用。
[0114]優(yōu)選的,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用,包括:
[0115]對所述內(nèi)存地址對應的內(nèi)存空間進行判斷,如果所述內(nèi)存空間不可讀不可寫,則確定出所述軟件存在的漏洞被利用,如果所述內(nèi)存空間可讀或可寫,則確定出所述軟件存在的漏洞沒有被利用。
[0116]優(yōu)選的,所述對所述內(nèi)存地址對應的內(nèi)存空間進行判斷,包括:
[0117]根據(jù)所述內(nèi)存地址,從所述軟件對應的地址列表中獲取所述內(nèi)存地址的屬性信息,所述地址列表用于存儲內(nèi)存地址與屬性信息的對應關(guān)系;
[0118]如果所述屬性信息為不可讀不可寫,則判斷出所述內(nèi)存地址對應的內(nèi)存空間不可讀不可寫;
[0119]如果所述屬性信息為可讀或可寫,則判斷出所述內(nèi)存地址對應的內(nèi)存空間可讀或可寫。
[0120]進一步地,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用之前,還包括:
[0121]當所述軟件啟動時,在所述軟件對應的地址列表中將與空操作指令相同的內(nèi)存地址對應的屬性信息修改為不可讀不可寫。
[0122]其中,與所述空操作指令相同的內(nèi)存地址包括OxOaOaOaOa、OxObObObOb、OxOcOcOcOc,OxOdOdOdOd,OxOeOeOeOe,OxOfOfOfOf,0x14141414 和 0x15151515 中的至少一者。
[0123]優(yōu)選的,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用,包括:
[0124]對所述結(jié)構(gòu)化異常處理鏈的完整性進行判斷;
[0125]如果所述結(jié)構(gòu)化異常處理鏈不完整,則確定出所述軟件存在的漏洞被利用;
[0126]如果所述結(jié)構(gòu)化異常處理鏈完整,則確定出所述軟件存在的漏洞沒有被利用。
[0127]優(yōu)選的,所述對所述SHl鏈的完整性進行判斷,包括:
[0128]獲取所述結(jié)構(gòu)化異常處理鏈最末尾的一個結(jié)構(gòu)化異常處理節(jié)點;
[0129]如果所述結(jié)構(gòu)化異常處理節(jié)點不是預設(shè)的結(jié)構(gòu)化異常處理節(jié)點,則判斷出所述結(jié)構(gòu)化異常處理節(jié)點不完整;
[0130]如果所述結(jié)構(gòu)化異常處理節(jié)點是預設(shè)的結(jié)構(gòu)化異常處理節(jié)點,則判斷出所述結(jié)構(gòu)化異常處理鏈完整。
[0131]進一步地,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用之前,還包括:
[0132]在創(chuàng)建所述軟件包括的線程時,獲取所述創(chuàng)建的線程對應的結(jié)構(gòu)化異常處理鏈,在所述獲取的結(jié)構(gòu)化異常處理鏈的最末尾節(jié)點之后添加預設(shè)的結(jié)構(gòu)化異常處理節(jié)點。
[0133]本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲于一種計算機可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是只讀存儲器,磁盤或光盤等。
[0134]以上所述僅為本發(fā)明的較佳實施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。
【權(quán)利要求】
1.一種阻止漏洞利用的方法,其特征在于,所述方法包括: 獲取軟件訪問內(nèi)存的訪問信息,所述訪問信息包括所述軟件在運行過程中訪問內(nèi)存的內(nèi)存地址或者所述軟件在運行過程中發(fā)生的異常所在的線程對應的結(jié)構(gòu)化異常處理鏈;根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用; 如果所述軟件存在的漏洞被利用,則結(jié)束所述軟件繼續(xù)運行,以實現(xiàn)阻止所述軟件的漏洞被利用。
2.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用,包括: 判斷所述內(nèi)存地址是否與空操作指令相同,如果是,則確定出所述軟件存在的漏洞被利用,如果否,則確定出所述軟件存在的漏洞沒有被利用。
3.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用,包括: 對所述內(nèi)存地址對應的內(nèi)存空間進行判斷,如果所述內(nèi)存空間不可讀不可寫,則確定出所述軟件存在的漏洞被利用,如果所述內(nèi)存空間可讀或可寫,則確定出所述軟件存在的漏洞沒有被利用。
4.如權(quán)利要求3所述的方法,其特征在于,所述對所述內(nèi)存地址對應的內(nèi)存空間進行判斷,包括: 根據(jù)所述內(nèi)存地址,從所述軟件對應的地址列表中獲取所述內(nèi)存地址的屬性信息,所述地址列表用于存儲內(nèi)存地址與屬性信息的對應關(guān)系; 如果所述屬性信息為不可讀不可寫,則判斷出所述內(nèi)存地址對應的內(nèi)存空間不可讀不可寫; 如果所述屬性信息為可讀或可寫,則判斷出所述內(nèi)存地址對應的內(nèi)存空間可讀或可與。
5.如權(quán)利要求4所述的方法,其特征在于,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用之前,還包括: 當所述軟件啟動時,在所述軟件對應的地址列表中將與空操作指令相同的內(nèi)存地址對應的屬性信息修改為不可讀不可寫。
6.如權(quán)利要求2或5所述的方法,其特征在于, 與所述空操作指令相同的內(nèi)存地址包括OxOaOaOaOa、OxObObObOb、OxOcOcOcOc、0x0d0d0d0d、0x0e0e0e0e、0x0f0f0f0f、0xl4141414 和 0x15151515 中的至少一者。
7.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用,包括: 對所述結(jié)構(gòu)化異常處理鏈的完整性進行判斷; 如果所述結(jié)構(gòu)化異常處理鏈不完整,則確定出所述軟件存在的漏洞被利用; 如果所述結(jié)構(gòu)化異常處理鏈完整,則確定出所述軟件存在的漏洞沒有被利用。
8.如權(quán)利要求7所述的方法,其特征在于,所述對所述結(jié)構(gòu)化異常處理鏈的完整性進行判斷,包括: 獲取所述結(jié)構(gòu)化異常處理鏈最末尾的一個結(jié)構(gòu)化異常處理節(jié)點; 如果所述結(jié)構(gòu)化異常處理節(jié)點不是預設(shè)的結(jié)構(gòu)化異常處理節(jié)點,則判斷出所述結(jié)構(gòu)化異常處理節(jié)點不完整; 如果所述結(jié)構(gòu)化異常處理節(jié)點是預設(shè)的結(jié)構(gòu)化異常處理節(jié)點,則判斷出所述結(jié)構(gòu)化異常處理鏈完整。
9.如權(quán)利要求7或8所述的方法,其特征在于,所述根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用之前,還包括: 在創(chuàng)建所述軟件包括的線程時,獲取所述創(chuàng)建的線程對應的結(jié)構(gòu)化異常處理鏈,在所述獲取的結(jié)構(gòu)化異常處理鏈的最末尾節(jié)點之后添加預設(shè)的結(jié)構(gòu)化異常處理節(jié)點。
10.一種阻止漏洞利用的裝置,所述裝置包括: 獲取模塊,用于獲取軟件訪問內(nèi)存的訪問信息,所述訪問信息包括所述軟件在運行過程中訪問內(nèi)存的內(nèi)存地址或者所述軟件在運行過程中發(fā)生的異常所在的線程對應的結(jié)構(gòu)化異常處理鏈; 確定模塊,用于根據(jù)所述訪問信息,確定所述軟件存在的漏洞是否被利用; 結(jié)束模塊,用于如果所述軟件存在的漏洞被利用,則結(jié)束所述軟件繼續(xù)運行,以實現(xiàn)阻止所述軟件的漏洞被利用。
11.如權(quán)利要求10所述的裝置,其特征在于,所述確定模塊包括: 第一判斷單元,用于判斷所述內(nèi)存地址是否與空操作指令相同,如果是,則確定出所述軟件存在的漏洞被利用,如果否,則確定出所述軟件存在的漏洞沒有被利用。
12.如權(quán)利要求10所述的裝置,其特征在于,所述確定模塊包括: 第二判斷單元,用于對所述內(nèi)存地址對應的內(nèi)存空間進行判斷,如果所述內(nèi)存空間不可讀不可寫,則確定出所述軟件存在的漏洞被利用,如果所述內(nèi)存空間可讀或可寫,則確定出所述軟件存在的漏洞沒有被利用。
13.如權(quán)利要求12所述的裝置,其特征在于,第二判斷單元包括: 獲取子單元,用于根據(jù)所述內(nèi)存地址,從所述軟件對應的地址列表中獲取所述內(nèi)存地址的屬性信息,所述地址列表用于存儲內(nèi)存地址與屬性信息的對應關(guān)系; 判斷子單元:用于如果所述屬性信息為不可讀不可寫,則判斷出所述內(nèi)存地址對應的內(nèi)存空間不可讀不可寫;如果所述屬性信息為可讀或可寫,則判斷出所述內(nèi)存地址對應的內(nèi)存空間可讀或可寫。
14.如利要求13所述的裝置,其特征在于,所述裝置還包括: 修改模塊:用于當所述軟件啟動時,在所述軟件對應的地址列表中將與空操作指令相同的內(nèi)存地址對應的屬性信息修改為不可讀不可寫。
15.如權(quán)利要求11或14所述的裝置,其特征在于, 與所述空操作指令相同的內(nèi)存地址包括OxOaOaOaOa、OxObObObOb、0x0c0c0c0c、0x0d0d0d0d、0x0e0e0e0e、0x0f0f0f0f、0xl4141414 和 0x15151515 中的至少一者。
16.如權(quán)利要求10所述的裝置,其特征在于,所述確定模塊包括: 第三判斷單元,用于對所述結(jié)構(gòu)化異常處理鏈的完整性進行判斷; 第一確定單元,用于如果所述結(jié)構(gòu)化異常處理鏈不完整,則確定出所述軟件存在的漏洞被利用; 第二確定單元,用于如果所述結(jié)構(gòu)化異常處理鏈完整,則確定出所述軟件存在的漏洞沒有被利用。
17.如權(quán)利要求10所述的裝置,其特征在于,所述第三判斷單元包括: 獲取子單元,用于獲取所述結(jié)構(gòu)化異常處理鏈最末尾的一個結(jié)構(gòu)化異常處理節(jié)點; 第一判斷子單元,用于如果所述結(jié)構(gòu)化異常處理節(jié)點不是預設(shè)的結(jié)構(gòu)化異常處理節(jié)點,則判斷出所述結(jié)構(gòu)化異常處理節(jié)點不完整; 第二判斷子單元,用于如果所述結(jié)構(gòu)化異常處理節(jié)點是預設(shè)的結(jié)構(gòu)化異常處理節(jié)點,則判斷出所述結(jié)構(gòu)化異常處理鏈完整。
18.如權(quán)利要求16或17所述的裝置,其特征在于,所述裝置還包括: 添加模塊,用于在創(chuàng)建所述軟件包括的線程時,獲取所述創(chuàng)建的線程對應的結(jié)構(gòu)化異常處理鏈,在所述獲取的結(jié)構(gòu)化異常處理鏈的最末尾節(jié)點之后添加預設(shè)的結(jié)構(gòu)化異常處理節(jié)點。
【文檔編號】G06F21/57GK104298922SQ201310298110
【公開日】2015年1月21日 申請日期:2013年7月16日 優(yōu)先權(quán)日:2013年7月16日
【發(fā)明者】趙歆 申請人:騰訊科技(深圳)有限公司