程免殺"組件和"文件保護(hù)"組件兩個(gè)功能放在一個(gè)可加載內(nèi)核模塊LKM模板里,則"進(jìn)程 免殺"組件也無(wú)法使用了,反之,則"文件保護(hù)"組件失效時(shí),"進(jìn)程免殺"組件還是可以正常 工作。另一方面,可以方便逐步開(kāi)發(fā)和發(fā)布應(yīng)用程序,避免一次編譯過(guò)多的可加載內(nèi)核模塊 LKM模板,降低開(kāi)發(fā)的工作量。
[0133] 應(yīng)用程序的組件至少可以支持當(dāng)前設(shè)備的處理器CPU、當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核。 進(jìn)一步地,為了減少適配的工作量,應(yīng)用程序的組件可以支持各類(lèi)設(shè)備的處理器CPU,同時(shí) 兼容各種Linux系統(tǒng)的系統(tǒng)內(nèi)核。
[0134] 在編譯可加載內(nèi)核模塊LKM模板時(shí),可以選取一個(gè)或多個(gè)系統(tǒng)內(nèi)核組成內(nèi)核版本 范圍,在該內(nèi)核版本范圍內(nèi)的系統(tǒng)內(nèi)核,其關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)不會(huì)發(fā)生顯著變化,在代碼二進(jìn) 制布局上大致一樣,使得可加載內(nèi)核模塊LKM模板對(duì)于該內(nèi)核版本范圍內(nèi)的系統(tǒng)內(nèi)核具有 通用性,可以實(shí)現(xiàn)可加載內(nèi)核模塊LKM模板的兼容。
[0135] 在一個(gè)示例中,可以選取Linux內(nèi)核版本號(hào)的前兩位中作為一個(gè)要支持的內(nèi)核版 本范圍(或稱(chēng)大版本)。
[0136] Linux內(nèi)核版本號(hào)一邊由3組數(shù)字組成:第一個(gè)組數(shù)字、第二組數(shù)字、第三組數(shù)字。
[0137] 其中,第一個(gè)組數(shù)字,可以是目前發(fā)布的內(nèi)核主版本。
[0138] 第二個(gè)組數(shù)字,偶數(shù)可以表示穩(wěn)定版本、奇數(shù)可以表示開(kāi)發(fā)中版本。
[0139] 第三個(gè)組數(shù)字,可以表示錯(cuò)誤修補(bǔ)的次數(shù)。
[0140] 例如,可以針對(duì)3. 10. 20-11和3. 1020-12rc5的Linux內(nèi)核版本號(hào)組成一個(gè)內(nèi)核 版本范圍3. 10,可以針對(duì)3. 11. 35-3089rcl的Linux內(nèi)核版本號(hào)組成一個(gè)內(nèi)核版本范圍 3. 11〇
[0141] 一般而言,Linux內(nèi)核并沒(méi)有windows內(nèi)核那樣嚴(yán)格地前后兼容,不同版本內(nèi)核 函數(shù)和結(jié)構(gòu)可能變化非常大。但是,主版本號(hào)一致的內(nèi)核,基礎(chǔ)API(應(yīng)用程序編程接口, ApplicationProgramInterface)和數(shù)據(jù)結(jié)構(gòu)變化相對(duì)少,可以認(rèn)為比較穩(wěn)定。
[0142] 用版本號(hào)的第一組數(shù)字和第二組數(shù)字進(jìn)行內(nèi)核版本范圍的劃分,可以明顯降低驅(qū) 動(dòng)編寫(xiě)難度和提高穩(wěn)定性,其投入產(chǎn)出比比在一個(gè)驅(qū)動(dòng)里適配所有內(nèi)核版本要高很多。
[0143] 當(dāng)然,在實(shí)際中可以結(jié)合驅(qū)動(dòng)使用到的API和數(shù)據(jù)結(jié)構(gòu)及kernel代碼的具體情 況,組成內(nèi)核版本范圍,本發(fā)明實(shí)施例對(duì)此不加以限制。
[0144] 在發(fā)布應(yīng)用程序的時(shí)候可以將可加載內(nèi)核模塊LKM模板在內(nèi)核版本范圍中選取 (如隨機(jī)選取、指定選取等)一個(gè)內(nèi)核版本的內(nèi)核上編譯。
[0145] 將生成的可加載內(nèi)核模塊LKM模板(擴(kuò)展名可以為ko)保存為二進(jìn)制數(shù)組,將三 個(gè)維度的信息(處理器版本信息、組件標(biāo)識(shí)、內(nèi)核版本范圍)以文件名或變量名的形式,固 化在源文件(C Plus Plus,cpp,C++語(yǔ)言編寫(xiě)的源代碼文件)中。
[0146] 將可加載內(nèi)核模塊LKM模板使用工具保存為二進(jìn)制數(shù)組,實(shí)際上相當(dāng)于將這個(gè)可 加載內(nèi)核模塊LKM模板攜帶在另一個(gè)可執(zhí)行文件中。
[0147] 將這個(gè)二進(jìn)制數(shù)組再寫(xiě)回操作系統(tǒng)中,可以會(huì)得到一樣的可加載內(nèi)核模塊LKM模 板。固化在應(yīng)用程序里的是內(nèi)核版本范圍的可加載內(nèi)核模塊LKM模板,歸屬于該內(nèi)核版本 范圍的內(nèi)核版本對(duì)應(yīng)的可加載內(nèi)核模塊LKM模板數(shù)量巨大,可以將通過(guò)使用內(nèi)核版本范圍 的可加載內(nèi)核模塊LKM模板適配之后生成。
[0148] 固化在源文件cpp中,可以在運(yùn)行的時(shí)候方便的修改二進(jìn)制數(shù)組內(nèi)容然后回寫(xiě)到 硬盤(pán)上。
[0149] 其中,組件標(biāo)識(shí)可以記錄在文件名里,內(nèi)核版本范圍和處理器版本信息可以記錄 在變量名里。
[0150] 針對(duì)"文件保護(hù)"組件編譯的可加載內(nèi)核模塊LKM模板的示例可以如下:
[0151] rootkit-fileprot. cpp
[0152]
【主權(quán)項(xiàng)】
1. 一種可加載內(nèi)核模塊的編譯方法,包括: 當(dāng)應(yīng)用程序的組件被觸發(fā)時(shí),讀取所述組件對(duì)應(yīng)的一個(gè)或多個(gè)可加載內(nèi)核模塊LKM模 板; 檢測(cè)所述一個(gè)或多個(gè)可加載內(nèi)核模塊LKM模板是否支持當(dāng)前設(shè)備的處理器和/或當(dāng)前 操作系統(tǒng)的系統(tǒng)內(nèi)核; 若是,則對(duì)所述可加載內(nèi)核模塊LKM模板與當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核進(jìn)行適配; 采用適配的可加載內(nèi)核模塊LKM模板編譯目標(biāo)可加載內(nèi)核模塊LKM。
2. 如權(quán)利要求1所述的方法,其特征在于,所述可加載內(nèi)核模塊LKM模板通過(guò)W下方式 生成: 基于模板操作系統(tǒng)的內(nèi)核環(huán)境編譯可加載內(nèi)核模塊LKM模板。
3. 如權(quán)利要求2所述的方法,其特征在于,所述可加載內(nèi)核模塊LKM模板還通過(guò)W下方 式生成: 將所述可加載內(nèi)核模塊LKM模板編譯為二進(jìn)制數(shù)組; 將所述二進(jìn)制數(shù)組與模板標(biāo)識(shí)固化在源文件中; 其中,所述模板標(biāo)識(shí)包括可支持的處理器版本信息、組件標(biāo)識(shí)、可支持的內(nèi)核版本范圍 中的至少一個(gè);所述模板操作系統(tǒng)的系統(tǒng)內(nèi)核的內(nèi)核版本歸屬于內(nèi)核版本范圍。
4. 如權(quán)利要求1或2或3所述的方法,其特征在于,所述讀取所述組件對(duì)應(yīng)的一個(gè)或多 個(gè)可加載內(nèi)核模塊LKM模板的步驟包括; 獲取與所述組件匹配的組件標(biāo)識(shí); 讀取所述組件標(biāo)識(shí)對(duì)應(yīng)的一個(gè)或多個(gè)可加載內(nèi)核模塊LKM模板。
5. 如權(quán)利要求4所述的方法,其特征在于,所述獲取與所述組件匹配的組件標(biāo)識(shí)的步 驟包括: 當(dāng)所述可加載內(nèi)核模塊LKM模板固化在源文件時(shí),讀取固化在所述源文件中、與所述 組件匹配的組件標(biāo)識(shí)。
6. 如權(quán)利要求1或2或3所述的方法,其特征在于,所述檢測(cè)所述一個(gè)或多個(gè)可加載內(nèi) 核模塊LKM模板是否支持當(dāng)前設(shè)備的處理器和/或當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核的步驟包括: 獲取所述可加載內(nèi)核模塊LKM模板支持的處理器版本信息; 讀取當(dāng)前設(shè)備的處理器的版本信息; 檢測(cè)當(dāng)前設(shè)備的處理器的版本信息是否與所述源文件中處理器版本信息匹配; 若是,則判斷所述可加載內(nèi)核模塊LKM模板支持當(dāng)前設(shè)備的處理器。
7. 如權(quán)利要求6所述的方法,其特征在于,所述獲取所述可加載內(nèi)核模塊LKM模板支持 的處理器版本信息的步驟包括: 當(dāng)所述可加載內(nèi)核模塊LKM模板固化在源文件時(shí),讀取固化在所述源文件中的處理器 版本信息。
8. 如權(quán)利要求1或2或3所述的方法,其特征在于,所述檢測(cè)所述一個(gè)或多個(gè)可加載內(nèi) 核模塊LKM模板是否支持當(dāng)前設(shè)備的處理器和/或當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核的步驟包括: 獲取所述可加載內(nèi)核模塊LKM模板支持的內(nèi)核版本范圍; 讀取當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核的版本信息; 檢測(cè)當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核的版本信息是否歸屬于所述源文件中的內(nèi)核版本范 圍; 若是,則判斷所述可加載內(nèi)核模塊LKM模板支持當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核。
9. 如權(quán)利要求8所述的方法,其特征在于,所述獲取所述可加載內(nèi)核模塊LKM模板支持 的內(nèi)核版本范圍的步驟包括: 當(dāng)所述可加載內(nèi)核模塊LKM模板固化在源文件時(shí),讀取固化在所述源文件中的內(nèi)核版 本范圍。
10. -種可加載內(nèi)核模塊的編譯裝置,包括: 讀取模塊,適于在應(yīng)用程序的組件被觸發(fā)時(shí),讀取所述組件對(duì)應(yīng)的一個(gè)或多個(gè)可加載 內(nèi)核模塊LKM模板; 檢測(cè)模塊,適于檢測(cè)所述一個(gè)或多個(gè)可加載內(nèi)核模塊LKM模板是否支持當(dāng)前設(shè)備的處 理器和/或當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核;若是,則調(diào)用適配模塊; 適配模塊,適于對(duì)所述可加載內(nèi)核模塊LKM模板與當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核進(jìn)行適 配; 編譯模塊,適于采用適配的可加載內(nèi)核模塊LKM模板編譯目標(biāo)可加載內(nèi)核模塊LKM。
【專(zhuān)利摘要】本發(fā)明實(shí)施例提供了一種可加載內(nèi)核模塊的編譯方法和裝置,所述方法包括:當(dāng)應(yīng)用程序的組件被觸發(fā)時(shí),讀取所述組件對(duì)應(yīng)的一個(gè)或多個(gè)可加載內(nèi)核模塊LKM模板;檢測(cè)所述一個(gè)或多個(gè)可加載內(nèi)核模塊LKM模板是否支持當(dāng)前設(shè)備的處理器和/或當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核;若是,則對(duì)所述可加載內(nèi)核模塊LKM模板與當(dāng)前操作系統(tǒng)的系統(tǒng)內(nèi)核進(jìn)行適配;采用適配的可加載內(nèi)核模塊LKM模板編譯目標(biāo)可加載內(nèi)核模塊LKM。本發(fā)明實(shí)施例大大減少了工作量、降低了成本,便于逐步地讓?xiě)?yīng)用程序支持不同的體系架構(gòu)和內(nèi)核范圍,最終推出可以支持多種處理器體系架構(gòu)和非常大范圍的系統(tǒng)內(nèi)核的應(yīng)用程序。
【IPC分類(lèi)】G06F9-445, G06F9-45
【公開(kāi)號(hào)】CN104572235
【申請(qǐng)?zhí)枴緾N201410854976
【發(fā)明人】陳耿佳, 朱江, 周暫
【申請(qǐng)人】北京奇虎科技有限公司, 奇智軟件(北京)有限公司
【公開(kāi)日】2015年4月29日
【申請(qǐng)日】2014年12月31日