遠(yuǎn)控軟件gh0st3.6開(kāi)源了,開(kāi)源意味著我們可以在此基礎(chǔ)上進(jìn)行二次開(kāi)發(fā),同時(shí)也意味著殺軟可以較容易的查殺該款遠(yuǎn)控木馬,既然要利用,我們就做好源碼基礎(chǔ)上的木馬免殺工作。
好久沒(méi)有來(lái)博客了,我把免殺這部分整理了一下,先拋一磚頭,有興趣的朋友可以接著做,也可以和本人交流。
序
gh0st遠(yuǎn)控軟件采用驅(qū)動(dòng)級(jí)RESSDT過(guò)主動(dòng),svchost參數(shù)啟動(dòng),替換系統(tǒng)服務(wù)的方式工作的,工作方式較為先進(jìn),美中不足的部分是沒(méi)有進(jìn)行驅(qū)動(dòng)級(jí)或用戶級(jí)隱藏,當(dāng)然這部分可以添加進(jìn)去。編碼利用了VC的編程環(huán)境。
一、環(huán)境配置
編譯環(huán)境一定要配置好:DDK+SDK+VC6,DDK用來(lái)編譯sys文件的,SDK+VC6是用來(lái)編譯工程的,配置部分比較簡(jiǎn)單,網(wǎng)上有很多資料,這里不再詳述,有興趣的朋友也可以查看DDK和SDK的相關(guān)幫助。
二、特征碼定位簡(jiǎn)述
殺毒軟件查殺木馬的原理基本是根據(jù)特征查殺的,被查殺的部分我們稱之為特征碼,所以我們可以利用特征碼定位工具M(jìn)yCLL定位出病毒的特征碼位置,定位工具原理是將被掃描木馬分塊,利用分段填充的方式,匹配殺軟的特征值,找到殺軟查殺病毒的位置。
定位出特征碼,如何反向找到源碼中的對(duì)應(yīng)位置呢?請(qǐng)看下面分析,
三、二進(jìn)制文件與源碼定位之map文件利用
map文件是二進(jìn)制和源碼之間對(duì)應(yīng)的一個(gè)映射文件。
我們假設(shè)根據(jù)第三步我們定位出了病毒的特征碼:
病毒名稱 特征碼位置 內(nèi)存地址
svchost.dll 000038AA_00000002 100044AA
svchost.dll 00005F98_00000002
第一步設(shè)置VC編譯環(huán)境生成Map文件。
在 VC 中,點(diǎn)擊菜單“Project -> Settings”選項(xiàng)頁(yè)(或按下 Alt+F7),選擇 C/C++ 選項(xiàng)卡,并在最下面的 Project Options 里面輸入:/Zd ,然后要點(diǎn)擊 Link 選項(xiàng)卡,選中“Generate mapfile”復(fù)選框,并在最下面的 Project Options 里面輸入:/mapinfo:lines,表示生成 MAP 文件時(shí),加入行信息。設(shè)置完成。
第二步編譯VC工程,設(shè)置活動(dòng)工程編譯即可,這個(gè)不用說(shuō)明。這個(gè)步驟完成后,在release(或debug)目錄,多了一個(gè).map文件(比如svchost.map)。
第三步打開(kāi)map文件(用UE或文本編輯器打開(kāi)都行),形式如下:
(begin)
Timestamp is 488fcef2 (Wed Jul 30 10:16:18 2008)
Preferred load address is 10000000
---------------------------------------------------------------------------1----(為方便說(shuō)明,wrw添加)
Start Length Name Class
0001:00000000 00010a50H .text CODE
0001:00010a50 00000485H .text$x CODE
0002:00000000 000004c8H .idata$5 DATA
......
0003:00000010 00000004H .CRT$XIZ DATA
0003:00000020 00001a50H .data DATA
0003:00001a70 00000688H .bss DATA
0004:00000000 000000a8H .rsrc$01 DATA
0004:000000b0 00000cf0H .rsrc$02 DATA
----------------------------------------------------------------------------2---(為方便說(shuō)明,wrw添加)
Address Publics by Value Rva+Base Lib:Object
0001:00000000 ??0CAudio@@QAE@XZ 10001000 f Audio.obj
0001:000000d0 ??_GCAudio@@UAEPAXI@Z 100010d0 f i Audio.obj
0001:000000d0 ??_ECAudio@@UAEPAXI@Z 100010d0 f i Audio.obj
0001:000000f0 ??1CAudio@@UAE@XZ 100010f0 f Audio.obj
0001:000001e0 ?getRecordBuffer@CAudio@@QAEPAEPAK@Z 100011e0 f Audio.obj
0001:00000240 ?playBuffer@CAudio@@QAE_NPAEK@Z 10001240 f Audio.obj
0001:000002c0 ?InitializeWaveIn@CAudio@@AAE_NXZ 100012c0 f Audio.obj
......
0001:00003310 ?SendToken@CFileManager@@AAEHE@Z 10004310 f FileManager.obj
0001:00003320 ?UploadToRemote@CFileManager@@AAE_NPAE@Z 10004320 f FileManager.obj
0001:00003440 ?FixedUploadList@CFileManager@@AAE_NPBD@Z 10004440 f FileManager.obj
0001:00003670 ?StopTransfer@CFileManager@@AAEXXZ 10004670 f FileManager.obj
0001:00003730 ?CreateLocalRecvFile@CFileManager@@AAEXPAE@Z 10004730 f FileManager.obj
......
----------------------------------------------------------------------------3---(為方便說(shuō)明,wrw添加)
Line numbers for .\Release\FileManager.obj(E:\vtmp\gh0st3src\Server\svchost\common\FileManager.cpp) segment .text
17 0001:00002630 20 0001:0000267f 21 0001:00002698 24 0001:000026d0
25 0001:000026f8 26 0001:0000273c 29 0001:000027d0 33 0001:000027ee
77 0001:000027f8 36 0001:000027fb 37 0001:00002803 77 0001:0000280d
......
532 0001:0000340f 534 0001:00003414 537 0001:00003428 540 0001:00003440
546 0001:0000345d 547 0001:00003487 548 0001:00003490 549 0001:00003492
551 0001:0000349e 552 0001:000034b8 553 0001:000034cb 554 0001:000034d4
558 0001:000034de 560 0001:000034e9 563 0001:000034ee 564 0001:00003506
......
(end)
我們看下,定位svchost.dll 的第一個(gè)特征碼內(nèi)存地址為:100044AA,在第2塊中,我們可以找到RVA+BASE與之很接近的是
0001:00003440 ?FixedUploadList@CFileManager@@AAE_NPBD@Z 10004440 f FileManager.obj
這樣我們可以定位到FileManager.cpp中的FixedUploadList函數(shù),是不是范圍縮小了?
下面我們?cè)倏s小代碼行
利用這個(gè)公式:特征碼行偏移 = 特征碼地址(Crash Address)- 基地址(ImageBase Address)- 0x1000
看起來(lái)好像很難,其實(shí)很簡(jiǎn)單,我們將100044AA去掉內(nèi)存基址10000000,再減1000,因?yàn)镻E很多從1000開(kāi)始,可以得到代碼偏移地址為34AA。到第3塊中找對(duì)應(yīng)的代碼行。
偏移地址34AA在(551 0001:0000349e 552 0001:000034b8 )中間,也就是551行和552行中間,我們到源程序中查找第551行:
wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash);
這樣就定位出源代碼了,要怎么修改就怎么修改它就可以了。
四、實(shí)戰(zhàn)免殺
A、卡巴免殺
首次編譯后,先做卡巴的免殺??ò蜌ys文件和dll,當(dāng)然也就殺包裝它們的install.exe,最后卡巴還殺生成的sever,我這里說(shuō)殺生成好的server不是和前面的特征碼重疊的地方,而是殺配置信息。
第一步、sys免殺
sys重新編譯后,增加了輸入表的函數(shù),同時(shí)系統(tǒng)不同,造成很多地方不同于原特征,順利通過(guò)卡巴、金山、小紅傘等殺軟。
第二步、svchost.dll免殺
特征碼定位MultiByteToWideChar和"gh0st update"兩個(gè)位置。這里是通過(guò)第3步map文件得出的。
卡巴怕加花指令, 這個(gè)函數(shù)MultiByteToWideChar的調(diào)用上,可以在這個(gè)函數(shù)前面隨便加幾句無(wú)效語(yǔ)句就可以通過(guò)卡巴殺軟。
字符串調(diào)用"gh0st update" ,這個(gè)是用于更新用的 ,如果不要在線更新,直接把這個(gè)語(yǔ)句所在代碼塊刪除;嘿嘿,其實(shí)搜索工程替換這個(gè)字符串為其他的字符串就可以了^_^,這個(gè)方法同時(shí)可以過(guò)金山殺軟。
第三步、server免殺
卡巴定位在最后的配置信息,采取跳轉(zhuǎn)顯然是不行的,采用加花的辦法,在寫(xiě)入AAAAAA配置信息之前,隨便寫(xiě)些東西,就可以做server免殺。
卡巴免殺完成!
B、Avast免殺
最新的avast殺軟再查殺1下,殺install.exe和svchost.dll(也就是殺生成的文件和其中的資源文件),接著做它的源碼免殺。
定位在特征字符串%02d/%02d/%02d和“SYSTEM\CurrentControlSet\Services\%s”兩個(gè)地方。
解決方案:
1、svchost.dll的特征碼定位在鍵盤(pán)記錄KeyboardManager.cpp文件中的SaveInfo(char *lpBuffer)函數(shù)。特征字符串%02d/%02d/%02d,也就是我們看到鍵盤(pán)記錄的日期,修改之,修改的方法很多,將其改為[%d/%d/%d %d:%d:%d] ,編譯即可通過(guò)avast殺軟。
2、install的特征碼定位在“SYSTEM\CurrentControlSet\Services\%s”,對(duì)應(yīng)文件是install.cpp里的InstallService函數(shù),修改大小寫(xiě),編譯即可通過(guò)免殺。
五、添加垃圾代碼的小方法
垃圾代碼要移動(dòng)特征碼所在的位置,不要跑到堆棧中了,這樣的代碼沒(méi)有用??梢圆扇√砑觙or循環(huán),做計(jì)數(shù),簡(jiǎn)單統(tǒng)計(jì),采用局部變量,不改變后面的邏輯為宜。
添加輸出表的方法:
有殺輸出表的,可以在生成的svchost.dll上添加空函數(shù) ,但是每次編譯都要修改1次資源 ,其實(shí)我們?cè)谠创a上添加如下語(yǔ)句:
extern "C" __declspec(dllexport) bool JustTempFun();//聲明
……
extern "C" __declspec(dllexport) bool JustTempFun() //實(shí)現(xiàn)
{
return false;
}
編譯后,輸出表就被改變了,有的殺軟就可做到代碼免殺。
六、gh0st自動(dòng)生成6to4ex.dll的修改
看到好多站友提問(wèn)自動(dòng)生成6to4ex.dll的問(wèn)題,有熱心站友也提出了自己的見(jiàn)解 ,我感覺(jué)有些人提出的解決方案不完全正確,有可能造成剛?cè)胧秩苏`解,我根據(jù)自己的理解說(shuō)明1下。
gh0st服務(wù)端是通svchost -netsvcs啟動(dòng)的,所以程序要利用netsvcs 服務(wù),服務(wù)端也就是根據(jù)netsvcs生成的,故不能說(shuō)服務(wù)端生成是隨機(jī)的,相對(duì)于大多數(shù)系統(tǒng)來(lái)講,基本是固定的,下面看分析。
查看install.cpp里面的InstallService()方法,首先遍歷HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\Svchost中的服務(wù)項(xiàng),查找到一個(gè)服務(wù)后,程序采取替換服務(wù)的方法,將原服務(wù)刪除,然后生成對(duì)應(yīng)服務(wù)項(xiàng)+ ex.dll的文件替換原服務(wù),6to4服務(wù)一般排在第一位,6to4服務(wù)是一種自動(dòng)構(gòu)造隧道的方式,作用在于只需要一個(gè)全球惟一的IPv4地址便可使得整個(gè)站點(diǎn)獲得IPv6 的連接,這個(gè)服務(wù)對(duì)一般人來(lái)講,基本閑置,所以我們的程序就把6to4服務(wù)給替換掉,同時(shí)在windows\system32\目錄下生成 6to4ex.dll,以后啟動(dòng)就是6to4ex了,如果把這個(gè)服務(wù)跳過(guò)去,就依次向下生成Ias、Iprip等服務(wù)啦,如果netsvcs項(xiàng)沒(méi)有可以替換的服務(wù),則程序?qū)⒆约禾砑?個(gè)服務(wù),名稱就是由 AddsvchostService()方法產(chǎn)生的netsvcs_0x%d。
這樣說(shuō)不知道關(guān)心服務(wù)名稱的站友明白了不?
這個(gè)不能說(shuō)是技術(shù)問(wèn)題,但是小技巧問(wèn)題可以從這里產(chǎn)生,我不知道其他人的360是怎么過(guò)的,但是我覺(jué)得可以提示1下的是,如果是360默認(rèn)系統(tǒng)安全的服務(wù),它肯定不會(huì)報(bào)不安全,替換閑置的系統(tǒng)安全的服務(wù)則通過(guò)360的效果要好的多。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。