病毒特征码定位原理和首次使用MyCCL
一 什么是病毒特征碼
?
特征碼就是從病毒體內(nèi)不同位置提取的一系列字節(jié),殺毒軟件就是通過這些字節(jié)及位置信息來檢驗(yàn)?zāi)硞€(gè)文件是否病毒。每個(gè)殺毒軟件公司都有自己的特征碼提取方法和提取工具,這也是特別需要技術(shù)的地方,弄不好就造成誤判,將好文件當(dāng)成病毒給殺了。殺毒軟件公司在提取特征碼后,一般都需要經(jīng)過較嚴(yán)格的測(cè)試和比對(duì),當(dāng)然也有時(shí)間緊迫,來不及充分測(cè)試就匆匆升級(jí)病毒庫(也就是特征碼庫)的情況,前不久的Norton誤刪windows系統(tǒng)文件就是這樣造成的。
特征碼比對(duì)是當(dāng)前主流殺毒技術(shù)的尷尬,但它確實(shí)是針對(duì)已知病毒最有效,并經(jīng)過證明穩(wěn)定可行的方法。缺點(diǎn)是對(duì)未知病毒沒有防范能力,殺毒總是跟在病毒后面跑。所以,各殺毒公司也有一些自己的查殺未知病毒的技術(shù)。目前,也有一些基于行為特征的主動(dòng)防御的商業(yè)軟件(被稱為HIPS)推出,比如System Safety Monitor等。
?
二 MyCCL簡介
常用的定位木馬病毒特征碼的工具有三款,CCL,MultiCCL,MYCCL。CCL程序出現(xiàn)后,使得特征碼修改已經(jīng)成為了對(duì)付殺毒軟件的常用手法,但是殺毒軟件開始使用多重復(fù)合特征碼來對(duì)付特征碼修改就是說只有你同時(shí)改掉程序所有的守護(hù)特征碼此程序才不被殺。CCL這樣的定位工具無法直接定位出特征碼,要定位復(fù)合特征碼必須手工劃分,而MYCCL是CCL的改進(jìn)版,可以進(jìn)行多重特征碼的定位,針對(duì)金山等殺軟的反向定位等功能,并實(shí)現(xiàn)自動(dòng)化代碼定位和顯示。
MyCCL定位原理
假設(shè)一段木馬程序代碼是這樣(0代表NULL,X代表程序代碼,a、b、c等代表特征碼):
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:XXXXXXXXXXXXcXXXXXXX
當(dāng)文件同時(shí)包含a.b.c三種特征碼的時(shí)候,殺軟就報(bào)毒。這就是所謂的復(fù)合特征碼。當(dāng)然殺軟在定義復(fù)合特征碼的時(shí)候可能有好幾種組合,好幾套特征碼。當(dāng)是復(fù)合特征碼的時(shí)候,在用CCL來定位結(jié)果是很困難的。而MyCCL在CCL的基礎(chǔ)上又進(jìn)步了。這里手動(dòng)用MyCCL來生成5個(gè)文件。
========File1=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:00000000000000000000
004h:00000000000000000000
005h:00000000000000000000
========File2=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:00000000000000000000
004h:00000000000000000000
005h:00000000000000000000
========File3=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:XXXXXXXXXaXXXXXXXXXX
004h:00000000000000000000
005h:00000000000000000000
========File4=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:00000000000000000000
========File5=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:XXXXXXXXXXXXcXXXXXXX
=========================
從File2開始就有了abc特征碼的組合,File2到File5就被殺了。被殺以后再用MyCCL,進(jìn)行二次定位,這樣我們就知道了特征碼c的位置了。然后再把002h那行置0,再生成一次。
第二次生成5個(gè)文件:
========File1=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:00000000000000000000
004h:00000000000000000000
005h:00000000000000000000
========File2=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:00000000000000000000
004h:00000000000000000000
005h:00000000000000000000
========File3=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:XXXXXXXXXaXXXXXXXXXX
004h:00000000000000000000
005h:00000000000000000000
========File4=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:00000000000000000000
========File5=============
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:XXXXXXXXXXXXcXXXXXXX
=========================
因?yàn)?02h被我們置0了,這里只有File5有abc特征碼了,所以File5被殺,這時(shí)另一處c也暴露出來了,這樣我們就把所有c特征碼都定位出來了。MYCCL解決了CCL定位復(fù)合特征碼的困難。
?
三 首次使用MyCCL
首先打開一個(gè)文件;目前沒有病毒樣本;隨便打開個(gè)QQ附帶的DLL看看; 點(diǎn)擊生成,出現(xiàn)下面提示;害怕清空了有用的文件;把該dll拷貝到另一個(gè)目錄,再操作; 看了一下,原來是在打開文件的目錄下,新建一個(gè)OUTPUT目錄,切塊后的文件放在OUTPUT中;不會(huì)對(duì)原來的文件造成影響; 隨便輸個(gè)分10塊,點(diǎn)擊生成以后,結(jié)果如下; 未分塊的文件是107K;分了10塊以后,看一下,每一塊還是107K;首次使用還真是茫然; 修改單位長度為1093,分塊數(shù)量自動(dòng)變?yōu)?00; 輸入5093的單位長度,分塊數(shù)量自動(dòng)變?yōu)?1; 點(diǎn)擊 生成 以后,會(huì)彈出如下提示;?
分成21塊的情況;
?
點(diǎn)擊二次處理按鈕,給出的特征碼定位結(jié)果如下;
?
為什么分為10塊或更多,每塊的大小都同原始大小呢;用Winhex打開看下,對(duì)很多地方是用0填充的;
其工作原理,目前尚未完全搞懂;下次再搞;
?
四 特征碼逐塊填充定位原理
http://book.51cto.com/art/201309/411648.htm
《黑客免殺攻防》第3章免殺與特征碼,
我們將從簡單的腳本木馬免殺開始介紹,引導(dǎo)大家逐步認(rèn)識(shí)特征碼、特征碼免殺,進(jìn)而了解如何修改特征碼。本節(jié)為大家介紹特征碼逐塊填充定位原理。
3.2.1 特征碼逐塊填充定位原理
逐塊填充定位的方法在國內(nèi)首先出現(xiàn)在CCL上,CCL是國內(nèi)首款演示研究性的特征碼定位工具,也是一款原理簡單的單一特征碼定位器。
鑒于我們現(xiàn)在還沒講到特征碼定位器的使用技巧,所以這里只講原理,不涉及操作,具體操作會(huì)在后面介紹。待了解了特征碼定位器的使用技巧后,如果再回頭來反復(fù)咀嚼這一節(jié)所講的內(nèi)容,相信對(duì)免殺的理解也會(huì)更進(jìn)一步。
為了更加直觀地介紹各個(gè)特征碼定位器的原理,我制作了一個(gè)極其簡單的例子程序,如圖3-5所示。當(dāng)然這個(gè)程序是不能運(yùn)行的,只是為了演示所用。這個(gè)程序中的“1111……”代表的是有數(shù)據(jù)的地方,其中的“AA”就是我們假定的特征碼。
當(dāng)我們用CCL定位特征碼時(shí),它會(huì)從區(qū)段頭部開始填充“00”數(shù)據(jù),因?yàn)椤?0”往往都表示“此處為空”,所以如果將某一段數(shù)據(jù)替換為“00”,也就相當(dāng)于刪除了這段數(shù)據(jù)。為了讓演示效果更加明顯,這里將整個(gè)文件作為一個(gè)區(qū)段來定位。現(xiàn)在來看看CCL生成的第一個(gè)無后綴文件OUT_00000000_00000010,如圖3-6所示。不難發(fā)現(xiàn),第一行已經(jīng)被無意義的“00”給填充了,我們假設(shè)的特征碼“AA”現(xiàn)在已經(jīng)不存在了,很顯然這個(gè)文件是不會(huì)被反病毒軟件查殺的。
下面再看看生成的第二個(gè)文件OUT_00000010_00000010,如圖3-7所示。
我們發(fā)現(xiàn)由于填充的部位變成了第2行,所以特征碼“AA”這時(shí)又暴露出來,因此這個(gè)文件肯定會(huì)被反病毒軟件查殺。再來看第三個(gè)文件OUT_00000020_00000010,如圖3-8所示。
很顯然,這次是文件的第3行被“00”填充了,這個(gè)文件依然包含特征碼。到了現(xiàn)在,我們可以猜得出來,第四個(gè)文件肯定是第4行被填充了,而且由于沒有覆蓋住特征碼“AA”,因此它同樣會(huì)被殺,如圖3-9所示。
?
在這次操作中CCL總共生成了4個(gè)文件,其中3個(gè)被殺,經(jīng)過簡單的推理可以確定,是第一個(gè)文件覆蓋掉了特征碼,又因?yàn)榈谝粋€(gè)文件中的第一行數(shù)據(jù)被“00”填充了,進(jìn)而可以很自然地推斷出—特征碼就在第一行。
但是這個(gè)特征碼的范圍是不是有些大呢?其實(shí)在真正操作的時(shí)候,如果我們想得到比較小的特征碼范圍,可以將CCL一次填充“00”的字節(jié)數(shù)減少,例如由默認(rèn)的16字節(jié)減少到4字節(jié)。為了便于大家的理解,我做了一張比較形象的CCL特征碼定位示意圖,如圖3-10所示。通過這張圖可以更加透徹地理解CCL特征碼定位原理了。
五?MyCCL特征碼定位原理學(xué)習(xí)
http://blog.csdn.net/dyllove98/article/details/9631211
?
這里對(duì)MyCCL的分塊原理做一下探究
對(duì)指定文件生成10個(gè)切塊
對(duì)指定的木馬進(jìn)行切塊后,文件列表是這樣的。
注意這里是從E0作為切塊的偏移量。也就是說從E0的位置開始逐個(gè)切塊,E0之前的內(nèi)容是保留的。這樣做的目的是保留一些PE必須的頭文件信息。
我們來通過親身的探究來解析一下MyCCL的切塊區(qū)間定位法到底什么意思,之后再從理論角度入手解釋這個(gè)原理。
我們打開第一個(gè)文件
0000_000000E0_000110B6,用winhex查看。
我們發(fā)現(xiàn)E0之前的內(nèi)容是完整保存的。也就是我們指定的起始位置之前的內(nèi)容不參與切塊,因?yàn)椴《咎卣鞔a也不可能在這塊區(qū)域內(nèi)。
從文件名我們知道,第一個(gè)文件的切塊范圍為000000E0_000110B6。那我們定位到000110B6看看那里的情況。
因?yàn)?00000E0 + 000110B6 = 00011198,第一個(gè)文件(第一個(gè)切塊的范圍是): 000000E0_00011198。然后后面的數(shù)據(jù)全部被填充為00。(文件名的第三段代表偏移量)
在繼續(xù)打開順序的第二個(gè)文件:0001_00011196_000110B6。首先從文件名中可以知道,這個(gè)文件的開始正好就是第一個(gè)文件的結(jié)束。然后我們用winhex打開。定位到00011196這個(gè)位置看看。
這次從00011196這個(gè)位置開始,一直到0002224C的位置, 原始數(shù)據(jù)都一直被保留,到0002224C之后的數(shù)據(jù)又被填充為00了。而0002224C的位置正好就是第三個(gè)文件的開始位置。
看到這里我們應(yīng)該明白了,MyCCL所做的事情就是在不斷的恢復(fù)出原始數(shù)據(jù)的過程,只不過這個(gè)這個(gè)動(dòng)作是分成好幾步(塊)慢慢來進(jìn)行的。
如果特征碼不在之前的某幾塊的范圍內(nèi)的話,那殺軟在查殺的時(shí)候也不會(huì)殺除這些文件,因此前幾塊那些不包含特征碼的塊文件就會(huì)在查殺的時(shí)候被保留下來。
我感覺要更清晰的理解原理的話最好是用手工一個(gè)文件一個(gè)文件順序的方法進(jìn)行查毒,直到某一個(gè)塊文件查處有病毒。則說明這個(gè)塊文件多露出的那一塊原始數(shù)據(jù)包含了病毒特征碼。
那我們的第一個(gè)分塊的目的就達(dá)到了,我們找到了特征碼的大致范圍,就在剛才多露出的這個(gè)塊原始數(shù)據(jù)塊中,則這個(gè)被查處有病毒的塊對(duì)應(yīng)的起始地址和終止地址就我們第一切塊的結(jié)果。
我們定位特征碼的位置,既不能說是看被查出有毒的,也不能說是沒被查出有毒的。準(zhǔn)確說是第一個(gè)被查出有毒的。第一此被查出有毒的那個(gè)區(qū)段就是特征碼的一個(gè)范圍。
這里假設(shè)我們?cè)诓闅⒌诙募臅r(shí)候查出有病毒,那后面的文件也不用查了,肯定也有病毒,因?yàn)樗鼈兺瑯影说诙€(gè)區(qū)段。一般我們用手工的查殺方法,查出第二個(gè)文件有毒然后清除這個(gè)文件。
0001_00011196_000110B6這個(gè)文件被刪除了
?
然后,我們點(diǎn)擊”二次處理”時(shí)MyCCL就能發(fā)現(xiàn)第二個(gè)文件不見了,就能定位出一個(gè)特征區(qū)間。看清楚,是MyCCL發(fā)現(xiàn)了第二個(gè)文件不見了。它就知道了這個(gè)特征碼是在第二個(gè)區(qū)段內(nèi)。
現(xiàn)在明白了為什么有的人殺到一個(gè)病毒就停止查殺了吧?因?yàn)榘错樞驍[放,找到某處特征碼時(shí),后面的暫時(shí)沒必要管。為什么說是暫時(shí)呢?接下來繼續(xù)解釋。
因?yàn)楝F(xiàn)在的殺毒軟件一般是復(fù)合定位,也就是說多特征碼定位,而且發(fā)現(xiàn)任何一處特征碼就能確定出病毒來,所以MyCCL在確定出一處特征碼(這里是第二個(gè)文件塊)時(shí),會(huì)提醒用戶要不要繼續(xù)分析。此時(shí)當(dāng)然選"是"了,這個(gè)時(shí)候又會(huì)生成十個(gè)切片。
這次又生成的10(你自己設(shè)定的切塊數(shù)量)個(gè)切片就有意思了。
可以看到依然是和第一次的10個(gè)塊文件一樣的分區(qū)范圍,但是,內(nèi)容給也是一樣的嗎 ?我們繼續(xù)用winhex查看內(nèi)容,之后再慢慢解釋原理。
我們打開第一個(gè)文件0000_000000E0_000110B6,然后直接定位到00011198
第一個(gè)文件依然是一樣的。我們繼續(xù)打開第二個(gè)文件:0001_00011196_000110B6
用winhex打開0001_00011196_000110B6。
好,這次發(fā)現(xiàn)不同了,在第一次的生成切塊過程中,我們知道,MyCCL是逐步露出原始數(shù)據(jù)的,那道理第二個(gè)文件中應(yīng)該從00011196位置開始把原始數(shù)據(jù)露出來了呀?難道是MyCCL程序出錯(cuò)了嗎?
當(dāng)然不是的。
因?yàn)檫@是二次分塊定位,第二個(gè)文件塊我們已經(jīng)確認(rèn)是有病毒的了,不需要再用殺軟來確認(rèn)了,所以MyCCL直接填充00,而是從第三個(gè)文件開始逐步露出原始數(shù)據(jù)。不急,我們先實(shí)驗(yàn)一下驗(yàn)證一下這個(gè)觀點(diǎn)。
打開第三個(gè)文件:0002_0002224C_000110B6,定位到0002224C的位置。
可以看到,確實(shí)和我們說的一樣,從第三個(gè)文件開始逐步露出原始數(shù)據(jù)。我們?cè)俣ㄎ坏轿募K3的結(jié)束位置:00033302,也是第四個(gè)文件的開始位置。
由此可以得知,后面的處理過程和之前的第一次分塊是一樣的原理了。差別就在二次分塊時(shí)默認(rèn)將第一次中找到的那塊直接填充00了,就不再露出來了。
結(jié)果就是二次定位后也同樣會(huì)生成10個(gè)塊文件。
我們依然可以從頭順序開始逐個(gè)用殺軟進(jìn)行查殺(不過我感覺可以直接從剛才找到的第一個(gè)帶特征碼的文件塊后面開始繼續(xù)試探查殺)。直到再次發(fā)現(xiàn)那個(gè)首次發(fā)現(xiàn)病毒的文件塊,則我們要找的第二個(gè)病毒特征碼就在那個(gè)文件塊中。
以此類推,還可以繼續(xù)點(diǎn)擊”二次處理”尋找第三個(gè),第四個(gè)特征碼,只要文件塊還沒遍歷完。但是要注意的是,每次點(diǎn)擊”二次處理”生成文件,才能用殺軟繼續(xù)順序查一次,即每次只能找到一個(gè)特征碼位置,然后要再次點(diǎn)擊”二次處理”。 如果在二次分塊的查殺驗(yàn)證中直到最后一個(gè)文件塊都沒有再出現(xiàn)病毒警報(bào)的話,則說明這個(gè)病毒程序就只有一個(gè)病的特征碼。即之前找到的那個(gè),整個(gè)過程需要?dú)④浀呐浜稀?br />
至此,我們就算完成了第一輪的切片范圍搜索,但是這個(gè)時(shí)候定位的范圍太大了,我們需要繼續(xù)進(jìn)行精確定位,縮小范圍。
點(diǎn)擊特征區(qū)間,會(huì)出現(xiàn)我們之前找到的特征碼范圍。
可以看出: 00011196_000110B6就是文件名本身,意思是這個(gè)范圍就是整個(gè)分塊本身,非常大,接下來我們要重復(fù)上面的過程繼續(xù)一次定位及二次定位。
右鍵點(diǎn)擊重新復(fù)合定位。
接下來的步驟就有點(diǎn)像是算法中的遞歸,這次的范圍縮小了,我們以:
?
0001_00011196_000110B6
這個(gè)范圍作為原始文件的大小,注意看開始位置和結(jié)束位置。
這次的搜索范圍被集中到:00011196_000110B6。或者也可以理解為0001_00011196_000110B6這個(gè)文件現(xiàn)在相當(dāng)于原始文件了,我們從這個(gè)范圍中繼續(xù)搜索特征碼。
我們繼續(xù)通過實(shí)踐驗(yàn)證我們的觀點(diǎn)。重新修改分塊數(shù)目為10,點(diǎn)擊生成。
注意到,這次生成的文件列表中。第一個(gè)文件就是0000_00011196_00001B45,即直接從00011196這個(gè)位置開始了。
打開第一個(gè)文件:0000_00011196_00001B45。
我們先觀察一下E0的位置
可以看到,還是之前說的原理,起始地址之前的數(shù)據(jù)是被保留的。只是從我們指定的起始位置開始分塊。
現(xiàn)在我們直接定位到00012CDB位置,也就是第二個(gè)文件的開始位置。
可以看到,這次分塊的行為模式和之前的原理上是一樣的。
現(xiàn)在,為了加深映像,讓我們?cè)俅蜷_倒數(shù)第二個(gè)文件:0008_0001EBBE_00001B45。
并定位到00020703的位置,也即最后一個(gè)文件結(jié)束的位置。
再打開最后一個(gè)文件:0009_00020703_00001B4A,定位到2224C,也即一開始指定的結(jié)束位置。
可以看到在結(jié)束位置2224C之后的內(nèi)容也依然存在。也就說MyCCL對(duì)于我們指定的范圍外的數(shù)據(jù)不做任何處理,只會(huì)對(duì)我們指定的范圍內(nèi)的數(shù)據(jù)進(jìn)行切塊。
我研究到這里的時(shí)候,就有一個(gè)疑問了,那這樣要是木馬病毒有復(fù)合特征怎么辦呢?即在第一次的切塊搜索中搜索出了2處以上的特征碼位置,我們選擇其中一處縮小范圍,進(jìn)行進(jìn)一步的搜索,然后MyCCL只在我們指定的范圍內(nèi)進(jìn)行切塊,那這個(gè)范圍外的那一處特征碼就將一直存在了,那我們第二輪切塊中每一個(gè)文件不就都會(huì)查出有病毒了嗎?
帶著這個(gè)疑問,我們重新做一次實(shí)驗(yàn),在第一輪切塊搜索的的時(shí)候模擬出有兩處特征碼,即手工刪掉2個(gè)文件(和殺軟殺掉本質(zhì)上是一樣的)
重新打開MyCCL,生成10個(gè)切塊,并刪掉第二個(gè)文件0001_00011196_000110B6
點(diǎn)擊”二次處理”,重新生成10個(gè)文件,在提示是否要繼續(xù)搜索特征碼的對(duì)話框中點(diǎn)確認(rèn),這次刪除第九個(gè)文件:0008_00088690_000110B6
刪除后,再次點(diǎn)擊二次處理,讓MyCCL發(fā)現(xiàn)又有一個(gè)文件不在了,即又找到了一個(gè)特征碼位置。
結(jié)束后,右邊顯示共找到了兩處特征碼位置。
選擇第一處位置:00011196_000110B6,右鍵,繼續(xù)復(fù)合特征碼查找。
注意這個(gè)時(shí)候的起始位置和結(jié)束位置就是第二文件的范圍,點(diǎn)擊生成。
我們來打開第一個(gè)文件:0000_00011196_00001B45。其他的位置我們都了解了,現(xiàn)在關(guān)鍵是第九個(gè)文件的位置0008_00088690_000110B6是我們要重點(diǎn)關(guān)注的。
先定位到00088690的位置。
可以看到,和我們的理論猜想一樣,這塊內(nèi)容被填充了00,和”二次處理時(shí)”要把之前找到的特征碼位置填充00的思想是一樣的,為了不影響本次的范圍內(nèi)切塊搜索。要反范圍外的特征碼位置填充00,其他位置就保持不變。
搞清楚了以上幾點(diǎn)后,我們就可以以此類推,不斷遞歸的縮小范圍,直到能把特征碼的范圍縮小到20字節(jié)一下,基本就差不多了。
國內(nèi)外的殺軟一般是根據(jù)一些字符組合來判斷是否是病毒,在20字節(jié)一下基本能幫組我們對(duì)特征碼進(jìn)行定位判斷。
順便介紹個(gè)在線測(cè)試病毒的網(wǎng)站http://www.virscan.org/。國內(nèi)外流行的殺毒引擎都在里面了。殺軟的話推薦用COMODO,很好用,性能也很好,我一直在用這款。
總結(jié)
以上是生活随笔為你收集整理的病毒特征码定位原理和首次使用MyCCL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle第一次使用语句创建作业失败记
- 下一篇: 图解MySql命令行创建存储过程