自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法
【專利摘要】本發(fā)明公開了一種自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,其特征在于,創(chuàng)建若干自定義的靜態(tài)庫以代替操作系統(tǒng)提供的默認(rèn)庫來實(shí)現(xiàn)對(duì)所述軟件程序中用到的API的調(diào)用,所述自定義的靜態(tài)庫以顯式加載方式實(shí)現(xiàn)所述調(diào)用。本發(fā)明的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,能夠簡化操作并降低程序被殺毒軟件誤報(bào)的概率。
【專利說明】自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及信息安全領(lǐng)域,尤其涉及一種自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法。
【背景技術(shù)】
[0002]殺毒軟件,也稱反病毒軟件或防毒軟件,是用于消除電腦病毒、特洛伊木馬和惡意軟件等計(jì)算機(jī)威脅的一類軟件。殺毒軟件通過集成監(jiān)控識(shí)別、病毒掃描和清除和自動(dòng)升級(jí)等功能,有的殺毒軟件還帶有數(shù)據(jù)恢復(fù)等功能,是計(jì)算機(jī)防御系統(tǒng)(包含殺毒軟件,防火墻,特洛伊木馬和其他惡意軟件的查殺程序,入侵預(yù)防系統(tǒng)等)的重要組成部分。
[0003]程序是否存在病毒,殺毒軟件所判斷的對(duì)象一般是代碼和行為,前者,是掃描程序的代碼,判斷其中是否存在與已知病毒類似的代碼模式,后者,是分析程序訪問的系統(tǒng)對(duì)象及其訪問方式,如文件、注冊(cè)表鍵,是否匹配敏感的、可能危害系統(tǒng)的行為。由于目前病毒普遍使用代碼變形等技術(shù),直接分析代碼越來越困難,后者逐漸成為殺毒軟件主要使用的判斷方式。
[0004]而對(duì)行為的分析,主要是通過程序調(diào)用了哪些操作系統(tǒng)API,及其調(diào)用參數(shù)來實(shí)現(xiàn)的,在目前主流操作系統(tǒng)中,系統(tǒng)API —般是以動(dòng)態(tài)庫形式提供,一般情況下,編譯后的程序使用“導(dǎo)入表”或類似結(jié)構(gòu)來動(dòng)態(tài)鏈接到系統(tǒng)動(dòng)態(tài)庫。“導(dǎo)入表”有很多項(xiàng),每項(xiàng)對(duì)應(yīng)于一個(gè)系統(tǒng)API,其中記錄了該API的函數(shù)名、所在的動(dòng)態(tài)庫文件名等信息,是殺毒軟件分析的數(shù)據(jù)來源,在此基礎(chǔ)上,可以分析出代碼中何處調(diào)用了哪些API,傳遞了什么參數(shù),若調(diào)用的次序和參數(shù)與惡意行為在某種程度上匹配,則會(huì)報(bào)毒。
[0005]現(xiàn)有技術(shù)中,目前,殺毒軟件誤報(bào)的現(xiàn)象越來越常見。所謂誤報(bào),即應(yīng)用程序本來并不含有病毒或惡意代碼,但是殺毒軟件卻認(rèn)為它是惡意程序,因此,殺毒軟件阻止其運(yùn)行、對(duì)文件隔離或刪除等操作。其原因在于,程序是否有病毒或惡意代碼,并不存在完全準(zhǔn)確的判斷規(guī)則。殺毒軟件往往只能通過代碼的內(nèi)容、訪問數(shù)據(jù)的內(nèi)容和模式,根據(jù)一些預(yù)先定義好的規(guī)則來進(jìn)行模糊匹配。這種判斷方式必然有一定的誤判概率,即程序匹配了部分規(guī)則,但不一定匹配的就是病毒。殺毒軟件的這種誤報(bào)行為給軟件提供商帶來了很大的困擾。對(duì)此,目前也有一些解決方案,包括:
[0006]I)針對(duì)具體問題與殺毒軟件廠商聯(lián)系,提供特征碼讓殺毒軟件對(duì)具體的二進(jìn)制程序不報(bào)毒;
[0007]2)對(duì)程序加數(shù)字簽名,使殺毒軟件能夠驗(yàn)證其發(fā)行者身份。
[0008]這些方法的缺點(diǎn)一是治標(biāo)不治本,一次只能解決一個(gè)最終二進(jìn)制文件,二是要等待殺毒軟件更新,并且用戶配合升級(jí)才能生效,解決問題的時(shí)間較長,溝通環(huán)節(jié)較多。
【發(fā)明內(nèi)容】
[0009]本發(fā)明提供一種自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,能夠簡化操作并降低程序被殺毒軟件誤報(bào)的概率。
[0010]為了解決上述技術(shù)問題,本發(fā)明提供了一種自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,創(chuàng)建若干自定義的靜態(tài)庫以代替操作系統(tǒng)提供的默認(rèn)庫來實(shí)現(xiàn)對(duì)所述軟件程序中用到的API的調(diào)用,所述自定義的靜態(tài)庫以顯式加載方式實(shí)現(xiàn)所述調(diào)用。
[0011]作為優(yōu)選,具體包括以下步驟:
[0012]S1:列舉出所述操作系統(tǒng)的鏈接器的所有所述默認(rèn)庫;
[0013]S2:從操作系統(tǒng)軟件開發(fā)工具包獲取所述默認(rèn)庫的庫文件,自動(dòng)枚舉出其中所有的API名,將從各個(gè)所述默認(rèn)庫中枚舉出的API名分別保存為第一字符串?dāng)?shù)組;
[0014]S3:對(duì)所述第一字符串?dāng)?shù)組中每個(gè)API名進(jìn)行自定義變換處理,處理后的結(jié)果保存為第二字符串?dāng)?shù)組;
[0015]S4:對(duì)應(yīng)每個(gè)所述默認(rèn)庫,自動(dòng)創(chuàng)建一個(gè)源代碼文件,在文件中定義該默認(rèn)庫中所有的API,該源代碼文件的函數(shù)體為一段固定的顯式加載代碼;
[0016]S5:編譯所述源代碼文件,生成自定義的靜態(tài)庫;
[0017]S6:返回步驟S2,直到生成所有所述默認(rèn)庫對(duì)應(yīng)的自定義的靜態(tài)庫;
[0018]S7:修改要免殺的軟件程序的工程配置,包括禁用所有所述默認(rèn)庫以及添加所有對(duì)應(yīng)的自定義的靜態(tài)庫。
[0019]作為優(yōu)選,步驟S3還包括對(duì)所述默認(rèn)庫的庫文件的原庫文件名進(jìn)行自定義變換處理,并將處理后的結(jié)果保存為一字符串。
[0020]作為優(yōu)選,步驟S4中所述函數(shù)體具體包括以下項(xiàng):
[0021]Al:對(duì)所述字符串中的經(jīng)變換的庫文件名進(jìn)行逆變換后得到的原庫文件名;
[0022]A2:以所述原庫文件名為參數(shù)調(diào)用系統(tǒng)功能而加載的動(dòng)態(tài)庫;
[0023]A3:對(duì)所述第二字符串?dāng)?shù)組中的對(duì)應(yīng)項(xiàng)進(jìn)行逆變換后得到的API名稱;
[0024]A4:以進(jìn)行逆變換后得到的API名稱為參數(shù)調(diào)用系統(tǒng)功能而獲取的API地址;
[0025]A5:跳轉(zhuǎn)指令,其跳轉(zhuǎn)目標(biāo)是所述API地址。
[0026]作為優(yōu)選,所述操作系統(tǒng)為Windows、Linux或者Unix。
[0027]與現(xiàn)有技術(shù)相比,本發(fā)明的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法的有益效果在于:由于不再有導(dǎo)入表等明文信息,殺毒軟件難以得知程序調(diào)用了哪些API,也就無法分析程序的行為,因此,降低了誤報(bào)的概率。同時(shí),本發(fā)明的方法不需要修改程序的源代碼,在源代碼中,對(duì)系統(tǒng)API的調(diào)用,與其他普通函數(shù)沒有區(qū)別,這是因?yàn)?,無論“顯式加載”還是“隱式加載”,都是在鏈接時(shí)由提供的系統(tǒng)庫決定。通過本發(fā)明提供的方法,無需修改軟件程序的源代碼,即可達(dá)到降低被殺毒軟件誤殺的概率,提升安全性和使用的便捷性。
【專利附圖】
【附圖說明】
[0028]圖1為本發(fā)明的實(shí)施例的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法的流程示意圖;
[0029]圖2為應(yīng)用本發(fā)明的實(shí)施例的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法處理前后的文件對(duì)照示意圖。
【具體實(shí)施方式】
[0030]下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明的實(shí)施例的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法作進(jìn)一步詳細(xì)描述,但不作為對(duì)本發(fā)明的限定。
[0031]圖1為本發(fā)明的實(shí)施例的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法的流程示意圖。本發(fā)明的實(shí)施例的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,創(chuàng)建若干自定義的靜態(tài)庫以代替操作系統(tǒng)提供的默認(rèn)庫來實(shí)現(xiàn)對(duì)軟件程序中用到的API的調(diào)用,自定義的靜態(tài)庫以顯式加載方式實(shí)現(xiàn)調(diào)用。由于“顯式加載”的函數(shù)沒有“導(dǎo)出”(export)屬性,鏈接后不會(huì)生成導(dǎo)入表項(xiàng)。
[0032]本發(fā)明得以自動(dòng)實(shí)現(xiàn)軟件程序免殺的原理就是在編譯階段,使用“顯式加載”替代“導(dǎo)入表”(隱式加載)。編譯器默認(rèn)使用隱式加載,隱式加載是每當(dāng)源代碼中調(diào)用了一個(gè)系統(tǒng)API,就將調(diào)用的目標(biāo)地址設(shè)定為“導(dǎo)入表”中的某項(xiàng)(多次調(diào)用同一個(gè)API,目標(biāo)地址相同),而在程序運(yùn)行時(shí),操作系統(tǒng)會(huì)根據(jù)該導(dǎo)入表項(xiàng)中填寫的動(dòng)態(tài)庫名和API名,在該項(xiàng)中填入API真正的地址,使程序可以正常工作。“顯式加載”則是不使用“導(dǎo)入表”機(jī)制,每當(dāng)源代碼中調(diào)用了一個(gè)系統(tǒng)API,則直接生成一段代碼,用來加載相應(yīng)的動(dòng)態(tài)庫,搜索庫中的API地址,然后調(diào)用。在這段代碼中,動(dòng)態(tài)庫名和API名都不是以明文形式存在,而是經(jīng)過自定義算法變換過的,只有在運(yùn)行時(shí)才可能知道其內(nèi)容。由于不再有導(dǎo)入表等明文信息,殺毒軟件難以得知程序調(diào)用了哪些API,也就無法分析程序的行為,因此,降低了誤報(bào)的概率。同時(shí),本方法不需要修改程序的源代碼,在源代碼中,對(duì)系統(tǒng)API的調(diào)用,與其他普通函數(shù)沒有區(qū)別,這是因?yàn)?,無論“顯式加載”還是“隱式加載”,都是在鏈接時(shí)由提供的系統(tǒng)庫決定。鏈接器一般提供若干“默認(rèn)庫”,對(duì)源代碼中調(diào)用的系統(tǒng)API,由于其函數(shù)沒有定義在程序的自身代碼中,鏈接時(shí)會(huì)找不到,找不到時(shí),鏈接器就會(huì)從“默認(rèn)庫”中尋找,并找到帶有“導(dǎo)出”(export)屬性的函數(shù),此時(shí)鏈接器就會(huì)添加導(dǎo)入表項(xiàng),記錄動(dòng)態(tài)庫名和API名。通過本發(fā)明提供的方法,無需修改軟件程序的源代碼,即可達(dá)到降低被殺毒軟件誤殺的概率,提升安全性和使用的便捷性。
[0033]作為一種改進(jìn),具體包括以下步驟:
[0034]S1:列舉出操作系統(tǒng)的鏈接器的所有默認(rèn)庫。
[0035]不同操作系統(tǒng)、平臺(tái)下的默認(rèn)庫會(huì)有不同,但都是確定可預(yù)知的,如Windows程序一般是 kernel32、user32、advapi32 這三個(gè)默認(rèn)庫。
[0036]S2:從操作系統(tǒng)軟件開發(fā)工具包獲取默認(rèn)庫的庫文件,自動(dòng)枚舉出其中所有的API名,將從各個(gè)默認(rèn)庫中枚舉出的API名分別保存為第一字符串?dāng)?shù)組。
[0037]其中,自動(dòng)枚舉API名,由于默認(rèn)庫使用“隱式加載”方式,因此,所有API名都會(huì)在庫文件符號(hào)表中依次出現(xiàn),所以可以解析庫文件結(jié)構(gòu),自動(dòng)枚舉符號(hào)表。第一字符串?dāng)?shù)組格式如 kernel_apis, user_apis, advapi_apis。
[0038]S3:對(duì)第一字符串?dāng)?shù)組中每個(gè)API名進(jìn)行自定義變換處理,處理后的結(jié)果保存為
第二字符串?dāng)?shù)組。
[0039]S4:對(duì)應(yīng)每個(gè)默認(rèn)庫,自動(dòng)創(chuàng)建一個(gè)源代碼文件,在文件中定義該默認(rèn)庫中所有的API,該源代碼文件的函數(shù)體為一段固定的顯式加載代碼。
[0040]S5:編譯源代碼文件,生成自定義的靜態(tài)庫。例如mykernel32.lib。
[0041]S6:返回步驟2,直到生成所有默認(rèn)庫對(duì)應(yīng)的自定義的靜態(tài)庫。
[0042]S7:修改要免殺的程序的工程配置,禁用所有默認(rèn)庫,添加所有對(duì)應(yīng)的自定義的靜態(tài)庫。
[0043]作為進(jìn)一步的改進(jìn),步驟S3還包括對(duì)默認(rèn)庫的庫文件的原庫文件名進(jìn)行自定義變換處理,并將處理后的結(jié)果保存為一字符串。其中,自定義變換處理方式為自定義,變換算法不限,達(dá)到不易推斷出明文的目的即可。例如將字符串倒序:“abc”=> “cba”。第二字符串?dāng)?shù)組,如對(duì)kenel_apiS處理為kenel_api2。庫文件名也可以做類似處理(“user”=>”resu”),保存為“變換后庫名稱”字符串如kenel_lib_name2。
[0044]作為更進(jìn)一步的改進(jìn),步驟S4中函數(shù)體具體包括以下項(xiàng):
[0045]Al:對(duì)字符串中的庫文件名進(jìn)行逆變換(如字符串倒序)后得到的庫名稱;
[0046]A2:以原庫文件名(例如進(jìn)行逆變換后得到的庫名稱)為參數(shù)調(diào)用系統(tǒng)功能加載動(dòng)態(tài)庫(如 1adlibrary);
[0047]A3:對(duì)第二字符串?dāng)?shù)組中的對(duì)應(yīng)項(xiàng)進(jìn)行逆變換后得到的API名稱;
[0048]A4:以進(jìn)行逆變換后得到的API名稱為參數(shù)調(diào)用系統(tǒng)功能獲取API地址(如GetProcAddress);
[0049]A5:跳轉(zhuǎn)指令,其跳轉(zhuǎn)目標(biāo)是上述獲取到的API地址。
[0050]作為另一種改進(jìn),操作系統(tǒng)為Windows、Linux或者Unix。本發(fā)明的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法不僅適用于Windows系統(tǒng),還適用于Linux、Unix等操作系統(tǒng)。
[0051]圖2為應(yīng)用本發(fā)明的實(shí)施例的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法處理前后的文件對(duì)照示意圖。為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照?qǐng)D1和圖2并舉實(shí)施例,對(duì)本發(fā)明進(jìn)一步詳細(xì)說明(基于Windows操作系統(tǒng)下)。
[0052]某W indows軟件運(yùn)行時(shí)被殺毒軟件誤報(bào),源代碼工程使用VC編譯,軟件開發(fā)商采用本發(fā)明的實(shí)施例的自動(dòng)實(shí)現(xiàn)軟件程序免殺做軟件程序的源碼免殺。
[0053]首先確定系統(tǒng)默認(rèn)庫為kernel32.lib、user321ib 和 advapi32.lib ;
[0054]從Win dows Platform SDK中獲取上述庫文件,分別枚舉出其中所有的API名,保存到第一字符串?dāng)?shù)組 kernel32_apis、user32_apis,和 advapi32_apis ;
[0055]使用“字符串倒置”(Strrev)算法對(duì)第一字符串?dāng)?shù)組和動(dòng)態(tài)庫名稱做變換,得到第二字符串?dāng)?shù)組kernel32_api2、user32_api2、advapi32_api2和變換后庫名稱〃lld.231enrek〃、〃lld.23resu〃、〃lld.23ipavda〃 ;
[0056]分別創(chuàng)建源代碼文件mykernel32.c、myuser32.c和myadvapi32.c,在各文件中定義對(duì)應(yīng)庫中所有的API,例如advapi32.c中RegOpenKey函數(shù)代碼如下:
[0057]
void RegOpenKey O
{
char氺 oldDll = strrev(〃lld.23ipavda〃);
char氺 oIdApi = strrev(〃yeKnep0geR〃);
HM0DULE h = LoadLibraryA(oldDlI);
void氺 pfn = GetProcAddress(h, oldApi);[0058]
【權(quán)利要求】
1.一種自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,其特征在于,創(chuàng)建若干自定義的靜態(tài)庫以代替操作系統(tǒng)提供的默認(rèn)庫來實(shí)現(xiàn)對(duì)所述軟件程序中用到的API的調(diào)用,所述自定義的靜態(tài)庫以顯式加載方式實(shí)現(xiàn)所述調(diào)用。
2.根據(jù)權(quán)利要求1所述的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,其特征在于,具體包括以下步驟: 51:列舉出所述操作系統(tǒng)的鏈接器的所有所述默認(rèn)庫; 52:從操作系統(tǒng)軟件開發(fā)工具包獲取所述默認(rèn)庫的庫文件,自動(dòng)枚舉出其中所有的API名,將從各個(gè)所述默認(rèn)庫中枚舉出的API名分別保存為第一字符串?dāng)?shù)組; 53:對(duì)所述第一字符串?dāng)?shù)組中每個(gè)API名進(jìn)行自定義變換處理,處理后的結(jié)果保存為第二字符串?dāng)?shù)組; 54:對(duì)應(yīng)每個(gè)所述默認(rèn)庫,自動(dòng)創(chuàng)建一個(gè)源代碼文件,在文件中定義該默認(rèn)庫中所有的API,該源代碼文件的函數(shù)體為一段固定的顯式加載代碼; 55:編譯所述源代碼文件,生成自定義的靜態(tài)庫; 56:返回步驟S2,直到生成所有所述默認(rèn)庫對(duì)應(yīng)的自定義的靜態(tài)庫; 57:修改要免殺的軟件程序的工程配置,包括禁用所有所述默認(rèn)庫以及添加所有對(duì)應(yīng)的自定義的靜態(tài)庫。
3.根據(jù)權(quán)利要求2所述的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,其特征在于,步驟S3還包括對(duì)所述默認(rèn)庫的庫文件的原庫文件名進(jìn)行自定義變換處理,并將處理后的結(jié)果保存為一字符串。
4.根據(jù)權(quán)利要求3所述的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,其特征在于,步驟S4中所述函數(shù)體具體包括以下項(xiàng): Al:對(duì)所述字符串中的經(jīng)變換的庫文件名進(jìn)行逆變換后得到的原庫文件名; A2:以所述原庫文件名為參數(shù)調(diào)用系統(tǒng)功能而加載的動(dòng)態(tài)庫; A3:對(duì)所述第二字符串?dāng)?shù)組中的對(duì)應(yīng)項(xiàng)進(jìn)行逆變換后得到的API名稱; A4:以進(jìn)行逆變換后得到的API名稱為參數(shù)調(diào)用系統(tǒng)功能而獲取的API地址; A5:跳轉(zhuǎn)指令,其跳轉(zhuǎn)目標(biāo)是所述API地址。
5.根據(jù)權(quán)利要求1至4中任一項(xiàng)所述的自動(dòng)實(shí)現(xiàn)軟件程序免殺的方法,其特征在于,所述操作系統(tǒng)為Windows、Linux或者Unix。
【文檔編號(hào)】G06F21/57GK103824020SQ201410058478
【公開日】2014年5月28日 申請(qǐng)日期:2014年2月20日 優(yōu)先權(quán)日:2014年2月20日
【發(fā)明者】孫吉平, 韓勇 申請(qǐng)人:北京深思數(shù)盾科技有限公司