教你怎样源码免杀
源碼免殺也離不開手動(dòng)定位特征碼,但是修改比較容易,靈活性也比較大,接下來就聽危險(xiǎn)漫步給各位慢慢的來分享分析。
一、如何查找特征碼
查找特征碼與代碼的對(duì)應(yīng)位置,是這篇文章首先需要了解的基礎(chǔ)。為了方便我們查找,在編譯的時(shí)候生成map文件,選擇vc工程選項(xiàng)(project),在下拉菜單中選擇設(shè)置(settings),或者你也可以按快捷鍵alt+f7;彈出工程設(shè)置對(duì)話框(project settings)。
點(diǎn)擊c/c++選項(xiàng)卡,在工程選項(xiàng)(projectoption)中輸入/Zd,或者你可以在調(diào)試信息(debug info)下拉列表中選擇line numbers only。
在連接(link)選項(xiàng)卡講產(chǎn)生map文件(generate mapfile)打上勾。再在工程選項(xiàng)卡中寫入/mapinfo:lines,最后確定。
用od打開文件點(diǎn)擊插件彈出下拉菜單選擇godup plugins,在其二級(jí)菜單中選擇load abel。一般我們用myccl定位特征碼,定位出特征碼,然后導(dǎo)入od。myccl定位出的是文件特征碼,而od中是內(nèi)存地址。一般大家都會(huì)用一些地質(zhì)轉(zhuǎn)換工具把文件地址轉(zhuǎn)換為內(nèi)存地址再在od中查找,其實(shí)od已經(jīng)給我們準(zhǔn)備了這樣的插件。在插件中選擇olly advanced-option,在addtional options中將啟用改進(jìn)的ctrl+g功能勾上。
ctrl+g運(yùn)行選中偏移量,在下拉列表中就可以選擇要用的文件。例如在xxx出定位出的特征碼載入?yún)R編代碼為call c在上面有call a,下面有call b,又或者有一些字串。根據(jù)這些信息,可以在vc中找相應(yīng)信息比對(duì),下面的實(shí)戰(zhàn)中會(huì)詳細(xì)說明。
二、如何定位特征碼
我們一般手動(dòng)定位出來的特征碼有一些幾種:定位到代碼上,定位到字符串上,定位到輸入表上(高啟發(fā)的最愛,例如nod32和小紅傘)。
(1)定位到代碼
對(duì)于代碼可以交換代碼位置,等價(jià)代碼替換,合并分離代碼,添加花指令。
代碼交換:例如int a;int b;定位的位置為int a,你可以換一下位置改成intb:int a:等價(jià)替換:例如char a[5]=”hello”;你可以改為char *p=”hello”;
合并分離代碼:例如char a[5]=hello;print(a);可以改為print(hello);分離就是其反過程。
添加花指令:例如直接在代碼前后加nop。_asm{nop},nop數(shù)量隨意。
如果不想定位的話,大家可以直接在代碼中多出直接加花指令,是代碼位置發(fā)生變化。即可達(dá)到免殺但是對(duì)字符串和輸入表無效。所以大家在定為特征碼之前在代碼處先加一些花指令。
(2)定位到字符串
修改字串:現(xiàn)將其中幾個(gè)字符修改,然后再將其修改過來。例如char *p=hell;你可以改為char*p=mello;p[0]=;
連接字串:將字串分離為兩部分,然后再連接一下。例如char *p=hello;可以改為char *p=he;
strcat(p,llo);
字串加密:將字串加密一下,然后在解密。例如char *p=hello;可以將其改為char *p=gdkkn;
for(int i=0;i5;i+=)p[i]++;
翻轉(zhuǎn)字串:例如有字符串為“hello”,你可以現(xiàn)將字串改為“olleh”,再用strrev將其翻轉(zhuǎn)回來,strrev(“olleh”)最后輸入結(jié)果就為hello。
字串修改應(yīng)該還有別的方法,大家可以自由發(fā)揮。
(3)定位到輸入表
定位到輸入表可以用動(dòng)態(tài)調(diào)用或者延遲加載。例如定位到輸入表的MessageBox,你可以將其改為typedef int(WINAPI *pMessageBoxA),pMessageBoxA pMessageBoxA=(pMessageBoxA)GetProcAddress(LoadLibrary(“user32.dll”),”MessageBoxA”);
對(duì)于高啟發(fā)殺的代碼,可以用try{}catch{}結(jié)構(gòu)。對(duì)于殺入口的可以用#pragma comment(linker,”/ENTRY:xxx”)。對(duì)于定位出來的特征碼載入c32,看起屬于代碼部分還是字符串,輸入表部分,決定其屬于哪一種。
三、實(shí)戰(zhàn)應(yīng)用
說了這么多理論,下面開始實(shí)戰(zhàn)。首先安裝編譯器,將sdk文件解壓覆蓋編譯器目下的vc98。vc98下的是一些文件。
ghost文件為了保護(hù)版權(quán),里面有硬盤鎖,必須先將硬盤鎖去掉,否則修改版權(quán)就會(huì)導(dǎo)中硬盤鎖,所有盤符不能打開,只能重裝系統(tǒng),大家切記。修改兩處就可以去掉硬盤鎖。運(yùn)行源代碼,打開搜索框搜unsigned char scode[] =,一會(huì)下面的框框就會(huì)提示發(fā)現(xiàn)一處,我們雙擊它。
代碼就不貼出了,想要的可以來找我要的。
在搜索CBuildView::OnActivateView。
再搜索killmbr將// int KillMBR();注釋掉。
現(xiàn)在可以隨便修改版權(quán)信息了。
搜索m pMainWnd-SetMenu(NULL);注釋掉這句可以去掉菜單欄。
搜索CMainFrame::PreCreateWindow, ?cs.cx= 646;可以修改軟件的寬度,cs.cy=310;修改高度的,cs.lpszName=Ghost RAT Beta;修改標(biāo)題欄的。搜索COLUMNSTRUCT g_Cohumn_Data[]=可以修改列表控件上方的文字。搜索CMainFrame::OnCreate,在里面加上this -CenterWindow(CWnd::GetDesktop Window());可以使軟件打開時(shí)居中,默認(rèn)是左上角的,我最終修改完的樣子。
下面來將dll以及install放到bin文件夾中(為了便于我們免殺),工程中的svchost文件就是dll源碼文件,ghost就是控制端源碼文件,install就是loader文件。alt+f7打開工程設(shè)置對(duì)話框,切換到連接選項(xiàng)卡,選中右邊的svchost將輸出文件名(output file name)../install/res/svcbost.dll改為../../bin/g486se.dll,至于dll文件名可以隨意更改(一定要修改,有些殺軟查殺的)。同理將../../ghost/res/install.exe改為../../bin/install.dat,改為后綴防止不小心點(diǎn)擊了它。搜索IDR_DLL,將”res\\svchost.dll”改為..\\..\\bin\\g486se.dll,搜IDR_BSS,將res\\install.exe改為..\\bin\\install.dat。下面刪除驅(qū)動(dòng)文件,因?yàn)轵?qū)動(dòng)文件現(xiàn)在用不著了。刪除工程中svchost下的IDR_SYS資源。再搜索resetssdt,依次將其注釋或刪除掉。刪ghost資源下的IDR_BSS。
來到ghost buildview.cpp
注釋掉FreeResource(hResData);接著修改一些字符串(一般殺軟都?xì)⒌?#xff09;,搜索AAAAAA,搜到三處,將6個(gè)替換為任意六個(gè)字符的字串,我這里改為XFILES。再搜索CCCCCC,搜到兩處,也是改為任意6個(gè)字符,我將其改為了SEILFX。搜索Ghost Update,搜到兩處,將其改為任意字串,我改為g49esg4e。在server文件下搜索Ghost,搜到一處,將其改為任意字串,我改為了xfi%dles。準(zhǔn)備工作的最后一步就是把svchost文件版本信息給改一下,這里我改成卡巴斯基的。
下面先拿一款特征碼少的殺軟講解,讓大家都感性的認(rèn)識(shí)。今天就拿金山開刀吧。首先打開myccl載入dll文件定位特征碼。將特征碼開始的位置填為400,大小填為(就是代碼段開始的地方和大小)。這里分塊,剛開始不易分得太多,分多了費(fèi)時(shí),我這里分成了10塊。點(diǎn)生成,殺軟查殺默認(rèn)生成的output文件,定位出107000_2500,右鍵復(fù)合定位此特征區(qū)間,但是無論改成100塊還是200塊都全部查殺,我們把這個(gè)文件載入c32利用折半法手工定位,
從10700開始選取1250個(gè)字節(jié),填充為00(對(duì)于瑞星,要填充為90)。在用殺軟進(jìn)行查殺,如果殺軟不報(bào)毒,那說明特征碼在從10700開始的1250個(gè)字節(jié)中,反之則在剩下的1250個(gè)字節(jié)中。一直重復(fù)折半直到找到特征碼。我這里找到的位置為107190位置的八個(gè)字節(jié)。
用od載入dll文件,ctrl+g,輸入10719,在下拉列表中選擇該dll,跳到一片jump代碼處。而該特征碼位置代碼為jumpGetModuleFileNameExA,操作系統(tǒng)為了區(qū)分系統(tǒng)函數(shù)調(diào)用和用戶函數(shù)調(diào)用,對(duì)于用調(diào)用采用call xxx形式,對(duì)于系統(tǒng)調(diào)用采用call xxx,xxx:jump函數(shù)。我們?cè)谠创asvchost中搜索GetModuleFileNameEx(對(duì)于函數(shù)有兩種版本ascll和unicode版本,為了兼容兩種版本,定義了一個(gè)宏,),搜索到一處,我們?cè)谒懊婕訋拙浠ㄖ噶頮asm{nop}。
好了,使用金山查殺一下,已經(jīng)不殺了。
接下來定位dat文件,定位特征碼。od打開后什么特征函數(shù)也沒有。這是應(yīng)該考慮可能不是代碼問題,install代碼也不多。從頭文件開始慢慢注釋掉一些語句,接著查殺。定位為#pragma comment(linker,/defaultlib:msvcrt,lib/opt:nowin98/IGNORE:4078/MERGE:.rdata=.text/MERGE:.data=.text/section:.text,ERW),看這句里面有區(qū)段合并(/MERGE:.rdata=.text/MERGE:.data=.text),殺軟有時(shí)也對(duì)區(qū)段合并查殺,將區(qū)段合并去掉改為
#pragma comment(linker,¨/defaultlib:msvcrt.lib/opt:nowin98/IGNORE:4078”用金山查殺,已經(jīng)不殺了。現(xiàn)在生成一個(gè)服務(wù)端,運(yùn)行,已經(jīng)上線了。
臺(tái)下大家們已經(jīng)聽得有點(diǎn)暈了吧?時(shí)間也不早了,今天先說這些,只是個(gè)熱身,大家回去慢慢消化一下吧,下節(jié)課我將會(huì)帶大家免殺卡巴等高啟發(fā)殺軟。
總結(jié)
- 上一篇: 支持64位系统的XOR加密后内存加载PE
- 下一篇: 源码免杀--反调试代码,免杀爱好者必备的