免殺常用的工具:
Ollydbg 調試器簡稱OD,動態追蹤工具 peid 查殼工具 PEditor PE文件頭編輯工具
CCL,伯樂,MYCCL 特征碼定位器 oc 地址轉換器 reloc 修改EP段地址工具 zeroadd 加區工具 Uedit32 十六進制編輯器
免殺方法
壹.文件免殺
1.加花
2.修改文件特征碼
3.加殼
4.修改加殼後的文件
二.內存免殺
修改特征碼
三.行為免殺
加花
加花是文件免 殺的常用手段,加花原理就是通過添加花指令(壹些垃圾指令,類似加1減1之類廢話)讓殺毒軟件檢測不到特征碼。加花可以分為加區加花和去頭加花。壹般加花 工具使用加區加花,當然也是可以手工加的,就是先用zeroadd添加壹個區段,然後在新加區段裏寫入花指令,然後跳轉到原入口;去頭加花,是先NOP (匯編裏的空操作)掉程序的入口幾行,然後找到下方0000區,寫入NOP掉的代碼和壹些花指令,再通過JMP(匯編裏的無條件跳轉)跳到原入口。
加花以後壹些殺毒軟件就認不出了,但有些比較強悍的殺毒,比如司機大叔(卡巴斯基)可能還是能查出來,這時就要定位特征碼然後修改了,要修改首先必須知道特征碼在哪裏,所以需要先定位特征碼,這是個難點,特別是復合特征碼的定位。
特征碼定位
特征碼定位主要有兩種方法:第壹 直接替換法;第二 二叉數法;
直接替換法是最早開始出現的壹種特征碼定位方法,按壹定的字節數逐個替換原代碼並保存,比如木馬總***100字節,可以先把0-10個字節用0替換,保存, 然後用殺毒軟件掃描,不被查殺說明特征碼已經被覆蓋掉了,如果還被查殺則替換10-20字節,再保存,掃描……直到找出特征碼。替換法的優點是容易理解, 速度快(對文件特征碼而言),特征碼定位工具伯樂以及CCL的手動方式就是利用的替換法原理,文件特征碼定位經常使用的就是這種方法。但是對於內存特征碼的定位這種方法就不太實用了,每次替換以後都要載入內存再掃描,如果木馬較大,替換生成的文件會 非常多,每個都要載入內存花費太多時間,除此之外它還有壹個非常大的局限性,就是只能確定只有壹處特征碼的情況(某種特定情況下的多特征碼也是適用的,下 面的第3種情況將有講述),殺毒軟件還有別的定位特征碼的機制,比如有的殺毒的定義了a,b兩處特征碼(三處或者更多原理是壹樣的,為了講解方便,以下均 以兩處為例),只要a,b有壹個存在便報毒,只有加大替換範圍直到兩處同時被替換才不報毒,如果兩處距離比較遠,定義出的範圍將非常粗糙,很明顯直接替換 法將不再合適,這時第二種方法就有用武之地了。
二叉數法使用的原理是壹半壹半定位,CCL的自動方式就是運用的這個原理。將待檢測段壹分為二,分別替換並生成兩個文件A和B,其中A是原文件後半部分被0替換後生成的,B是前半部分被0替換的,殺毒開始查殺生成文件(如果是內存特征碼定位則先載入內存再掃描內存),有4種情況
(1)A存在,B被刪:這種情況說明A文件中特征碼已經被替換掉,因此將A的被替換部分壹分為二,起始偏移為A的偏移,再進行檢測;
(2)A被刪,B存在:這種情況說明B文件中特征碼已經被替換掉,因此將B的被替換部分壹分為二,起始偏移為B的偏移,再進行檢測;
(3)A存在,B存在:這種情況說明沒法定位A和B中有沒有特征碼,因此分別對A和B再壹分為二進行檢測;
(4)A被刪,B被刪:這種情況說明兩個區段都存在特征碼,因此分別對A和B再壹分為二進行檢測。
對A再分時會將原來的B區段填充為0,相當於去除B區段的影響,只考慮A;同理對B再分時會將原來的A區段內容填0,相當於去除A區段的影響,只考慮B。
第(1)(2)對應的是只有壹處特征碼的情況,比較容易理解;
第(3)對應的是定義了a,b兩處特征碼的情況,但是和前面提到的那種不同,殺毒軟件為避免誤判,定義了a,b兩處特征碼,要ab同時存在時才報毒,假設a,b分別存在於A,B中,a,b不同時存在,殺毒對A,B均不報警,接下來該如何判斷呢?舉個例子說明壹下
木 馬原來是…a……b…,第壹次替換以後A:…a…000000,B:000000…b…,現在ab不同時存在,A,B都不被殺,則分別對A,B再次壹分為 二,…a……b000,…a…000…,000……b…,…a000…b…,再次掃描就可以找到兩處特征碼的位置,如果還是不行,再繼續分……直到全部找 到;其實這種類型的多特征碼直接替換也是可以定位的,甚至效果更好,按壹定位數替換,然後掃描,只要替換了壹個特征碼就不再報毒,所以不報毒的便是特征碼 被覆蓋的,不管有幾處都可以定位出,而且修改時也只要修改任意壹處就可以了。
第(4)種對應的情況也是殺毒定義了多處特征碼,就是上面提到的那種情況,只要有壹處符合就認定是病毒。還是以a,b兩處特征碼為例,第壹次替換後的結果同(3),兩部分分開考慮,互不影響, 相當於分解成兩個單個特征碼的情況,第二次替換後變成000000…b000,000000…000…,000…000000,…a000000000, 依此類推,直到精確定位出所有特征碼,如果有N處特征碼就相當於分解成N個單特征碼來定位,現在N壹般小於等於3,這種情況定位出的所有特征碼必須全部修 改了才能免殺。
二叉數法是個很不錯的思路,可以解決大部分的問題,但是不是無懈可擊呢?回答是否定的!可惡的殺毒軟件還有壹個殺手鐧,就是復合特征碼,給我們定位特征碼 帶來了很大的麻煩。復合特征碼的定位機制是,先定義出N個特征碼,只要裏面某些同時出現便認為是病毒。舉個簡單例子說明壹下:木馬原來是…a1…b1… c1…a2…b2…c2…(a1,a2壹樣,加標號只是為了後面描述方便),只要abc同時出現就認為是病毒,這該如何定位呢?原理不是很難,也是利用替 換再查殺的方法,先從後往前用0替換,替換精度假設為每次替換量增加1000字節,開始壹直顯示是病毒,直到替換到地址13140040(為敘述方便隨便 說的壹個地址)時替換的字節達到15000個,即…a1…b1…00000000,兩個c都被替換掉了,此時顯示不是病毒,由此可知,特征碼c1就在 13140040後面1000字節內,減小替換字節數比如改為替換14900字節,即精度改為每次替換減小100字節,還是無毒則減為替換14800字 節,不斷重復……直到精確定位出c1的位置;如果改為從前往後替換,則可以定位出a2的位置;其他特征碼的定位可以利用已經定位到的c1,a2,把其中壹 個用0替換了比如c1,從後往前就可以定位出c2,直到定位出所有特征碼,其實原理並不復雜,但是要真正手動操作起來卻是非常麻煩的,我們可以利用 MYCCL,它用的原理與之類似,具體操作可以看MYCCL的操作幫助。還有壹種方法更科學,原理是壹樣,但是替換的字節數不是等量增加的,而是以2的n -1次方增加的,第壹次替換1字節,第二次2字節,第三次4字節……減小時也按照這種規律,這種替換方法有點類似於二叉數法,可以更快定位出特征碼的位 置,我想這也是MYCCL在復合特征碼定位方面應該改進的地方吧。
復合特征碼雖好,大家也不用害怕,認為所有殺毒都來個復合特征碼我們就要累死了,定義復合特征碼需要單個特征碼幾倍的病毒庫,不方便用戶的升級,所以除了特別流行的病毒,定義復合特征碼的也不是很多。
定位特征碼有些經驗可以告訴大家,文件特征碼的定位壹般用直接替換法,可以借用CCL的手動定位;內存特征碼定位,壹般用二叉數法,可以用CCL自動定位。對於EXE文件如果文件較小,可以兩種方法結合,先用直接替換法生成,可以用伯樂這個工具(為什麽不用CCL呢,因為伯樂生成的是EXE文件可以看出圖標的模樣),找到還能正常運行的,那些圖標都變了的說明PE頭已經損壞了,就不要試了,然後載入內存,再掃描內存,如果既能正常運行又不被殺,恭喜妳!成功了!定位出了大體範圍,再用CCL自動定位,很快就可以完成。如果文件較大,用伯樂生成的文件太多,也不方便,還是用CCL定位,對於DLL文件也只能老老實實用CCL定位了。
特征碼修改
特征碼修改可能需要壹點匯編的知識,光盤裏有常用的匯編語法介紹,修改主要有直接修改法和跳轉修改法。
直接修改法利用的是等效指令替換,比如
add eax,0c等效於sub eax,-0c
或者指令順序的改變不影響執行的效果,比如
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碼,可以直接修改大小寫,小寫字母換成大寫,大寫的換成小寫。
加殼
不用說了,用工具大家都會,加殼的原理是給原程序加上壹段保護程序,有保護和加密功能,運行加殼後的文件是先運行殼再運行真實文件從而起到保護作用。我想提醒大家的是,再好的殼用的人多了,還是會被殺的,所以可以努力學好E文,自己到國外的網站找加殼工具,比較好。
修改加殼後的文件
加殼以後程序入口處會有壹段特殊代碼,可以自己用OD打開不同加殼工具加過殼的文件, 可以發現不同的殼開頭那段代碼是不同的,也可以說成是殼的特征代碼吧,對於常用的殼殺毒軟件可以脫掉殼再查殺,也就是所謂的穿殼技術,為了避免殺毒軟件認 出是加的哪種殼我們可以加雙殼,或者自己修改開頭那段代碼,從而讓殺毒看不出是什麽工具加的殼,這裏我只講壹種修改方法,可以參照去頭添加花指令,在空白 區域加入壹段別的殼的特征頭,然後JMP跳到原入口,這樣殺毒就會誤判加殼工具,從而達到免殺的效果,其實方法是多樣只要願意思考總能想出應對的方法。
還有壹種修改殼的方法就是修改EP段的入口,用Peid查壹下加過殼的木馬,可以發現EP段的地址,也就是區段入口,通過修改EP入口地址可以達到免殺的效果,利用的工具是reloc,具體使用方法自己去問google。
行為免殺
這種殺毒的代表是綠鷹PC萬能精靈。壹般說來木馬在運行以後會復制到系統目錄下然後運行,原文件可能會自動刪除,現在的木馬壹般是插入進程來訪問網絡的,在進程裏可以看到被插入的進程,設置開機啟動也是木馬必須做的可以寫入註冊表,加入服務,寫入驅動等等,這些便是木馬特有的行為。我們可以用註冊表監控,文件修改監控的工具比如木馬輔助查找器記錄修改的文件、註冊表,推測殺毒可能監控的是哪個行為從而對應修改行為來達到行為免殺。還有壹個壹般的方法,行為殺毒是不會查殺系統的啟動項的,我們可以把木馬的啟動項替換成非系統必須的開機自啟動項就可以成功免殺了。至於其他的方法,大家可以自己再研究。
至於網上流傳的入口加1,就是用PEditor將木馬入口地址+1,有時也是可以達到免殺的效果,好象是瑞星比較吃這個,還有個小竅門可以告訴大家,要讓 自己的免殺木馬盡量久的不被查到,最好選擇比較老的木馬來做,對新木馬,殺毒盯的緊會經常更新病毒庫,而老的呢……不用說了吧。
總結:
壹般免殺步驟是先定義內存特征碼,修改內存特征碼,加花指令做文件免殺,如果還被某些殺毒查殺則定義文件特征碼,修改特征碼,接下來是行為免殺,然後加殼,再修改殼。內存免殺壹般只要做瑞星的就可以了,其他的殺毒軟件沒有真正意義上的內存殺毒,比如卡巴斯基的內存掃描就是文件快速掃描,壹般加入花指令(稍微學點匯編,折騰些垃圾代碼是很簡單的)以後就可以躲過金山,瑞星,江民的文件查殺,萬壹有不過的就要定位特征碼再修改,卡巴的文件查 殺是很牛的,加了殼也幾乎都能可以查出來,壹般都要定位特征碼再修改,對於諾頓這種喜歡把特征碼定位在PE頭的只要用北鬥之類工具加個殼,把PE頭改得壹 塌糊塗,它就不認識了,如果還想把免殺做好點,可以把自己的服務和註冊表鍵值改成非系統必須的,要是妳是不折不扣完美主義者,可以再修改壹下加殼後的文件,把免殺進行到底!