PE文件之miansha

首先來簡單瞭解一下殺毒軟件查殺病毒的原理,當前殺毒軟件對病毒的查殺主要有特徵代碼法和行爲監測法。其中前一個比較方法古老,又分爲文件查殺和內存查殺,殺毒軟件公司拿到病毒的樣本以後,定義一段病毒特徵碼到病毒庫中,然後與掃描的文件比對,如果一致則認爲是病毒,內存查殺則是載入內存後再比對,第二個比較新,它利用的原理是某些特定的病毒會有某些特定的行爲,來監測病毒。
免殺常用的工具:
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頭改得一塌糊塗,它就不認識了,如果還想把免殺做好點,可以把自己的服務和註冊表鍵值改成非系統必須的,要是你是不折不扣完美主義者,可以再修改一下加殼後的文件,把免殺進行到底!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章