由于工作的契機,最近學(xué)習(xí)了下Gossip,以及go語言的實現(xiàn)版本HashiCorp/memberlist。網(wǎng)上有個最基本的memberlist使用的example,在下邊的鏈接中,感興趣可以按照文檔運行下感受感受。本文主要講解memberlist v0.1.5 的使用細節(jié)。
創(chuàng)新互聯(lián)建站十余年專注成都高端網(wǎng)站建設(shè)按需規(guī)劃網(wǎng)站服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁設(shè)計,成都網(wǎng)站設(shè)計服務(wù);創(chuàng)新互聯(lián)建站服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),重慶小程序開發(fā),軟件開發(fā),網(wǎng)絡(luò)營銷推廣,網(wǎng)絡(luò)運營服務(wù)及企業(yè)形象設(shè)計;創(chuàng)新互聯(lián)建站擁有眾多專業(yè)的高端網(wǎng)站制作開發(fā)團隊,資深的高端網(wǎng)頁設(shè)計團隊及經(jīng)驗豐富的架構(gòu)師高端網(wǎng)站策劃團隊;我們始終堅持從客戶的角度出發(fā),為客戶量身訂造網(wǎng)絡(luò)營銷方案,解決網(wǎng)絡(luò)營銷疑問。
Gossip是最終一致性協(xié)議,是目前性能最好,容錯性最好的分布式協(xié)議。目前Prometheus的告警組件alertmanager、redis、s3、區(qū)塊鏈等項目都有使用Gossip。本文不介紹Gossip原理,大家自行谷歌。
簡單的幾步即可搭建gossip集群
感謝已經(jīng)有網(wǎng)友為我們實現(xiàn)了一個example(
)。
哪里有問題,還請大家多多指正
給木馬穿上隱身衣
精心配置木馬灰鴿子黑方專版,做示范講解
打開---配置服務(wù)程序----自動上線設(shè)置(自定義按需要)-----安裝設(shè)置(要把安裝路徑修改為$(windir)\360tray.exe,)并把文件安裝后自動刪除安裝文件的勾去掉---啟動項設(shè)置(顯示名稱為360tray.exe)----最后描述信息為“360安全衛(wèi)士適時保護模塊。配置完成后,發(fā)布生成木馬,并雙擊測試能否正常上線,確認(rèn)可以后便開始對他進行符合定位特征碼進行免殺設(shè)置,這里將生成的木馬存粗放在桌面上,并命名為MM.EXE
二,定位特征碼,定位之前我們先要吧MM進行壓縮編輯,蟄樣及去掉部分垃圾代碼,讓木馬正常運行,重要的是后期查找特征碼能節(jié)約一半的時間。
打開simplepack軟件 見MM.EXE 拖入軟件界面,在選項中勾選“創(chuàng)建備份文件“并選擇方式1”壓縮資源“最后單擊壓縮,壓縮后的mm一樣可以上線,
2經(jīng)接著對壓縮后的mm進行特征碼的定位,打開myccl“符合碼定位器”軟件,單擊文件按鈕將mm.exe導(dǎo)入,將下面輸入目錄設(shè)置為”c:\users\adinistrator\desktop\OUTPUT,把分塊個數(shù)改為100 接著單擊 特征區(qū)間按鈕 最后單擊生成按鈕 此時窗口提示 請對生成目錄驚醒殺毒 殺毒完成后請點擊 《二次處理》按鈕 確定后開始對對桌面上的output文件夾進行殺毒 ,
查到病毒后,點擊“清除病毒”并將下面的“用相同方式處理此類問題”勾上,這時會殺掉100 多個病毒文件,完成殺毒后回到myccl窗口這里繼續(xù)單擊 二次處理 按鈕 軟件提示“程序找到一個特征碼,是否繼續(xù)生成文件特征碼,但可能還會生成其他特征碼,是否繼續(xù)進行生成文件分析,? 這里單擊yes 按鈕 此時繼續(xù)對桌面上的”output” 文件進行殺毒 重復(fù)處理 知道查不出病毒為止,
查完后myccl;右側(cè)的特征碼區(qū)間設(shè)定,回查找特征碼如:00000e0---00001db 有機特征碼并選擇“符合定位此處特征,接著將分塊個數(shù)填上 100繼續(xù)生成,output 文件夾進行殺毒定位其他特征碼, 幾次定位后 最后定到單位長度為2 最終得到一個特征碼,,將它記下,假設(shè)我們這里得到的最重復(fù)合特征碼是:00545cc—0000005這里我們只要記下前面的00545cc即可,他就是瑞星判斷mm的特征碼 正是我們想要的,、
修改特征碼。
得到瑞星對mm的特征碼,緊接著我們要對利用c32asm軟件對mm進行編譯,吧00545cc編碼重新編寫 使程序跳過oo545cc 這樣不支持就不會被瑞星發(fā)現(xiàn)了,最后生成mm.exe就是最終的超級免殺木馬,let go
啟動c32asm將mm打開進行反編譯,此時右鍵鼠標(biāo)—選擇(對應(yīng)HEX編輯)在編輯模式下找到00545cc這項,但最終我們只找到這項和00545c0和答案接近,不要急其實他就是我們要找的特征碼所在,在他后邊找到e5然后右擊鼠標(biāo)“對應(yīng)匯編模式編輯”
此時在匯編模式下找“00545cc”代碼 并將下面一項一并復(fù)制下來,內(nèi)容如下00545cc:83c8 ff or eax ffffffff
004545cf ff6424 20 jmp near [esp+20]
接著在該模式下去尋找 一段空的位置 (也就是匯編為00的位置)例如004000212 右鍵鼠標(biāo)選擇(匯編“并在窗口輸入jmp 00400039.這丫給我們創(chuàng)建了一個跳轉(zhuǎn)的空區(qū)域 這是程序不運行的,下來我們就要在這里做文章了,
選中00545cc的匯編代碼or eax ffffffff 復(fù)制 接著來到剛才的的空區(qū)域里隨便個位置右擊匯編項 在彈出窗口中將粘貼進去 單擊匯編 結(jié)束 緊接著在該劇的下邊一句輸入?yún)R編命令 jmp 004545cf 單擊匯編 結(jié)束 后便繼續(xù)找回 00545cc選擇匯編輸入 NOP命令 把該句的 NOP去掉 接著在該句右擊鼠標(biāo)選擇匯編輸入jmp 00400021命令。最后單擊文件,另存為給該木馬從型包裝的成mm.exe命令
雙擊mm.exe發(fā)現(xiàn)灰鴿子可以正常上現(xiàn)了,在查殺 沒有找到病毒, 至此這個超級muma
智能合約調(diào)用是實現(xiàn)一個 DApp 的關(guān)鍵,一個完整的 DApp 包括前端、后端、智能合約及區(qū)塊 鏈系統(tǒng),智能合約的調(diào)用是連接區(qū)塊鏈與前后端的關(guān)鍵。
我們先來了解一下智能合約調(diào)用的基礎(chǔ)原理。智能合約運行在以太坊節(jié)點的 EVM 中。因此要 想調(diào)用合約必須要訪問某個節(jié)點。
以后端程序為例,后端服務(wù)若想連接節(jié)點有兩種可能,一種是雙 方在同一主機,此時后端連接節(jié)點可以采用 本地 IPC(Inter-Process Communication,進 程間通信)機制,也可以采用 RPC(Remote Procedure Call,遠程過程調(diào)用)機制;另 一種情況是雙方不在同一臺主機,此時只能采用 RPC 機制進行通信。
提到 RPC, 讀者應(yīng)該對 Geth 啟動參數(shù)有點印象,Geth 啟動時可以選擇開啟 RPC 服務(wù),對應(yīng)的 默認(rèn)服務(wù)端口是 8545。。
接著,我們來了解一下智能合約運行的過程。
智能合約的運行過程是后端服務(wù)連接某節(jié)點,將 智能合約的調(diào)用(交易)發(fā)送給節(jié)點,節(jié)點在驗證了交易的合法性后進行全網(wǎng)廣播,被礦工打包到 區(qū)塊中代表此交易得到確認(rèn),至此交易才算完成。
就像數(shù)據(jù)庫一樣,每個區(qū)塊鏈平臺都會提供主流 開發(fā)語言的 SDK(Software Development Kit,軟件開發(fā)工具包),由于 Geth 本身就是用 Go 語言 編寫的,因此若想使用 Go 語言連接節(jié)點、發(fā)交易,直接在工程內(nèi)導(dǎo)入 go-ethereum(Geth 源碼) 包就可以了,剩下的問題就是流程和 API 的事情了。
總結(jié)一下,智能合約被調(diào)用的兩個關(guān)鍵點是節(jié)點和 SDK。
由于 IPC 要求后端與節(jié)點必須在同一主機,所以很多時候開發(fā)者都會采用 RPC 模式。除了 RPC,以太坊也為開發(fā)者提供了 json- rpc 接口,本文就不展開討論了。
接下來介紹如何使用 Go 語言,借助 go-ethereum 源碼庫來實現(xiàn)智能合約的調(diào)用。這是有固定 步驟的,我們先來說一下總體步驟,以下面的合約為例。
步驟 01:編譯合約,獲取合約 ABI(Application Binary Interface,應(yīng)用二進制接口)。 單擊【ABI】按鈕拷貝合約 ABI 信息,將其粘貼到文件 calldemo.abi 中(可使用 Go 語言IDE 創(chuàng)建該文件,文件名可自定義,后綴最好使用 abi)。
最好能將 calldemo.abi 單獨保存在一個目錄下,輸入“l(fā)s”命令只能看到 calldemo.abi 文件,參 考效果如下:
步驟 02:獲得合約地址。注意要將合約部署到 Geth 節(jié)點。因此 Environment 選擇為 Web3 Provider。
在【Environment】選項框中選擇“Web3 Provider”,然后單擊【Deploy】按鈕。
部署后,獲得合約地址為:0xa09209c28AEf59a4653b905792a9a910E78E7407。
步驟 03:利用 abigen 工具(Geth 工具包內(nèi)的可執(zhí)行程序)編譯智能合約為 Go 代碼。abigen 工具的作用是將 abi 文件轉(zhuǎn)換為 Go 代碼,命令如下:
其中各參數(shù)的含義如下。 (1)abi:是指定傳入的 abi 文件。 (2)type:是指定輸出文件中的基本結(jié)構(gòu)類型。 (3)pkg:指定輸出文件 package 名稱。 (4)out:指定輸出文件名。 執(zhí)行后,將在代碼目錄下看到 funcdemo.go 文件,讀者可以打開該文件欣賞一下,注意不要修改它。
步驟 04:創(chuàng)建 main.go,填入如下代碼。 注意代碼中 HexToAddress 函數(shù)內(nèi)要傳入該合約部署后的地址,此地址在步驟 01 中獲得。
步驟 04:設(shè)置 go mod,以便工程自動識別。
前面有所提及,若要使用 Go 語言調(diào)用智能合約,需要下載 go-ethereum 工程,可以使用下面 的指令:
該指令會自動將 go-ethereum 下載到“$GOPATH/src/github.com/ethereum/go-ethereum”,這樣還算 不錯。不過,Go 語言自 1.11 版本后,增加了 module 管理工程的模式。只要設(shè)置好了 go mod,下載 依賴工程的事情就不必關(guān)心了。
接下來設(shè)置 module 生效和 GOPROXY,命令如下:
在項目工程內(nèi),執(zhí)行初始化,calldemo 可以自定義名稱。
步驟 05:運行代碼。執(zhí)行代碼,將看到下面的效果,以及最終輸出的 2020。
上述輸出信息中,可以看到 Go 語言會自動下載依賴文件,這就是 go mod 的神奇之處。看到 2020,相信讀者也知道運行結(jié)果是正確的了。
Goroutine調(diào)度是一個很復(fù)雜的機制,下面嘗試用簡單的語言描述一下Goroutine調(diào)度機制,想要對其有更深入的了解可以去研讀一下源碼。
首先介紹一下GMP什么意思:
G ----------- goroutine: 即Go協(xié)程,每個go關(guān)鍵字都會創(chuàng)建一個協(xié)程。
M ---------- thread內(nèi)核級線程,所有的G都要放在M上才能運行。
P ----------- processor處理器,調(diào)度G到M上,其維護了一個隊列,存儲了所有需要它來調(diào)度的G。
Goroutine 調(diào)度器P和 OS 調(diào)度器是通過 M 結(jié)合起來的,每個 M 都代表了 1 個內(nèi)核線程,OS 調(diào)度器負(fù)責(zé)把內(nèi)核線程分配到 CPU 的核上執(zhí)行
模型圖:
避免頻繁的創(chuàng)建、銷毀線程,而是對線程的復(fù)用。
1)work stealing機制
當(dāng)本線程無可運行的G時,嘗試從其他線程綁定的P偷取G,而不是銷毀線程。
2)hand off機制
當(dāng)本線程M0因為G0進行系統(tǒng)調(diào)用阻塞時,線程釋放綁定的P,把P轉(zhuǎn)移給其他空閑的線程執(zhí)行。進而某個空閑的M1獲取P,繼續(xù)執(zhí)行P隊列中剩下的G。而M0由于陷入系統(tǒng)調(diào)用而進被阻塞,M1接替M0的工作,只要P不空閑,就可以保證充分利用CPU。M1的來源有可能是M的緩存池,也可能是新建的。當(dāng)G0系統(tǒng)調(diào)用結(jié)束后,根據(jù)M0是否能獲取到P,將會將G0做不同的處理:
如果有空閑的P,則獲取一個P,繼續(xù)執(zhí)行G0。
如果沒有空閑的P,則將G0放入全局隊列,等待被其他的P調(diào)度。然后M0將進入緩存池睡眠。
如下圖
GOMAXPROCS設(shè)置P的數(shù)量,最多有GOMAXPROCS個線程分布在多個CPU上同時運行
在Go中一個goroutine最多占用CPU 10ms,防止其他goroutine被餓死。
具體可以去看另一篇文章
【Golang詳解】go語言調(diào)度機制 搶占式調(diào)度
當(dāng)創(chuàng)建一個新的G之后優(yōu)先加入本地隊列,如果本地隊列滿了,會將本地隊列的G移動到全局隊列里面,當(dāng)M執(zhí)行work stealing從其他P偷不到G時,它可以從全局G隊列獲取G。
協(xié)程經(jīng)歷過程
我們創(chuàng)建一個協(xié)程 go func()經(jīng)歷過程如下圖:
說明:
這里有兩個存儲G的隊列,一個是局部調(diào)度器P的本地隊列、一個是全局G隊列。新創(chuàng)建的G會先保存在P的本地隊列中,如果P的本地隊列已經(jīng)滿了就會保存在全局的隊列中;處理器本地隊列是一個使用數(shù)組構(gòu)成的環(huán)形鏈表,它最多可以存儲 256 個待執(zhí)行任務(wù)。
G只能運行在M中,一個M必須持有一個P,M與P是1:1的關(guān)系。M會從P的本地隊列彈出一個可執(zhí)行狀態(tài)的G來執(zhí)行,如果P的本地隊列為空,就會想其他的MP組合偷取一個可執(zhí)行的G來執(zhí)行;
一個M調(diào)度G執(zhí)行的過程是一個循環(huán)機制;會一直從本地隊列或全局隊列中獲取G
上面說到P的個數(shù)默認(rèn)等于CPU核數(shù),每個M必須持有一個P才可以執(zhí)行G,一般情況下M的個數(shù)會略大于P的個數(shù),這多出來的M將會在G產(chǎn)生系統(tǒng)調(diào)用時發(fā)揮作用。類似線程池,Go也提供一個M的池子,需要時從池子中獲取,用完放回池子,不夠用時就再創(chuàng)建一個。
work-stealing調(diào)度算法:當(dāng)M執(zhí)行完了當(dāng)前P的本地隊列隊列里的所有G后,P也不會就這么在那躺尸啥都不干,它會先嘗試從全局隊列隊列尋找G來執(zhí)行,如果全局隊列為空,它會隨機挑選另外一個P,從它的隊列里中拿走一半的G到自己的隊列中執(zhí)行。
如果一切正常,調(diào)度器會以上述的那種方式順暢地運行,但這個世界沒這么美好,總有意外發(fā)生,以下分析goroutine在兩種例外情況下的行為。
Go runtime會在下面的goroutine被阻塞的情況下運行另外一個goroutine:
用戶態(tài)阻塞/喚醒
當(dāng)goroutine因為channel操作或者network I/O而阻塞時(實際上golang已經(jīng)用netpoller實現(xiàn)了goroutine網(wǎng)絡(luò)I/O阻塞不會導(dǎo)致M被阻塞,僅阻塞G,這里僅僅是舉個栗子),對應(yīng)的G會被放置到某個wait隊列(如channel的waitq),該G的狀態(tài)由_Gruning變?yōu)開Gwaitting,而M會跳過該G嘗試獲取并執(zhí)行下一個G,如果此時沒有可運行的G供M運行,那么M將解綁P,并進入sleep狀態(tài);當(dāng)阻塞的G被另一端的G2喚醒時(比如channel的可讀/寫通知),G被標(biāo)記為,嘗試加入G2所在P的runnext(runnext是線程下一個需要執(zhí)行的 Goroutine。), 然后再是P的本地隊列和全局隊列。
系統(tǒng)調(diào)用阻塞
當(dāng)M執(zhí)行某一個G時候如果發(fā)生了阻塞操作,M會阻塞,如果當(dāng)前有一些G在執(zhí)行,調(diào)度器會把這個線程M從P中摘除,然后再創(chuàng)建一個新的操作系統(tǒng)的線程(如果有空閑的線程可用就復(fù)用空閑線程)來服務(wù)于這個P。當(dāng)M系統(tǒng)調(diào)用結(jié)束時候,這個G會嘗試獲取一個空閑的P執(zhí)行,并放入到這個P的本地隊列。如果獲取不到P,那么這個線程M變成休眠狀態(tài), 加入到空閑線程中,然后這個G會被放入全局隊列中。
隊列輪轉(zhuǎn)
可見每個P維護著一個包含G的隊列,不考慮G進入系統(tǒng)調(diào)用或IO操作的情況下,P周期性的將G調(diào)度到M中執(zhí)行,執(zhí)行一小段時間,將上下文保存下來,然后將G放到隊列尾部,然后從隊列中重新取出一個G進行調(diào)度。
除了每個P維護的G隊列以外,還有一個全局的隊列,每個P會周期性地查看全局隊列中是否有G待運行并將其調(diào)度到M中執(zhí)行,全局隊列中G的來源,主要有從系統(tǒng)調(diào)用中恢復(fù)的G。之所以P會周期性地查看全局隊列,也是為了防止全局隊列中的G被餓死。
除了每個P維護的G隊列以外,還有一個全局的隊列,每個P會周期性地查看全局隊列中是否有G待運行并將其調(diào)度到M中執(zhí)行,全局隊列中G的來源,主要有從系統(tǒng)調(diào)用中恢復(fù)的G。之所以P會周期性地查看全局隊列,也是為了防止全局隊列中的G被餓死。
M0
M0是啟動程序后的編號為0的主線程,這個M對應(yīng)的實例會在全局變量rutime.m0中,不需要在heap上分配,M0負(fù)責(zé)執(zhí)行初始化操作和啟動第一個G,在之后M0就和其他的M一樣了
G0
G0是每次啟動一個M都會第一個創(chuàng)建的goroutine,G0僅用于負(fù)責(zé)調(diào)度G,G0不指向任何可執(zhí)行的函數(shù),每個M都會有一個自己的G0,在調(diào)度或系統(tǒng)調(diào)用時會使用G0的棧空間,全局變量的G0是M0的G0
一個G由于調(diào)度被中斷,此后如何恢復(fù)?
中斷的時候?qū)⒓拇嫫骼锏臈P畔?,保存到自己的G對象里面。當(dāng)再次輪到自己執(zhí)行時,將自己保存的棧信息復(fù)制到寄存器里面,這樣就接著上次之后運行了。
我這里只是根據(jù)自己的理解進行了簡單的介紹,想要詳細了解有關(guān)GMP的底層原理可以去看Go調(diào)度器 G-P-M 模型的設(shè)計者的文檔或直接看源碼
參考: ()
()
一、主動免殺1. 修改字符特征:主動查找可能的特征碼,包括木馬文件修改注冊表、生成新文件的名稱與路徑、注入的進程名等動作,也包括運行過程中可能出現(xiàn)或一定會出現(xiàn)的字符等文件特征。然后找出這些字符,并將其修改。2. 修改輸入表:查找此文件的輸入表函數(shù)名(API Name),并將其移位。3. 打亂文件結(jié)構(gòu):利用跳轉(zhuǎn)(JMP),打亂文件原有結(jié)構(gòu)。4. 修改入口點:將文件的入口點加1。5. 修改PE段:將PE段移動到空白位置二、被動免殺1. 修改特征碼:用一些工具找出特征碼并針對特征碼做免殺處理。2. 用Vmprotect:使用Vmprotect加密區(qū)段。3. 文件加殼:可以用一些比較生僻的殼對木馬文件進行保護。有的朋友看到這里有可能蒙了,PE、Vmprotect、入口點……這些都是什么意思?。坎灰?,下面我會一一介紹的,只要你看完這篇文章,就一定會成為免殺高手!怎么樣?Go!3.實戰(zhàn)演習(xí)1.)修改字符特征好,下面我們依然以一個病毒防御工作者的角度來考慮我們每一步應(yīng)該做什么,然后在利用逆向思維分而治之?,F(xiàn)在假如我們拿到一個木馬樣本灰鴿子,首先當(dāng)然要分析它究竟有什么功能,怎樣運行以及怎樣保護自己等。其實這一步要求的專業(yè)知識是很多的,但考慮到我們的讀者,我們暫且用一個比較簡單易行的方法——運行木馬AND查看此程序的幫助文檔。我們打開RegSnap,新建一個快照,打開RegSnap后,點擊[新建快照]按鈕(如圖1)。
在彈出的對話框中選擇[生成所有項目的快照](如圖2)。然后保存快照,現(xiàn)在已經(jīng)將RegSnap配置好了,下面運行我們的木馬程序(提醒:做免殺時,一定要記住養(yǎng)好隨時備分的好習(xí)慣,以防止修改錯誤或是實驗運行時破壞、刪除木馬)。木馬運行完畢后,我們在按照上面的方法重新做一個快照并保存,然后按快捷鍵F5,在彈出的“比較快照”對話框中選擇剛才保存的快照,在“第一個快照”中選擇我們剛才第一次保存的快照,而“第二個快照”選擇我們后保存的快照存檔,很快結(jié)果就出來了(如圖3)。
有的朋友對于使用RegSnap收集到的信息感到無力分析,抱怨收集到的東西太多,在這里我簡單的介紹一下,首先應(yīng)注意的是生成做對比的兩個快照之間的時間要盡可能短,另外要排除帶有OpenSaveMRU的注冊表鍵值,還要排除有關(guān)*.rsnp文件的創(chuàng)建讀寫等操作記錄。下面我們就將有用的信息提取出來,逐一分析。文件列表于 C:\WINDOWS\*.*新增文件木馬.exe注冊表報告新增主鍵HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache\C:\Documents and Settings\A1Pass-admin\桌面\huigezi\復(fù)件 Server02.exe鍵值: 字符串: "復(fù)件 Server02"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_*6728*9A6C*670D*52A1\0000\Class鍵值: 字符串: "LegacyDriver"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_*6728*9A6C*670D*52A1\0000\ClassGUID鍵值: 字符串: "{8ECC055D-047F-11D1-A537-0000F8753ED1}"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_*6728*9A6C*670D*52A1\0000\Control\ActiveService鍵值: 字符串: "木馬服務(wù)"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\木馬服務(wù)\Description鍵值: 字符串: "灰鴿子服務(wù)端程序。遠程監(jiān)控管理."……這里我只摘錄了部分關(guān)鍵性的木馬動作記錄,全部記錄請見光盤。通過文件列表我們可以知道木馬在WINDOW目錄下生成了一個新文件,而通過注冊表的監(jiān)控信息我們也知道了木馬是怎樣將自己注冊為系統(tǒng)服務(wù)并自動運行的。那么我們回到瑞星的研究分析室,看看那些大哥大姐們會怎么辦……瑞星大哥:“最近這灰鴿子太猖狂啦!我們是不是應(yīng)該多定義幾套特征碼?”瑞星大姐:“恩,不錯!先在注冊表那定義一套特征碼在說吧?!盇1Pass:“STOP??!”(只見畫面突然定格,A1Pass將播放器最小化。)通過上面的對話,我們可以知道他們要將注冊表的某個字符定義為特征碼,從上面RegSnap分析出來的記錄來看,他們的選擇真的是太多了!那么他們究竟會用到哪些呢?其實,就做為一個黑客來講,只要不影響服務(wù)端正常運行,就應(yīng)該盡量多的改掉木馬的所有字符,當(dāng)然全部改變是不可能的,除非你自己編寫木馬。有的朋友要問了,除了注冊表別的就不可以改了嗎?答案當(dāng)然是否定的,譬如生成新文件的名稱與路徑、注入的進程名等動作,這些我們可以利用WINDOWS對字母大小寫不敏感的這一特點直接替換字母的大小寫,而對于運行過程中可能出現(xiàn)或一定會出現(xiàn)的字符等我們可以直接將其替換成別的內(nèi)容。下面我為大家演示一下怎樣更改注入進程的名稱。首先配置服務(wù)端,通過圖4我們可以看出來灰鴿子的啟動運行是需要“IEXPLORE.EXE”這個進程的,根據(jù)注冊表的推理,我們可以認(rèn)為其未加殼的服務(wù)端是應(yīng)該存在“IEXPLORE.EXE”這一字符串的。既然如此,我們就先請出我們的第一把武器“WinHex”!
WinHex是一款極為出名16進制編輯器。得到 ZDNetSoftwareLibrary 五星級最高評價,擁有強大的系統(tǒng)效用。在這里,我們只用它來編輯文件,其余不做過多討論。首先我們用WinHex打開我們的木馬文件“Server.exe”,打開后如圖5所示。
然后我們按[Ctrl]+[F]快捷鍵調(diào)出查找文本對話框,輸入IEXPLORE.EXE后點擊“是”(如圖6)。
結(jié)果如圖7所示。下面我們就對其進行大小寫轉(zhuǎn)換,用鼠標(biāo)點擊要更改的字母(例如I),然后在按鍵盤上的i,即可完成更改,就象使用WINDOWS的記事本一樣。更改完畢后,按[Ctrl]+[S]快捷鍵保存即可。
就這么簡單?對!就這么簡單!其他的例如注冊表、生成新文件的名稱與路徑等等都可以利用此方法更改。但是不幸的是,經(jīng)過這樣改后,還不足以對付例如金山、江民等品牌殺毒軟件,要想對付這些殺毒軟件的查殺,我們還需要對我們的木馬進行進一步處理。下面,我們開始學(xué)習(xí)輸入表函數(shù)(APIName)免殺!2.)修改輸入表不知有的朋友是否知道,PE文件的正常運行是離不開其內(nèi)部輸入表函數(shù)的,而不同的程序,其內(nèi)部輸入表函數(shù)的名稱與在文件中的位置是不一樣的,所以輸入表函數(shù)也成了病毒防御工作者制作特征碼緊盯的地方之一。在我查出來的關(guān)于灰鴿子的特征碼來看,“瑞星大哥”已經(jīng)將其的一處輸入表函數(shù)作為特征碼了。所以掌握輸入表函數(shù)免殺技巧對于新入門的朋友來說勢在必行!
[PE文件小知識:PE文件是WINDOWS系統(tǒng)中特有的一種文件結(jié)構(gòu),它包括PE文件頭、輸入表與相關(guān)資源文件等等]經(jīng)過我的測試,直接單獨修改文件內(nèi)部的輸入表函數(shù)會導(dǎo)致程序運行不正常甚至崩潰!那就沒有辦法了嗎?我可沒那么容易認(rèn)輸!經(jīng)過一翻苦戰(zhàn),終于讓我在LordPE中找到了解決辦法,同時FoBnN的文章也給了我非常大的啟發(fā)……我們先打開LordPE,點擊[PE編輯器]按鈕,在彈出的對話框中選中木馬文件,打開后點擊[目錄](如圖8)。在點擊導(dǎo)入表后面的[…](如圖9)。在彈出的對話框中我們選擇wininet.dll下的InternetOpenUrlA(如圖10),有的朋友要問了,為什么非選擇InternetOpenUrlA這個輸入表函數(shù)呢?呵呵!那是因為這個輸入表里有特征碼哦,關(guān)于怎樣確定特征碼,我在后面會介紹,大家先別著急。
好的,關(guān)于LordPE就先停在這,下面我們就用WinHex來查找InternetOpenUrlA這個輸入表函數(shù)的所在位置,并將其用0填充(操作方法:單擊WinHex右面的16進制信息,輸入0即可)(如圖11、12)。
然后將其寫到空白區(qū)域(既顯示000000的區(qū)域),一定要從頭開始寫入,這樣在以后計算地址時不容易出錯,除此之外也要注意輸入表函數(shù)的大小寫不要搞錯(如圖13)。保存后我們在回到LordPE那里,在需要更改的InternetOpenUrlA輸入表函數(shù)上單擊右鍵,在彈出的菜單里選擇“編輯”,將Thunk里的信息改成000B9D5E(如圖14)即可。有的朋友要問了,剛才我們不是把那個輸入表函數(shù)放到000B9D60那里了嗎?到這怎么變成000B9D5E了?其實原理很簡單,因為每個輸入表函數(shù)前面都是有一個空格的,我們雖不用真正把那個空格加進去,但填寫它的地址時一定要空出來,否則就會出錯!而將000B9D60減去一個空格所占的位置,其地址正好為000B9D5E,還不十分明白的朋友在仔細看看圖13,下面我們在回到LordPE,看看我們改過的輸入表函數(shù)變成什么樣了(如圖15)?呵呵!那我們該怎么辦呢?其實簡單的很,只要在重新改一下輸入表函數(shù)的名稱就可以了(如圖16)。有的時候因為我們所填寫的地址為比較靠后的,例如我們現(xiàn)在改的這個000B9D5E,后面僅能容納兩個字節(jié),所以更改輸入表函數(shù)時只能鍵入兩個字,對于這種情況我們可以先把Thunk里的信息改成如000B9D60這樣的起始地址,改輸入表函數(shù)名更改完畢后在將000B9D60改回原來的值(既000B9D5E),保存后即可成功,我們試一下看看(如圖17)。經(jīng)測驗鴿子的各項功能均正常!在用瑞星查一下試試(如圖18),結(jié)果當(dāng)然不言而喻……
3.)修改特征碼雖然到這我們免殺已經(jīng)成功,但是為了學(xué)到更多的技術(shù),為了讓我們免殺的鴿子存活的更久,下面我在為大家介紹一下特征碼的查找與修改技巧。特征碼是殺毒軟件的心臟,但同樣也是我們的心臟!就看誰先找到對方地心臟,并能發(fā)出致命一擊,誰就是勝利者!一提到查找特征碼,就不得不說說MyCCL與CCL,這兩個軟件的名字相信留心過免殺技術(shù)的朋友不會陌生,但由于軟件操作的傻瓜化,很多時候?qū)τ贑CL的介紹只是一帶而過,這可苦了入門的朋友!這一小節(jié)我就先介紹一下MyCCL的用法……我們先來認(rèn)識一下MyCCL(如圖19),根據(jù)這張圖我們下面就來大體介紹一下MyCCL的應(yīng)用方法。首先點擊第1處選擇文件,然后在第2處輸入分塊個數(shù),分塊個數(shù)越多,定位越精確,然而生成的速度同時也就越慢,生成的文件總體積也就越大,就象灰鴿子這么大的服務(wù)端,如果分塊數(shù)為300的話,那么它生成文件的總體積將超過230M!所以在這里不建議填寫太大的數(shù)字,一般象灰鴿子這樣的服務(wù)端分塊數(shù)填400個就足夠了。生成完畢后會彈出個對話框提醒你去相應(yīng)目錄殺毒,圖中所示為“E:\文章\極度免殺\鴿子\OUTPUT”文件夾,我們到那個文件夾下開始殺毒,查到病毒就讓殺毒軟件將其徹底刪除,注意,這一點很重要!處理完畢后點擊第3處的二次處理,在點擊[生成]上面的[特征區(qū)間]按鈕即可出現(xiàn)右面的對話框。下面我們在“區(qū)間設(shè)定”里右鍵單擊特征碼區(qū)間,在彈出的菜單中選擇“復(fù)合精確定位此處特征”(如圖20),然后重復(fù)上面的操作,直到你認(rèn)為[單位長度]已經(jīng)小到很方便更改的時候,特征碼的定位就算結(jié)束了。好了,一口氣說了這么多,不知道剛?cè)腴T的朋友是否懂得一些MyCCL的用法了沒有……但是上面我們定位的是文件特征碼,還有內(nèi)存特征碼沒有定義,這里我們要用到CCL的內(nèi)存特征碼定位功能,打開CCL后,我們依次選擇[文件]→[特征碼驗測]→[內(nèi)存特征碼](如圖21)。
在彈出的對話框中選擇我們要進行免殺操作的木馬,然后會進入“定位范圍選擇窗口”(如圖22)。由圖中可知,第一個CODE段的偏移量為00000400,也就是說我們可以用00000400做為起始位置,那么我么就在用戶輸入?yún)^(qū)的“起始位置”處填寫00000400,下面的那個驗測大小怎么填寫呢?看到圖22中畫線的那個“當(dāng)前文件大小”了嗎?我們可以用WINDOWS系統(tǒng)自帶的計算器進行計算,把計算器的“查看”菜單設(shè)置為科學(xué)型、十六進制、四字(如圖23)。然后用當(dāng)前文件大小的值減去起始值00000400,得到的結(jié)果為000B9A00,那么我們就在“驗測大小”后填上000B9A00,然后點擊“填加區(qū)段”按鈕(如圖24)。最后點擊確定,在新彈出的對話框中點擊運行,不過需要注意的是,在進行此步操作時一定要打開殺毒軟件的所有功能。下面你要做的就是等待……然而光找特征碼是不夠的,我們還得學(xué)會怎樣更改,而關(guān)于特征碼地更改是非常有學(xué)問的!這里為了方便廣大讀者能學(xué)以致用,在此我只介紹部分理論知識,著重介紹實踐操作,但是我想請大家注意,免殺的方法象你做完免殺的木馬一樣,都有生存時間,而過了這個時間,這種免殺方法就變的不在實用,或者免殺效果大打折扣!所以要想真正成為免殺高手,還的打牢基本功,不斷創(chuàng)造出新的免殺方法,因為我們是在與殺毒軟件廠商的專業(yè)技術(shù)人員“斗法”啊!關(guān)于需要注意的問題就先講的這,下面我?guī)Т蠹蚁葋砹私庖幌履壳案奶卣鞔a的辦法。1. 大小寫替換(只適用于文件免殺)適 用 于:出現(xiàn)可識別的英文字母或詞組,并且確定其不是相關(guān)函數(shù)(如輸入表函數(shù))。操作方法:如咱們“實戰(zhàn)演習(xí)”的第一節(jié)講的一樣,只須將大小寫替換一下就可以了,例如特征碼中出現(xiàn)了A,你只要將其替換為a即可。原 理:利用WINDOWS系統(tǒng)對大小寫不敏感,而殺毒軟件卻對大小寫非常敏感這一特性達到免殺目的。2. 用00填充適 用 于:幾乎任何情況,但成功率不是非常高。操作方法:例如我們找到了一處特征碼0009EE7F_00000005,那么根據(jù)這段特征碼信息我們可以知道它的位置在0009EE7F,大小為5個字節(jié),也就是0009EE7F-0009EE83這一段內(nèi)容(如圖25)。
一直跟著文章實踐操作的朋友肯定有疑問,你是怎么找到那個地址的呢?而我怎么找不到呢?那是因為WinHex的默認(rèn)偏移量為decimal模式,我們單擊Offset欄將其改為16進制模式即可(如圖26)。
然后我們有選擇的一處處地用00填充(如圖27)。記住要多試幾次,80%的情況下你都能找到一處既能免殺又不影響程序正常運行的區(qū)域。對于定義出的內(nèi)存特征碼,只要將其內(nèi)存地址用一個叫做《便宜量轉(zhuǎn)換器》的小程序轉(zhuǎn)換成16進制偏移量,然后在進行相應(yīng)操作即可。原 理:由于PE文件的特殊格式以及程序編譯語言等問題,使得生成目標(biāo)代碼的效率并不高,難免出現(xiàn)一些“垃圾信息”,而這些信息存在與否對與程序是否能正常運行并不起決定性的作用,而當(dāng)木馬的這部分“垃圾信息”被定義為特征碼時,我們完全可以將其刪除,而刪除的方法就是用無任何意義的00將其替換。3. 跳到空白區(qū)域適 用 于:幾乎任何情況,成功率比較高。操作方法:還是以特征碼0009EE7F_00000005為例子,假如我們使用00填充的方法失敗了那么不要多想,接下來馬上試試OllyDbg,關(guān)于OllyDbg我就不多介紹了,它是非常棒而且非常專業(yè)的一個動態(tài)反匯編/調(diào)試工具,這里我們只用它來幫助我們進行免殺作業(yè),首先應(yīng)該做的就是將我們的16進制偏移量0009EE7F轉(zhuǎn)換為內(nèi)存地址,因為OllyDbg的工作原理是先將程序釋放到內(nèi)存空間里,然后才能進行相關(guān)作業(yè)…這里要用到的是一個叫做《便宜量轉(zhuǎn)換器》的小程序,我們用其轉(zhuǎn)換完畢后得到的內(nèi)存地址為0049FA7F(如圖28)。
下面我們用OllyDbg打開我們的木馬服務(wù)端,首先找到一處空白區(qū),并域記下這的地址004A24A5,然后找到我們剛轉(zhuǎn)換過來的地址0049FA7F,先將以0049FA7F開始以下的這三行數(shù)據(jù)選定,然后單擊右鍵選則[復(fù)制]→[到接剪貼板](如圖29)。將其復(fù)制到本文文檔里備用,然后在將這三行代碼一一NOP掉(如圖30)。最后右鍵點擊0049FA7F,在彈出的對話框中選擇匯編,并寫入“jmp 004A24A5”這條匯編指令(如圖31)。記住,在點擊[匯編]按鈕之前一定先把“使用 NOP 填充”前面的勾去掉。然后我們記下匯編后0049FA7F的下面那個地址0049FA84(仔細觀察圖31)。好,下面我們回到004A24A5這處剛才找到的空白地址(如圖32)。
然后用剛才匯編的方法把在本文文檔里備用的信息一句句地匯編進去,然后在將最后一句代碼的下一行004A24AA處加入“jmp 0049FA84”這行代碼(如圖33)。然后單擊右鍵→[復(fù)制到可執(zhí)行文件]→[所有修改](如圖34)。
在彈出的對話框中選擇“全部復(fù)制”然后保存即可。而對于內(nèi)存免殺就省去了內(nèi)存地址轉(zhuǎn)換這一步了。原 理:大家先看圖35,由圖中可知,正象此方法的名字“跳到空白區(qū)域”一樣,這種方法的原理就是將原本含有特征碼的信息轉(zhuǎn)移到空白區(qū)域,并把原先位置的信息全部NOP掉,并在那里加一個跳轉(zhuǎn)指令,讓其跳到004A24A5處,也就是我們找到的空白區(qū)域,并把原來在0049FA84的信息移到這里,加完信息后在加一條指令讓其在跳回去,以使程序連貫起來。
4. 上下互換適 用 于:幾乎任何情況,成功率比較高。操作方法:先用OllyDbg載入木馬程序,假定其特征碼為0009EE7F_00000005,我們還是先用《偏移量轉(zhuǎn)換器》將其轉(zhuǎn)換為內(nèi)存地址,上面我們已經(jīng)知道0009EE7F對應(yīng)的內(nèi)存地址為0049FA7F,然后在OllyDbg中找到相應(yīng)位置,利用上面“跳到空白區(qū)域”里介紹的修改方法將0049FA7F上下兩句代碼調(diào)換位置即可。而對于內(nèi)存免殺就省去了內(nèi)存地址轉(zhuǎn)換這一步了。原 理:殺毒軟件的特征碼定位是嚴(yán)格按照相關(guān)偏移量于內(nèi)存地址進行的,而其實我們的應(yīng)用程序中的機器碼執(zhí)行順序的先后在一般情況下是沒有死規(guī)定的,所以我們只需將其上下互換,殺毒軟件自然就不認(rèn)識了。5.ADD與SUB 互換適 用 于:在內(nèi)存特征碼中出現(xiàn)ADD或 SUB指令的,成功率比較高。操作方法:用OllyDbg載入木馬程序,假定其特征碼所對應(yīng)的地址中有ADD或SUB指令,例如00018A88:XXXXX 00000088 ADD ECX 10000000我們可以將ADD ECX 10000000這段機器碼改為SUB ECX F0000000,更改完畢后保存為EXE文件即可。原 理:我們都知道1+1=2,我們也知道1-(-1)=2,上面就是利用了這個原理,其中ADD指令的就是加意思,而SUB則是減的意思。雖然被我們互換了一下,但是最終結(jié)果還是一樣的,可是換完之后殺毒軟件就不認(rèn)識了。到這里,關(guān)于特征碼的查找與修改就講完了,但是除此之外呢?答案是還有許多!!下面我們就一起看看其他免殺方法。4.)其他免殺方法改文件頭:這里所說的改文件頭包括加頭去頭,文件加花。關(guān)于加頭去頭,我們還是用OllyDbg。用OllyDbg載入后,OllyDbg會自動停在入口點(如圖36)。
我們將頭三行機器碼復(fù)制保存起來,然后找到空白區(qū)域,用匯編的方法一一將其寫入(如圖37)。然后在后面寫入一條JMP指令,讓其跳到初始入口點的第四行,相信一直仔細看本文的朋友一定明白其原理,如果忘了的話可以看上面修改特征碼的第三種方法,原理與這差不多,修改完畢后如下所示:004A2A73 0000 add byte ptr ds:[eax],al004A2A75 0000 add byte ptr ds:[eax],al004A2A77 55 push ebp004A2A78 8BEC mov ebp,esp004A2A7A B9 04000000 mov ecx,4004A2A7F ^ E9 CCF3FFFF jmp Server.004A1E50004A2A84 0000 add byte ptr ds:[eax],al004A2A86 0000 add byte ptr ds:[eax],al004A2A88 0000 add byte ptr ds:[eax],al
上面的add byte ptr ds:[eax],al就是所謂的空白區(qū)域,我們看到改完后的頭文件位于004A2A77,所以我們還要用PEditor改一下入口點,打開PEditor后載入文件,將入口點處的地址改為我們的新文件頭地址004A2A77(如圖38),保存后即可。