木马免杀原理详解
首先來(lái)簡(jiǎn)單了解一下殺毒軟件查殺病毒的原理,當(dāng)前殺毒軟件對(duì)病毒的查殺主要有特征代碼法和行為監(jiān)測(cè)法。其中前一個(gè)比較方法古老,又分為文件查殺和內(nèi)存查殺,殺毒軟件公司拿到病毒的樣本以后,定義一段病毒特征碼到病毒庫(kù)中,然后與掃描的文件比對(duì),如果一致則認(rèn)為是病毒,內(nèi)存查殺則是載入內(nèi)存后再比對(duì),第二個(gè)比較新,它利用的原理是某些特定的病毒會(huì)有某些特定的行為,來(lái)監(jiān)測(cè)病毒。
免殺常用的工具:
Ollydbg?調(diào)試器簡(jiǎn)稱OD,動(dòng)態(tài)追蹤工具?????peid?查殼工具???PEditor?PE文件頭編輯工具?
CCL,伯樂(lè),MYCCL?特征碼定位器?????oc?地址轉(zhuǎn)換器?????reloc?修改EP段地址工具???zeroadd?加區(qū)工具???Uedit32?十六進(jìn)制編輯器???
免殺方法
一.文件免殺???
1.加花???
2.修改文件特征碼???
3.加殼???
4.修改加殼后的文件?
二.內(nèi)存免殺???
??修改特征碼?
三.行為免殺?
加花
??加花是文件免殺的常用手段,加花原理就是通過(guò)添加花指令(一些垃圾指令,類似加1減1之類廢話)讓殺毒軟件檢測(cè)不到特征碼。加花可以分為加區(qū)加花和去頭加花。一般加花工具使用加區(qū)加花,當(dāng)然也是可以手工加的,就是先用zeroadd添加一個(gè)區(qū)段,然后在新加區(qū)段里寫(xiě)入花指令,然后跳轉(zhuǎn)到原入口;去頭加花,是先NOP(匯編里的空操作)掉程序的入口幾行,然后找到下方0000區(qū),寫(xiě)入NOP掉的代碼和一些花指令,再通過(guò)JMP(匯編里的無(wú)條件跳轉(zhuǎn))跳到原入口。
加花以后一些殺毒軟件就認(rèn)不出了,但有些比較強(qiáng)悍的殺毒,比如司機(jī)大叔(卡巴斯基)可能還是能查出來(lái),這時(shí)就要定位特征碼然后修改了,要修改首先必須知道特征碼在哪里,所以需要先定位特征碼,這是個(gè)難點(diǎn),特別是復(fù)合特征碼的定位。?
特征碼定位
?特征碼定位主要有兩種方法:第一?直接替換法;第二?二叉數(shù)法;
?直接替換法是最早開(kāi)始出現(xiàn)的一種特征碼定位方法,按一定的字節(jié)數(shù)逐個(gè)替換原代碼并保存,比如木馬總共100字節(jié),可以先把0-10個(gè)字節(jié)用0替換,保存,然后用殺毒軟件掃描,不被查殺說(shuō)明特征碼已經(jīng)被覆蓋掉了,如果還被查殺則替換10-20字節(jié),再保存,掃描……直到找出特征碼。替換法的優(yōu)點(diǎn)是容易理解,速度快(對(duì)文件特征碼而言),特征碼定位工具伯樂(lè)以及CCL的手動(dòng)方式就是利用的替換法原理,文件特征碼定位經(jīng)常使用的就是這種方法。但是對(duì)于內(nèi)存特征碼的定位這種方法就不太實(shí)用了,每次替換以后都要載入內(nèi)存再掃描,如果木馬較大,替換生成的文件會(huì)非常多,每個(gè)都要載入內(nèi)存花費(fèi)太多時(shí)間,除此之外它還有一個(gè)非常大的局限性,就是只能確定只有一處特征碼的情況(某種特定情況下的多特征碼也是適用的,下面的第3種情況將有講述),殺毒軟件還有別的定位特征碼的機(jī)制,比如有的殺毒的定義了a,b兩處特征碼(三處或者更多原理是一樣的,為了講解方便,以下均以兩處為例),只要a,b有一個(gè)存在便報(bào)毒,只有加大替換范圍直到兩處同時(shí)被替換才不報(bào)毒,如果兩處距離比較遠(yuǎn),定義出的范圍將非常粗糙,很明顯直接替換法將不再合適,這時(shí)第二種方法就有用武之地了。
?二叉數(shù)法使用的原理是一半一半定位,CCL的自動(dòng)方式就是運(yùn)用的這個(gè)原理。將待檢測(cè)段一分為二,分別替換并生成兩個(gè)文件A和B,其中A是原文件后半部分被0替換后生成的,B是前半部分被0替換的,殺毒開(kāi)始查殺生成文件(如果是內(nèi)存特征碼定位則先載入內(nèi)存再掃描內(nèi)存),有4種情況
(1)A存在,B被刪:這種情況說(shuō)明A文件中特征碼已經(jīng)被替換掉,因此將A的被替換部分一分為二,起始偏移為A的偏移,再進(jìn)行檢測(cè);
(2)A被刪,B存在:這種情況說(shuō)明B文件中特征碼已經(jīng)被替換掉,因此將B的被替換部分一分為二,起始偏移為B的偏移,再進(jìn)行檢測(cè);
(3)A存在,B存在:這種情況說(shuō)明沒(méi)法定位A和B中有沒(méi)有特征碼,因此分別對(duì)A和B再一分為二進(jìn)行檢測(cè);
(4)A被刪,B被刪:這種情況說(shuō)明兩個(gè)區(qū)段都存在特征碼,因此分別對(duì)A和B再一分為二進(jìn)行檢測(cè)。
對(duì)A再分時(shí)會(huì)將原來(lái)的B區(qū)段填充為0,相當(dāng)于去除B區(qū)段的影響,只考慮A;同理對(duì)B再分時(shí)會(huì)將原來(lái)的A區(qū)段內(nèi)容填0,相當(dāng)于去除A區(qū)段的影響,只考慮B。
第(1)(2)對(duì)應(yīng)的是只有一處特征碼的情況,比較容易理解;
第(3)對(duì)應(yīng)的是定義了a,b兩處特征碼的情況,但是和前面提到的那種不同,殺毒軟件為避免誤判,定義了a,b兩處特征碼,要ab同時(shí)存在時(shí)才報(bào)毒,假設(shè)a,b分別存在于A,B中,a,b不同時(shí)存在,殺毒對(duì)A,B均不報(bào)警,接下來(lái)該如何判斷呢?舉個(gè)例子說(shuō)明一下
木馬原來(lái)是…a……b…,第一次替換以后A:…a…000000,B:000000…b…,現(xiàn)在ab不同時(shí)存在,A,B都不被殺,則分別對(duì)A,B再次一分為二,…a……b000,…a…000…,000……b…,…a000…b…,再次掃描就可以找到兩處特征碼的位置,如果還是不行,再繼續(xù)分……直到全部找到;其實(shí)這種類型的多特征碼直接替換也是可以定位的,甚至效果更好,按一定位數(shù)替換,然后掃描,只要替換了一個(gè)特征碼就不再報(bào)毒,所以不報(bào)毒的便是特征碼被覆蓋的,不管有幾處都可以定位出,而且修改時(shí)也只要修改任意一處就可以了。
第(4)種對(duì)應(yīng)的情況也是殺毒定義了多處特征碼,就是上面提到的那種情況,只要有一處符合就認(rèn)定是病毒。還是以a,b兩處特征碼為例,第一次替換后的結(jié)果同(3),兩部分分開(kāi)考慮,互不影響,相當(dāng)于分解成兩個(gè)單個(gè)特征碼的情況,第二次替換后變成000000…b000,000000…000…,000…000000,…a000000000,依此類推,直到精確定位出所有特征碼,如果有N處特征碼就相當(dāng)于分解成N個(gè)單特征碼來(lái)定位,現(xiàn)在N一般小于等于3,這種情況定位出的所有特征碼必須全部修改了才能免殺。 二叉數(shù)法是個(gè)很不錯(cuò)的思路,可以解決大部分的問(wèn)題,但是不是無(wú)懈可擊呢?回答是否定的!可惡的殺毒軟件還有一個(gè)殺手锏,就是復(fù)合特征碼,給我們定位特征碼帶來(lái)了很大的麻煩。復(fù)合特征碼的定位機(jī)制是,先定義出N個(gè)特征碼,只要里面某些同時(shí)出現(xiàn)便認(rèn)為是病毒。舉個(gè)簡(jiǎn)單例子說(shuō)明一下:木馬原來(lái)是…a1…b1…c1…a2…b2…c2…(a1,a2一樣,加標(biāo)號(hào)只是為了后面描述方便),只要abc同時(shí)出現(xiàn)就認(rèn)為是病毒,這該如何定位呢?原理不是很難,也是利用替換再查殺的方法,先從后往前用0替換,替換精度假設(shè)為每次替換量增加1000字節(jié),開(kāi)始一直顯示是病毒,直到替換到地址13140040(為敘述方便隨便說(shuō)的一個(gè)地址)時(shí)替換的字節(jié)達(dá)到15000個(gè),即…a1…b1…00000000,兩個(gè)c都被替換掉了,此時(shí)顯示不是病毒,由此可知,特征碼c1就在13140040后面1000字節(jié)內(nèi),減小替換字節(jié)數(shù)比如改為替換14900字節(jié),即精度改為每次替換減小100字節(jié),還是無(wú)毒則減為替換14800字節(jié),不斷重復(fù)……直到精確定位出c1的位置;如果改為從前往后替換,則可以定位出a2的位置;其他特征碼的定位可以利用已經(jīng)定位到的c1,a2,把其中一個(gè)用0替換了比如c1,從后往前就可以定位出c2,直到定位出所有特征碼,其實(shí)原理并不復(fù)雜,但是要真正手動(dòng)操作起來(lái)卻是非常麻煩的,我們可以利用MYCCL,它用的原理與之類似,具體操作可以看MYCCL的操作幫助。還有一種方法更科學(xué),原理是一樣,但是替換的字節(jié)數(shù)不是等量增加的,而是以2的n-1次方增加的,第一次替換1字節(jié),第二次2字節(jié),第三次4字節(jié)……減小時(shí)也按照這種規(guī)律,這種替換方法有點(diǎn)類似于二叉數(shù)法,可以更快定位出特征碼的位置,我想這也是MYCCL在復(fù)合特征碼定位方面應(yīng)該改進(jìn)的地方吧。
?復(fù)合特征碼雖好,大家也不用害怕,認(rèn)為所有殺毒都來(lái)個(gè)復(fù)合特征碼我們就要累死了,定義復(fù)合特征碼需要單個(gè)特征碼幾倍的病毒庫(kù),不方便用戶的升級(jí),所以除了特別流行的病毒,定義復(fù)合特征碼的也不是很多。
?定位特征碼有些經(jīng)驗(yàn)可以告訴大家,文件特征碼的定位一般用直接替換法,可以借用CCL的手動(dòng)定位;內(nèi)存特征碼定位,一般用二叉數(shù)法,可以用CCL自動(dòng)定位。對(duì)于EXE文件如果文件較小,可以兩種方法結(jié)合,先用直接替換法生成,可以用伯樂(lè)這個(gè)工具(為什么不用CCL呢,因?yàn)椴畼?lè)生成的是EXE文件可以看出圖標(biāo)的模樣),找到還能正常運(yùn)行的,那些圖標(biāo)都變了的說(shuō)明PE頭已經(jīng)損壞了,就不要試了,然后載入內(nèi)存,再掃描內(nèi)存,如果既能正常運(yùn)行又不被殺,恭喜你!成功了!定位出了大體范圍,再用CCL自動(dòng)定位,很快就可以完成。如果文件較大,用伯樂(lè)生成的文件太多,也不方便,還是用CCL定位,對(duì)于DLL文件也只能老老實(shí)實(shí)用CCL定位了。
特征碼修改
?特征碼修改可能需要一點(diǎn)匯編的知識(shí),光盤(pán)里有常用的匯編語(yǔ)法介紹,修改主要有直接修改法和跳轉(zhuǎn)修改法。
直接修改法利用的是等效指令替換,比如
add?eax,0c等效于sub?eax,-0c
或者指令順序的改變不影響執(zhí)行的效果,比如
add?eax,0c;eax寄存器加上0c再賦給eax?
add?ebx,05;ebx寄存器加上05再賦給ebx?
等效于
add?ebx,05;ebx寄存器加上05再賦給ebx?
add?eax,0c;eax寄存器加上0c再賦給eax?
還有一種是如果特征碼是ASCII碼,可以直接修改大小寫(xiě),小寫(xiě)字母換成大寫(xiě),大寫(xiě)的換成小寫(xiě)。
SOFTWARE/Borland可以改成sofTwAre/BOrlaND
大家可以學(xué)習(xí)一下最基礎(chǔ)的匯編語(yǔ)法,并不難,對(duì)特征碼修改你將會(huì)有更深的理解。
跳轉(zhuǎn)修改法比較簡(jiǎn)單,主要原理就是把特征碼的那段NOP掉,然后把NOP掉的語(yǔ)句寫(xiě)入空白的0000區(qū),再通過(guò)JMP跳轉(zhuǎn)連接起來(lái),讓殺毒找不到特征碼,從而達(dá)到免殺的目的。
| 這樣便把特征碼的位置改變了,又不影響代碼的執(zhí)行,只要特征碼定位準(zhǔn)了,絕對(duì)免殺! 注意:文件地址指二進(jìn)制文件的實(shí)際偏移地址,內(nèi)存偏移指相對(duì)虛擬地址(RVA),一般等于文件偏移地址加基地址(感謝楚茗大哥的指點(diǎn)),通過(guò)定位特征碼得出的是實(shí)際偏移地址,載入內(nèi)存以后,地址會(huì)變化,不再是文件特征碼定位時(shí)的地址了,所以修改特征碼不能忘記把定位出的地址轉(zhuǎn)換為對(duì)應(yīng)內(nèi)存地址,這里可以借助一個(gè)小工具oc.exe確定,然后再進(jìn)行修改,WinHex,Uedit這類16進(jìn)制編輯器打開(kāi)顯示的地址是文件地址,而OD這類動(dòng)態(tài)匯編調(diào)試工具打開(kāi)顯示則的是內(nèi)存地址。? 加殼? ?不用說(shuō)了,用工具大家都會(huì),加殼的原理是給原程序加上一段保護(hù)程序,有保護(hù)和加密功能,運(yùn)行加殼后的文件是先運(yùn)行殼再運(yùn)行真實(shí)文件從而起到保護(hù)作用。我想提醒大家的是,再好的殼用的人多了,還是會(huì)被殺的,所以可以努力學(xué)好E文,自己到國(guó)外的網(wǎng)站找加殼工具,比較好。這可是我壓箱底的經(jīng)驗(yàn),一般人我不告訴他! 修改加殼后的文件 ?加殼以后程序入口處會(huì)有一段特殊代碼,可以自己用OD打開(kāi)不同加殼工具加過(guò)殼的文件,可以發(fā)現(xiàn)不同的殼開(kāi)頭那段代碼是不同的,也可以說(shuō)成是殼的特征代碼吧,對(duì)于常用的殼殺毒軟件可以脫掉殼再查殺,也就是所謂的穿殼技術(shù),為了避免殺毒軟件認(rèn)出是加的哪種殼我們可以加雙殼,或者自己修改開(kāi)頭那段代碼,從而讓殺毒看不出是什么工具加的殼,這里我只講一種修改方法,可以參照去頭添加花指令,在空白區(qū)域加入一段別的殼的特征頭,然后JMP跳到原入口,這樣殺毒就會(huì)誤判加殼工具,從而達(dá)到免殺的效果,其實(shí)方法是多樣只要愿意思考總能想出應(yīng)對(duì)的方法。 ?還有一種修改殼的方法就是修改EP段的入口,用Peid查一下加過(guò)殼的木馬,可以發(fā)現(xiàn)EP段的地址,也就是區(qū)段入口,通過(guò)修改EP入口地址可以達(dá)到免殺的效果,利用的工具是reloc(國(guó)內(nèi)好象沒(méi)提供下載的,我在國(guó)外網(wǎng)站找到的)放在光盤(pán)里了,具體使用方法自己去問(wèn)google。 行為免殺? ?這種殺毒的代表是綠鷹PC萬(wàn)能精靈。一般說(shuō)來(lái)木馬在運(yùn)行以后會(huì)復(fù)制到系統(tǒng)目錄下然后運(yùn)行,原文件可能會(huì)自動(dòng)刪除,現(xiàn)在的木馬一般是插入進(jìn)程來(lái)訪問(wèn)網(wǎng)絡(luò)的,在進(jìn)程里可以看到被插入的進(jìn)程,設(shè)置開(kāi)機(jī)啟動(dòng)也是木馬必須做的可以寫(xiě)入注冊(cè)表,加入服務(wù),寫(xiě)入驅(qū)動(dòng)等等,這些便是木馬特有的行為。我們可以用注冊(cè)表監(jiān)控,文件修改監(jiān)控的工具比如木馬輔助查找器記錄修改的文件、注冊(cè)表,推測(cè)殺毒可能監(jiān)控的是哪個(gè)行為從而對(duì)應(yīng)修改行為來(lái)達(dá)到行為免殺。還有一個(gè)一般的方法,行為殺毒是不會(huì)查殺系統(tǒng)的啟動(dòng)項(xiàng)的,我們可以把木馬的啟動(dòng)項(xiàng)替換成非系統(tǒng)必須的開(kāi)機(jī)自啟動(dòng)項(xiàng)就可以成功免殺了。至于其他的方法,大家可以自己再研究。 ?至于網(wǎng)上流傳的入口加1,就是用PEditor將木馬入口地址+1,有時(shí)也是可以達(dá)到免殺的效果,好象是瑞星比較吃這個(gè),還有個(gè)小竅門(mén)可以告訴大家,要讓自己的免殺木馬盡量久的不被查到,最好選擇比較老的木馬來(lái)做,對(duì)新木馬,殺毒盯的緊會(huì)經(jīng)常更新病毒庫(kù),而老的呢……不用說(shuō)了吧。 總結(jié): ?一般免殺步驟是先定義內(nèi)存特征碼,修改內(nèi)存特征碼,加花指令做文件免殺,如果還被某些殺毒查殺則定義文件特征碼,修改特征碼,接下來(lái)是行為免殺,然后加殼,再修改殼。內(nèi)存免殺一般只要做瑞星的就可以了,其他的殺毒軟件沒(méi)有真正意義上的內(nèi)存殺毒,比如卡巴斯基的內(nèi)存掃描就是文件快速掃描,一般加入花指令(稍微學(xué)點(diǎn)匯編,折騰些垃圾代碼是很簡(jiǎn)單的)以后就可以躲過(guò)金山,瑞星,江民的文件查殺,萬(wàn)一有不過(guò)的就要定位特征碼再修改,卡巴的文件查殺是很牛的,加了殼也幾乎都能可以查出來(lái),一般都要定位特征碼再修改,對(duì)于諾頓這種喜歡把特征碼定位在PE頭的只要用北斗之類工具加個(gè)殼,把PE頭改得一塌糊涂(當(dāng)然也可以手工修改PE頭,不過(guò)比較麻煩,不容易說(shuō)清楚,而且需要了解一些PE文件的結(jié)構(gòu)知識(shí),想知道的可以聯(lián)系我,論壇ID:幽游),它就不認(rèn)識(shí)了,如果還想把免殺做好點(diǎn),可以把自己的服務(wù)和注冊(cè)表鍵值改成非系統(tǒng)必須的,那么綠鷹這類行為查殺的笨蛋就成盲人了!要是你是不折不扣完美主義者,可以再修改一下加殼后的文件,把免殺進(jìn)行到底! ?這篇文章主要講了免殺的原理和理論上的方法以及一些個(gè)人的心得,并沒(méi)有太多演示,因?yàn)槲覀€(gè)人感覺(jué),理解原理才是最重要的,只有這樣你自己才可能有突破,想出更多免殺的方法,只要理解了原理免殺根本就不是難事!文中有很多地方是個(gè)人的理解,如果有不對(duì)的地方還請(qǐng)高手指正。最后希望殺毒軟件有更多先進(jìn)優(yōu)秀的殺毒方法,更好地保護(hù)計(jì)算機(jī)的安全,也給我們一些挑戰(zhàn),還有國(guó)內(nèi)的殺毒趕快發(fā)展起來(lái),成為世界一流的殺毒軟件,特別是金*,不要讓我們做免殺的時(shí)候再把你忽略不計(jì)…… |
| ? |
?
總結(jié)
- 上一篇: sdcms栏目图片的调用方法
- 下一篇: 离线地图数据包下载(全国地图数据)及应用